下面的程序出自 <<Linux C编程一站式学习>>,已打上注释
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0 #.long指示表明一组数,每个数占32位,相当于C语言的数组。这个数组开头定义了一个符号data_items,汇编器会把数组的首地址作为data_items符号所代表的地址。
#除了.long之外,常用的数据声明还有:.byte,也是声明一组数,每个数占8位
#.ascii,例如.ascii"hello world",声明11个数,取值为相应字符的ascii字符。和c语言不同,这样声明的字符串末尾是没有‘\0’字符的,如果需要以'\0'结尾可以声明为.ascii "hello world\0"
.section .text
.globl _start
_start:
movl $0, %edi #初始化edi为0,edi用来记录数组的下标
movl data_items(,%edi,4), %eax #作用:将数组的第0个元素传送到eax寄存器中。data_item是数组首地址,edi的值是数组的下标,4表示数组的每个元素占4字节
movl %eax, %ebx
start_loop:
cmpl $0, %eax #作用:将两个操作数相减,但是计算结果并没有保存,只是根据结果改变eflags寄存器中的标志位。如果两数相等则计算结果为0,eflags中的ZF位1。
je loop_exit #作用:检查eflags中的ZF位,ZF位为1(cmpl的计算结果为0)则发生跳转,ZF位为0则不跳转,继续执行下一条指令。可以理解为“jump if equal”
incl %edi #作用:将edi的值加1
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop #作用:表示“jump if less than or equal”
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80 #无条件跳转