A&T汇编的简单学习

注意

  1. 立即操作数(也就是常量)前面要加上$
  2. 寄存器操作数前面要加上字符百分号%
  3. 源和目的操作数是从左到右的顺序
  4. 寄存器前面加上(%eax),代表对eax的内容进行取值操作

指令

  1. mov

    该指令作用为移动数据,因为汇编指令要求,不能内存和内存直接操作,需要通过寄存器作为桥梁来实现数据移动

    movl mov long : 字长传送 : 32位

    movw mov word:字传送 :16位

    movb mov byte:字节传送 :8位

    例子

    1. 把内存地址var处内容放入寄存器%eax中,注意下面中其实对var进行了取地址值的操作

      movl var, %eax

    2. 把var的值放入寄存器%%eax中

      movl $var, %eax

    3. 把array + %esi确定的内存地址处的内容放入%eax中

      movl array(%esi), %eax

      注意上面array可以是数值 8 -8等,也就是对esi的值 + array,对相加和进行地址取值操作

    4. 把寄存器 esp保存的内容给寄存器ebp

      movl %esp,%ebp

  2. sub

    目的操作数减去源操作数,结果赋值给目的操作数

    例子

    1. esp寄存器的值进行减去8操作

      subl $8, %esp

      也就是 %esp = %esp - 8

  3. add

    目的操作数加上源操作数,和的结果赋值给目的操作数

    例子

    1. esp寄存器的值进行加8操作

      addl $8, %esp

      也就是 %esp = %esp + 8

  4. push

    该指令多用于栈操作中,将数据推入栈中。本质的操作等价于esp寄存器的值减少,然后对esp地址指向的位置赋值

    例子

    1. 把寄存器ebp的内容推入栈中

      pushl %ebp

      等价于

      subl $4, %esp

      movl %ebp, (%esp)

  5. pop

    该指令多用于栈操作中,将数据从栈中弹出到指定位置。本质的操作等价于先esp地址指向的位置赋值给指定位置,然后esp寄存器增加

    例子

    1. 把栈顶内容进行取值操作给寄存器ebp,并弹出

      popl %ebp

      等价于

      movl (%esp),%ebp

      addl $4, %esp

  6. leal

    官话加载有效地址,目的操作数必须是寄存器,个人理解和mov最大的区别就是leal不进行地址取值

    1. 把array + %esi的结果放入%eax中,注意无论结果是什么直接放入eax中,不进行地址取值

      lealarray(%esi), %eax

      注意上面array可以是数值 8 -8等,也就是对esi的值 + array,对相加和进行赋值

    2. eax+ecx的值装入edx

      leal (%eax, %ecx), %edx

    3. eax + 2*ecx+ 9的值装入edx

      leal 9(%eax, %ecx, 2), %edx

  7. leave

    指令作用为恢复ebp esp寄存器的值

    本质上就是:

    movl %ebp, %esp

    popl %ebp

  8. call

    函数调用指令

    把返回地址压入栈中并跳转到被调用函数处开始执行

  9. ret

    代表函数调用结束的返回

    弹出栈顶处地址的内容的值,并跳转到这个值也就是返回地址处开始继续执行程序

posted @ 2020-12-16 22:45  make_wheels  阅读(206)  评论(0编辑  收藏  举报