Linux汇编指令
一、Linux汇编指令
1、数据传输指令
1.1、mov指令
指令 | 功能 |
---|---|
movl %ebx, %eax | 将寄存器ebx中的值送入寄存器eax中 |
1.2、push指令
指令功能:将一个值推入堆栈,指令首先减少 rsp的值,再将源操作数复制到堆栈。操作数是 16 位的,则 rsp 减 2,操作数是 32 位的,则 rsp 减 4
指令 | 功能 |
---|---|
pushl %rbp | 等价于:(1)subl $4, %rsp (2)movl %rbp (%rsp) |
1.3、pop指令
指令功能:pop指令首先把ESP指向的堆栈元素复制到一个16位或32位目的操作数中,再增加ESP的值。如果操作数是16位,ESP加2;如果操作数是32位、ESP加4
指令 | 功能 |
---|---|
popl %ebp | 等价于:(1)movl (%esp), %ebp (2)addl $4, %esp |
1.4、lea指令
取有效地址指令LEA(Load Effective Address),把一个内存变量的有效地址送给指定的寄存器,相当于C语言中的“&。下面有一个具体的实例,如下:先定义了一个int类型的变量,然后取这个变量的地址,对应的指令是:lea -0xc(%rbp),%rax
#include <stdio.h>void main()
{int a = 20;int *p = &a;printf("a=%d", *p);
}
2、算术运算指令
2.1、add指令
指令功能:将长度相同的源操作数与目标操作数进行加操作,并把结果保存到目标操作数
指令 | 功能 |
---|---|
addl %eax,%edx | 将%edx+%eax的结果存放进寄存器edx中 |
2.2、sub指令
指令功能:从目标操作数中减去源操作数,并把最终的结果保存到目标操作数
指令 | 功能 |
---|---|
subl %eax,%edx | 将%edx-%eax的结果存放进寄存器edx中 |
3、转移控制指令
3.1、leave指令
指令功能:结束一个函数调用的堆栈帧,就是恢复函数调用者对应的堆栈
指令 | 功能 |
---|---|
leave | leave指令等价于下面的指令:(1)movl %ebp, %esp (2)popl %ebp |
3.2、ret指令
指令功能:将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序
指令 | 功能 |
---|---|
ret | ret指令等价于下面的指令:popl %eip |
3.3、call指令
指令功能:首先是将返回地址(也就是call指令要执行时EIP的值)压入栈顶,然后是将程序跳转到当前调用的方法的起始地址
指令 | 功能 |
---|---|
call | call指令等价于下面的指令:(1) pushl %eip(2)movl func,%eip |