汇编基础
1. 几个重要的寄存器
寄存器 | |
---|---|
EIP | Instruction Pointer,存储CPU要执行的下一条指令,自动加1,程序员不能修改EIP的值,但是可以被CALL、RET、JUMP、conditional JUMP指令修改 |
EAX | 累加寄存器,通常存储临时变量值或者函数的返回值 |
EBX | 基地址寄存器 |
EDX | 数据寄存器 |
EBP | 堆栈基地址,指向栈底 |
ESP | 堆栈顶指针,指向栈顶 |
注:寄存器前面加E的是表示32位系统寄存器,不加E的是16位系统寄存器。
2. 寻址方式
movl %eax,%edx //edx = eax 寄存器寻址
movl $0x123,%edx //edx = 0x123 立即数寻址
movl 0x123,%edx //edx = *(int32_t*)0x123 直接寻址
movl (%ebx),%edx //edx = *(int32_t*)ebx 间接寻址
movl 4(%ebx),%edx //edx = *(int32_t*)(ebx+4) 移位寻址
**注:**b、w、l、q分别表示8位、16位、32位和64位。
3.基本汇编指令
1.
pushl %edx;
<==>
sub $4,%esp; //由于栈向下增长,所以栈顶指针先减4
movl %eax,(%esp); //将edx的值存入esp中,括号表示取地址,等同于C中的*
2.
pop %eax
<==>
movl (%esp),%eax; //将栈顶元素存入eax
addl $4,%esp; //栈顶指针加4
3.
call 0x12345;
<==>
push %eip; //将当前eip的值压栈
movl $0x12345,%eip; //eip跳转到0x12345
4.
ret
<==>
popl %eip
5.
enter
<==>
pushl %ebp;
movl %esp,%ebp;
6.
leave
movl %ebp,%esp;
popl %ebp;