#求一族数中最大值的汇编程序
#找到最大值后,并把它作为程序的退出状态
#
#
#
.section .data
data_items: #these are the data items
.long 3,67,34,222,45,75,54,34,0
#.long 指示声明一族数,每个数占32 位,相当于C语言的数组
#这个数组开头定义了一个符号data_items,汇编器会把数组的首地址作为data_items符号所代表的地址
#data_items类型于C语言的数组名
#data_items这个符号没有globl声明,因为它只有在这个汇编程序内部使用,链接器不需要用到这个名字
#技巧:data_items数组最后一个数是0,我们在一个循环中依次比较每个数,碰到0循环中止
.section .text # 不是code
.globl _start
_start:
movl $0,%edi #初识化edi,指向数组的第0个元素
movl data_items(,%edi,4),%eax #比较intel写法:data_items[edi+4]
# 这条指令把数组的第0个传送到eax寄存器中
#data_items是数组的首地址,edi的值是数组的下标,4表示数组的每个元素占4个字节
#那么数组中第edi个元素的地址应该是data_item+ediX4
movl %eax,%ebx #刚开始时,将数组的第0个元素作为最大值
start_loop:
cmpl $0,%eax #cmpl指令将两个操作数相减,不保存结果,改变eflags寄存器的标志位
je start_loop #检测是否到数组末尾
incl %edi
movl data_items(,%edi,4),%eax #将数组的下一个元素传送到eax中
cmpl %ebx,%eax
jle start_loop #然后跳转到循环开头比较下一个数
loop_exit:
#这样,结果存在%ebx中作为程序的退出状态
movl $1,%eax
int $0x80 #系统调用,退出程序
#除了.long之外,常用的数据声明还有.byte(8位) .ascii例如.ascii"Hello world",取值为相应的ASCII码。注意和C 语言不同的是这样声明的字符串末尾没有‘\n’字符的。
大多数的系统调用完成之后,会返回用户空间继续执行后面的指令,而_exit系统调用比较特殊,它会终止当前进程,而不是返回用户空间继续执行。
笔记摘自《Linux C 编程 一站式学习》.宋劲杉 编著