第23节:什么是ESP寻址
寄存器传参与堆栈传参
寄存器传参回顾一下:
例子:
MOV ECX,1
MOV EDX,2
CALL 004183D7
004183D7 MOV EAX,ECX
ADD EAX,EDX
RET
堆栈传参回顾一下:
例子:
PUSH 1
PUSH 2
CALL 004183E9
004183E9 MOV EAX,DWORD PTR SS:[ESP+4]
ADD EAX,DWORD PTR SS:[ESP+8]
RET
以上两个例子可以看出ESP寻址方式,这样的方式有没有弊端呢?答案是有的,因为如果寄存器中的值已经被存储了,那该怎么办呢?原来的值最好给它保存起来,那该如何保存呢?如果保存到其他寄存器的话也会出现问题,因为其他寄存器也要用,这样也会出现问题。只能把你要的寄存器存到堆栈里,看例子:
PUSH 1
PUSH 2
CALL 004183E9
004183E9 PUSH ECX
PUSH EDX
PUSH EBX
MOV ECX,DWORD PTR SS:[ESP+10]
ADD ECX,DWORD PTR SS:[ESP+14]
MOV EAX,ECX
POP EBX
POP EDX
POP ECX
RET
注意:POP指令是临时存储的值全部倒着来,跟PUSH相反的。
寄存器传参与堆栈传参
寄存器传参回顾一下:
例子:
MOV ECX,1
MOV EDX,2
CALL 004183D7
004183D7 MOV EAX,ECX
ADD EAX,EDX
RET
堆栈传参回顾一下:
例子:
PUSH 1
PUSH 2
CALL 004183E9
004183E9 MOV EAX,DWORD PTR SS:[ESP+4]
ADD EAX,DWORD PTR SS:[ESP+8]
RET
以上两个例子可以看出ESP寻址方式,这样的方式有没有弊端呢?答案是有的,因为如果寄存器中的值已经被存储了,那该怎么办呢?原来的值最好给它保存起来,那该如何保存呢?如果保存到其他寄存器的话也会出现问题,因为其他寄存器也要用,这样也会出现问题。只能把你要的寄存器存到堆栈里,看例子:
PUSH 1
PUSH 2
CALL 004183E9
004183E9 PUSH ECX
PUSH EDX
PUSH EBX
MOV ECX,DWORD PTR SS:[ESP+10]
ADD ECX,DWORD PTR SS:[ESP+14]
MOV EAX,ECX
POP EBX
POP EDX
POP ECX
RET
注意:POP指令是临时存储的值全部倒着来,跟PUSH相反的。