杂记之Linux汇编语言(AT&T语法)(二)

#求一族数中最大值的汇编程序

#找到最大值后,并把它作为程序的退出状态

#

#

#

.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 编程 一站式学习》.宋劲杉  编著

你可能感兴趣的:(汇编)