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;