幾種基本匯編指令詳解
常見寄存器
寄存器 16位 32位 64位
累加寄存器 AX EAX RAX
基址寄存器 BX EBX RBX
計數寄存器 CX ECX RCX
數據寄存器 DX EDX RDX
堆棧基指針 BP EBP RBP
變址寄存器 SI ESI RSI
堆棧頂指針 SP ESP RSP
指令寄存器 IP EIP RIP
匯編指令
mov
movb(8位)、movw(16位)、movl(32位)、movq(64位)
寄存器尋址:
movl %eax, %edx
eax -> edx
立即數尋址:
movl $0x123, %edx
數字->寄存器
直接尋址:
movl 0x123, %edx
直接訪問內存地址數據,edx = *(int32_t *)0x123;
間接尋址:
movl (%ebx), %edx
%ebx 是個內存地址,(%ebx)指的是該地址中的數據,edx = *(int32_t*)ebx;
變址尋址:
movl 4(%ebx), %edx
edx = *(int32_t*)(ebx+4);
push & pull
堆棧數據結構簡介
作用:
程序調用框架
傳遞參數
保存返回地址
提供局部變量
……
結構:
相關寄存器: esp, ebp
相關操作: pop, push
//建立被調用者函數的堆棧框架
pushl %ebp
movl %esp, %ebp
//拆除框架
movl %ebp, %esp
popl %ebp
ret
1
2
3
4
5
6
7
8
push:壓棧
push %eax
相當於:
subl $4, %esp
//棧頂指針減4
movl %eax, (%esp)
//%eax -> esp 地址
1
2
3
4
pop:出棧
pop %eax
相當於:
movl (%esp), %eax
addl %4, %esp
//棧頂指針加4
1
2
3
call&ret
call
call 0x12345
相當於:
pushl %eip
movl $0x12345, %eip
//當前地址壓棧,存入新地址
1
2
3
ret
相當於:
popl %eip
//棧 -> eip
1
2
enter&leave
enter
push %ebp
movl %esp, %ebp
//將堆棧置空(棧上重堆)
1
2
3
leave
movl %ebp, %esp
popl %ebp
//將堆棧置空(撤銷堆棧)
1
2
3
例子:分析一段匯編代碼
pushl $8 ①
movl %esp, %ebp ②
subl $4, %esp ③
movl $8, (%esp) ④
1
2
3
4
https://blog.csdn.net/luoyhang003/article/details/46786591