A&T汇编的简单学习
注意
- 立即操作数(也就是常量)前面要加上$
- 寄存器操作数前面要加上字符百分号%
- 源和目的操作数是从左到右的顺序
- 寄存器前面加上(%eax),代表对eax的内容进行取值操作
指令
-
mov
该指令作用为移动数据,因为汇编指令要求,不能内存和内存直接操作,需要通过寄存器作为桥梁来实现数据移动
movl mov long : 字长传送 : 32位
movw mov word:字传送 :16位
movb mov byte:字节传送 :8位
例子
-
把内存地址var处内容放入寄存器%eax中,注意下面中其实对var进行了取地址值的操作
movl var, %eax
-
把var的值放入寄存器%%eax中
movl $var, %eax
-
把array + %esi确定的内存地址处的内容放入%eax中
movl array(%esi), %eax
注意上面array可以是数值 8 -8等,也就是对esi的值 + array,对相加和进行地址取值操作
-
把寄存器 esp保存的内容给寄存器ebp
movl %esp,%ebp
-
-
sub
目的操作数减去源操作数,结果赋值给目的操作数
例子
-
esp寄存器的值进行减去8操作
subl $8, %esp
也就是 %esp = %esp - 8
-
-
add
目的操作数加上源操作数,和的结果赋值给目的操作数
例子
-
esp寄存器的值进行加8操作
addl $8, %esp
也就是 %esp = %esp + 8
-
-
push
该指令多用于栈操作中,将数据推入栈中。本质的操作等价于esp寄存器的值减少,然后对esp地址指向的位置赋值
例子
-
把寄存器ebp的内容推入栈中
pushl %ebp
等价于
subl $4, %esp
movl %ebp, (%esp)
-
-
pop
该指令多用于栈操作中,将数据从栈中弹出到指定位置。本质的操作等价于先esp地址指向的位置赋值给指定位置,然后esp寄存器增加
例子
-
把栈顶内容进行取值操作给寄存器ebp,并弹出
popl %ebp
等价于
movl (%esp),%ebp
addl $4, %esp
-
-
leal
官话加载有效地址,目的操作数必须是寄存器,个人理解和mov最大的区别就是leal不进行地址取值
-
把array + %esi的结果放入%eax中,注意无论结果是什么直接放入eax中,不进行地址取值
lealarray(%esi), %eax
注意上面array可以是数值 8 -8等,也就是对esi的值 + array,对相加和进行赋值
-
把eax+ecx的值装入edx中
leal (%eax, %ecx), %edx
-
把eax + 2*ecx+ 9的值装入edx中
leal 9(%eax, %ecx, 2), %edx
-
-
leave
指令作用为恢复ebp esp寄存器的值
本质上就是:
movl %ebp, %esp
popl %ebp
-
call
函数调用指令
把返回地址压入栈中并跳转到被调用函数处开始执行
-
ret
代表函数调用结束的返回
弹出栈顶处地址的内容的值,并跳转到这个值也就是返回地址处开始继续执行程序