堆栈图
一
存储参数
1.push

先执行push 2,在push1。栈从上往下(1,2是参数)
call—〉返回一个地址,并将下一个指令地址存入栈中
401171—〉函数执行完的返回地址(简称返回地址)
保留栈底
2.push ebp

将ebp里的值放入了栈里面
提升栈顶
3.mov ebp,esp


将esp里的值放入ebp中
4.Sub esp,40

esp-四零,(四零是16进制,一格有四个除以四,等于一零,在换算成十进制就是16个,栈的格数就往上数16个)
esp:12fee4
保存现场
5.Push ebx

push ebx—〉将ebx里面的值存入栈中,esp+4

清除垃圾数据
6.Lea edi,Dword ptr ss:[ ebp 40]

取[ebp- 40]的地址编号放入edi里面
edi变为0012f114(栈没有发生变化
7.清数据

将eax里面的字符串放入edi指向的内存地址中,edi加(减)四。一共重复16次,每重复一次,ecx- 1
(rep重复)

计算(正式工作。。。
8.计算

[ebp+8]地址里面的值放入了eax中
栈平衡
9.恢复现场

执行后

10.降低栈

11.恢复栈底


retn——pop eip
Eip会变成401171
12.外平栈

add esp,8
函数
汇编中的函数

是一个固定的程序段,或者称其为一个子程序,实现固定运算功能。同时带有一个出口和一个入口。


注:1)寄存器和内存都可以将参数传入函数中,也可以将计算出来的值保存下来
2)不一定有返回值
Windows堆栈特点

第二个堆栈图
步骤
1.

Push 3
Push 2
Push 1
2.

call 000401005
3.

PUSH EBP
MOV EBP,ESP
SUB ESP,48
4、
PUSH EBX
PUSH ESI
PUSH EDI
5、
LEA EDI,DWORD PTR SS:[EBP-48]
MOV ECX,12
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]

6、
MOV DWORD PTR SS:[EBP-4],2
MOV EAX,DWORD PTR SS:[EBP+C]

eax 变成2
7.
PUSH EAX
MOV ECX, DWORD PTR SS:[EBP+8]
PUSH ECX

*8.
CALL 0040100A

9.
PUSH EBP
MOV EBP,ESP //ebp=esp
SUBESP,44

10.
PUSH EBX
PUSH ESI
PUSH EDI
LEA EDI,DWORD PTR SS:[EBP-44]
MOV ECX,11
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]

11.
MOV DWORD PTR SS:[EBP-4],0A
MOV EAX, DWORD PTR SS:[EBP+81
ADD EAX,DWORD PTRSS:[EBP+CI /此时eax为3
ADD EAX, DWORD PTR SS:[EBP-4] /eax=3+a=d

12.
POP EDI
POP ESI
POP EBX

13.
MOV ESP,EBP
POP EBP

14.
RETN

EIP变为40109c
15.
ADD ESP,8

16.
MOV DWORD PTR SS:[EBP-8],EAX
MOV EAX, DWORD PTR SS:[EBP-4] /EAX=2
ADD EAX,DwORD PTR SS:[EBP-8] /eax=2+d=f
ADD EAX, DWORD PTR SS:[EBP+10] /eax=f+3=12 (10转为16进制是16,除以4=4,所以esp向下四格,所以是三)
17.
POP EDI
POP ESI
POP EBX

18.
ADD ESP ,48
CAMP EBP ,ESP /Eap和esp做减法,若等于0 ,z位为一

19.
MOV ESP,EBP
POP EBP
RETN

20.
ADD ESP,0C


浙公网安备 33010602011771号