当前位置:编程学习 > 网站相关 >>

Linux下汇编学习-2

 

第二个程序

在一组数据中查找最大数,先看程序

.section .data

data_items:

.long 3, 67, 34, 222, 45, 75, 54, 34, 44, 33, 22, 11, 66, 0

.section .text

.globl _start

_start:

movl $0, %edi

movl data_items(, %edi, 4), %eax

movl %eax, %ebx

 

start_loop:

cmpl $0, %eax

je loop_exit

incl %edi

movl data_items(, %edi, 4), %eax

cmpl %ebx, %eax

jle start_loop

 

movl %eax, %ebx

jmp start_loop

 

loop_exit:

movl $1, %eax

int $0x80

分析这个程序

先看数据段中,我们有个符号data_items,然后使用.long命令去定义了一组数据,同c语言一样,我们可以理解这就是数据类型,类似的数据类型还有.byte, .short, .int, .float, .double, .ascii等。然后给edi寄存器赋值0,同时我们通过这样一条语句movldata_items(, %edi, 4), %eax,这个什么意思呢,表示将数据列表中的第一个值3赋给eax寄存器。

接下来我们定义了一个符号start_loop:,然后做了一个判断,判断eax寄存器值是否为0

cmpl $0, %eax

je loop_exit www.zzzyk.com

我们知道cmpl指令是将两个数做减法操作,但不保存最终的结果,只是对标志寄存器eflags有影响,如果eax寄存器值等于0,那么跳转到loop_exit符号处,类似的跳转指令还有jg, jge, jl, jle, jmp等。然后使用incl指令对edi寄存器值加1操作,获取数据列表中数据到寄存器eax中,然后比较eax寄存器和ebx寄存器中值大小,然后不断循环。

总结出这个程序的思路,先假设第一个数为最大值并保存到ebx寄存器中,然后取出一个数同这个数比较,如果大于,则将这个数作为最大数,并保存到ebx寄存器中,这样不断循环,知道最后一个数。

 


摘自 mcgrady_tracy的专栏
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,