堆栈图
一
存储参数
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