寄存器(2)汇编常用指令/寄存器
1. 传送指令(4): mov push pop lea
1.1 mov 数据传送指令 a=b
1.2 push 堆栈操作指令 压栈
1.3 pop 出栈
1.4 lea 有效地址传送指令
1.1 lea 指令(传地址)
lea load effective address LEA指令的功能是取偏移地址,指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数, 类似, C语言中的”&”.
它的指令形式是从存储器读数据到寄存器,但实际上它根本就没有引用存储器。
他只是取地址但是并没有取地址对应的值。
lea指令只有一个周期,某些编译器会使用lea来优化加法等操作
1.2 mov 和 lea 的区别
mov是将数据从源操作传到目的操作数中
lea是将源操作数的地址传到目的操作数中
一个是数据,一个是地址
LEA指令的功能是取偏移地址,MOV指令的功能是传送数据
示例1:
leal 18(%eax),%ebx
movl 18(%eax) ,%ebx
这样,两条指令,传送的值是不一样的
leal 是传送 18+%eal(值)到 寄存器%ebx
movl 是传送的是在主存中以18+%eax为地址的存储序列里面存的值到%ebx。
示例2:
leal 6(%eax), %edx //把eax的值+6放入edx中。
leal (%eax, %ecx), %edx //把eax+ecx的值装入edx中。
leal (%eax, %ecx, 4), %edx //把eax + 4*ecx的值装入edx中。
leal 7(%eax, %eax, 8), %edx //把9*eax +7的值装入edx中。
leal 0xA(,%eax,4), %edx //把4*eax + 10的值装入edx中。
leal 9(%eax, %ecx, 2), %edx //把eax + 2*ecx+ 9的值装入edx中。
2. 转移指令(8):call jmp je jne jb jnb ja jna
2.1 call 过程调用指令
2.2 jmp 无条件转移指令
2.3 je 条件转移指令
2.4 jne 条件转移指令
2.5 jb 条件转移指令
2.6 jnb 条件转移指令
2.7 ja 条件转移指令
2.8 jna 条件转移指令
3. 运算指令(7):add sub mul div adc sbb cmp
3.1 add 加法指令
3.2 sub 减法指令 sub a,b -> a=a-b
3.3 mul 无符号数乘法指令
3.4 div 无符号除法指令
3.5 cmp 比较指令 cmp a,b 判断两个寄存器的值是否相等
4. 处理机控制指令(1):nop
4.1 nop 空操作指令
5. 32位机汇编指令:movl、subl、addl、pushl、popl、call、leave、ret
movl %ebp, %esp 将ebp中内容放置到esp中。
subl $4, %esp 寄存器esp值减少4。
addl $1, %eax 寄存器eax中值增加1。
popl %ebp 栈顶内容保存到ebp中,之后esp寄存器数值加4。
pushl %ebp 将ebp中内容入栈,之后esp寄存器值减4。
call f 先将eip指向地址入栈(call f 下一条指令位置),之后eip指向f地址位置。
pushl %eip
movl f , %eip
leave 将ebp中的内容移动到esp中去,之后出栈内容到ebp中。
movl %ebp, %esp
popl %ebp
ret 出栈内容到eip中。
popl %eip
参考: 汇编语言之常见的汇编指令
https://wenku.baidu.com/view/8ada1771846a561252d380eb6294dd88d1d23dc7.html?re=view
https://chenyu.blog.csdn.net/article/details/53011181
https://baijiahao.baidu.com/s?id=1669091385513843860&wfr=spider&for=pc