寻址方式
指令寻址
顺序寻址方式
EIP增加
跳跃寻址方式
下条指令的地址码不是由程序计数器给出,而是由本条指令给出
操作数寻址
寄存器寻址 register addressing
指令 movl %eax,%edx
含义 edx = eax
立即寻址 immediate
指令 movl $0x123,%edx
含义 edx = 0x123
直接寻址 direct
指令 movl 0x123,%edx
含义 edx = *(int32_t*)0x123
间接寻址 indirect
指令 movl (%ebx),%edx
含义 edx = *(int32_t*)ebx
变址寻址 displaced addressing
指令 movl 4(%ebx),%edx
含义 edx = *(int32_t*)(ebx + 4)
b,w,l,q分别代表8位,16位,32位和64位
几个重要的汇编指令
pushl %eax
相当于:
subl $4,%esp
movl %eax,(%esp)
popl %eax
相当于:
movl (%esp),%eax
addl $4,%esp
call 0x12345
相当于:
pushl %eip(*)
movl $0x12345,%eip(*) //(*)表示eip不能被直接成员直接操作,要操作eip需要结合push 等
ret
相当于:
popl %eip(*)
leave
相当于:
movl %ebp, %esp
popl %ebp
//leave 是恢复堆栈指令,用在函数返回时用来恢复调用方的堆栈信息
//进入一个新的函数时,一般都会执行下面两条指令
pushl %ebp
movl %esp,%ebp