您好,欢迎来到 - 67学习网 - http://www.67xuexi.com !

Linux下的AT&T语法

摘要:.byte,也是声明一组数,每个数占8位.ascii,例如.ascii "Hello world",声明了11个数,取值为相应字符的ASCII码。注意,和C语言不同,这样声明的字符串末尾是没有''字符的,如果需要以''结尾可以声明为.ascii "Hello world"。data_items数组的最后一个数是0,我们在一个循环中依次比较每个数,碰到0的时候让循环终止。在这个循环中:edi寄存器保存数组中的当前位置,每次比较完一个数就把edi的值加1,指向数组中的下一个数。ebx寄存器保存到目前为止找到的最大值,如果发现有更大的数就更新ebx的值。eax寄存器保存当前要比较的数,每次更新edi之后,就把下一个数读到eax中。_start:movl $0, %edi初始化edi,指向数组的第0个元素。movl data_items(,%edi,4), %eax这条指令把数组的第0个元素传送到eax寄存器中。data_items是数组的首地址,edi的值是数组的下标,4表示数组的每个元素占4字节
Linux下的AT&T语法,标签:服务器,操作系统教程大全,http://www.67xuexi.com

  .byte,也是声明一组数,每个数占8位

  .ascii,例如.ascii "Hello world",声明了11个数,取值为相应字符的ASCII码。注意,和C语言不同,这样声明的字符串末尾是没有''字符的,如果需要以''结尾可以声明为.ascii "Hello world"。

  data_items数组的最后一个数是0,我们在一个循环中依次比较每个数,碰到0的时候让循环终止。在这个循环中:

  edi寄存器保存数组中的当前位置,每次比较完一个数就把edi的值加1,指向数组中的下一个数。

  ebx寄存器保存到目前为止找到的最大值,如果发现有更大的数就更新ebx的值。

  eax寄存器保存当前要比较的数,每次更新edi之后,就把下一个数读到eax中。

  _start:

  movl $0, %edi

  初始化edi,指向数组的第0个元素。

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

  这条指令把数组的第0个元素传送到eax寄存器中。data_items是数组的首地址,edi的值是数组的下标,4表示数组的每个元素占4字节,那么数组中第edi个元素的地址应该是data_items + edi * 4,从这个地址读数据,写成指令就是上面那样,这种地址的表示方式在下一节还会详细解释。

  movl %eax, %ebx

  ebx的初始值也是数组的第0个元素。下面我们进入一个循环,在循环的开头用标号start_loop表示,循环的末尾之后用标号loop_exit表示。

  start_loop:

  cmpl $0, %eax

  je loop_exit

  比较eax的值是不是0,如果是0就说明到达数组末尾了,就要跳出循环。cmpl指令将两个操作数相减,但计算结果并不保存,只是根据计算结果改变eflags寄存器中的标志位。如果两个操作数相等,则计算结果为0,eflags中的ZF位置1。je是一个条件跳转指令,它检查eflags中的ZF位,ZF位为1则发生跳转,ZF位为0则不跳转,继续执行下一条指令。可见条件跳转指令和比较指令是配合使用的,前者改变标志位,后者根据标志位做判断,如果参与比较的两数相等则跳转,je的e就表示equal。

  incl %edi

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

  将edi的值加1,把数组中的下一个数传送到eax寄存器中。

  cmpl %ebx, %eax

  jle start_loop

  把当前数组元素eax和目前为止找到的最大值ebx做比较,如果前者小于等于后者,则最大值没有变,跳转到循环开头比较下一个数,否则继续执行下一条指令。jle也是一个条件跳转指令,le表示less than or equal。

  movl %eax, %ebx

  jmp start_loop

  更新了最大值ebx然后跳转到循环开头比较下一个数。jmp是一个无条件跳转指令,什么条件也不判断,直接跳转。loop_exit标号后面的指令用exit系统调用退出程序。

上一页  [1] [2] [3] 


Tag:服务器_操作系统教程服务器,操作系统教程大全电脑教程 - 服务器_操作系统教程