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寄存器中,这样不断循环,知道最后一个数。
补充:综合编程 , 其他综合 ,