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 |
---|---|---|