ESP寻址
用栈传参时用ESP来找参数地址叫做ESP寻址。
ESP寻址的缺点
当使用寄存器传参时,需要把寄存器中的值先压栈备份,因为寄存器的值可能被用到,寻址的计算比较麻烦,所以我们还有一种EBP寻址
EBP寻址
EBP寻址的代码比较麻烦,但是参数较多时,性价比很高。
EBP寻址相当于创建一个新的栈。
如:
执行1+2的操作
02 push 1 (前面数字为指令地址)
03 push 2
把数据压栈
| 4 | ||
|---|---|---|
| 5 | 2 | ESP |
| 6 | 1 | |
| 7 | 135 | EBP |
04 call 08
05 add ESP,8
写加法函数
因为要创建新的栈,所以先将EBP压栈储存,以便平栈。
06 push EBP
然后创建新栈
07 mov EBP,ESP
08 sub ESP, 0xC(根据需要)
| 0 | ESP | |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | 7(EBP) | EBP |
| 4 | 05(call) | |
| 5 | 2 | |
| 6 | 1 | |
| 7 | 135 |
加法
09 mov eax,Dword ptr ss:[ESP+8]
10 add eax, Dword ptr ss:ESP+C
然后平栈
11 mov ESP,EBP
12 pop EBP
| 1 | ||
|---|---|---|
| 2 | ||
| 3 | 0(EBP) | |
| 4 | 05(call) | ESP |
| 5 | 2 | |
| 6 | 1 | |
| 7 | 135 | EBP |
13 ret
执行完05指令后,堆栈将平衡
| 7 | 135 | ESP/EPB |
|---|---|---|
