|
- code:
- int Function(int x,int y)
- {
- int Arr[10]={1,2,3,4,5,6,7,8,9,10};
- return Arr[x]+Arr[y];
- }
- void main()
- {
- int x=1;
- int y=2;
- int r=Function(x,y);
- printf("r=%d",r);
-
- }
- 数组寻址:
- //参数传递
- 0040D808 mov dword ptr [ebp-4],1 // 1赋值给局部变量x, 2赋值给局部变量y;
- 0040D80F mov dword ptr [ebp-8],2
- 0040D816 mov eax,dword ptr [ebp-8]
- 0040D819 push eax // 2入栈
- 0040D81A mov ecx,dword ptr [ebp-4]
- 0040D81D push ecx // 1入栈
- 0040D81E call @ILT+15(Function) (00401014) // CALL ESP-4 040D823 返回值保存在ESP+4中
- 0040D823 add esp,8
- 0040D826 mov dword ptr [ebp-0Ch],eax
- 0040D829 mov edx,dword ptr [ebp-0Ch]
- 0040D82C push edx
- 0040D82D push offset string "r=%d" (00422f9c)
- 0040D832 call printf (0040d6f0)
- //因为是cdecl call,所以是先压第二个参数,也就是EBP-8先入栈,两个参数入栈,然后call 函数00401014 此时在压一次栈,栈中值为call下一行地质也就是0040D823,用于ret 所以此时的ESP 指向返回地址,而ESp+4指向第一个参数,ESP+8指向第二个参数。
- //接着EBP入栈,此时的ESP指向原始EBP。 mov ebp,esp ,这一句将栈顶指针赋值给EBP保存起来。EBP和ESP指向的都是EBP。,所以EBP+4也就是指向返回地址,也就是0040D823,而EBP+8指向参数,这也就是为什么参数是EBP-4,而EBP+4指向返回地址,EBP+8是参数的原因了。
- 0040D770 /> \55 PUSH EBP ; 原始EBP入栈, esp 中保存的就是原始EBp
- 0040D771 |. 8BEC MOV EBP,ESP ; EBP=ESP,保存栈针,此时EBp+4就是返回值,EBP+8就是参数2
- 0040D773 |. 83EC 68 SUB ESP,68
- 0040D776 |. 53 PUSH EBX
- 0040D777 |. 56 PUSH ESI
- 0040D778 |. 57 PUSH EDI ; 保存即将使用的寄存器
- 0040D779 |. 8D7D 98 LEA EDI,DWORD PTR SS:[EBP-68] ; 取抬升地址
- 0040D77C |. B9 1A000000 MOV ECX,1A
- 0040D781 |. B8 CCCCCCCC MOV EAX,CCCCCCCC
- 0040D786 |. F3:AB REP STOS DWORD PTR ES:[EDI] ; 填充缓冲区
- 0040D788 |. C745 D8 01000>MOV DWORD PTR SS:[EBP-28],1
- 0040D78F |. C745 DC 02000>MOV DWORD PTR SS:[EBP-24],2
- 0040D796 |. C745 E0 03000>MOV DWORD PTR SS:[EBP-20],3
- 0040D79D |. C745 E4 04000>MOV DWORD PTR SS:[EBP-1C],4
- 0040D7A4 |. C745 E8 05000>MOV DWORD PTR SS:[EBP-18],5
- 0040D7AB |. C745 EC 06000>MOV DWORD PTR SS:[EBP-14],6
- 0040D7B2 |. C745 F0 07000>MOV DWORD PTR SS:[EBP-10],7
- 0040D7B9 |. C745 F4 08000>MOV DWORD PTR SS:[EBP-C],8
- 0040D7C0 |. C745 F8 09000>MOV DWORD PTR SS:[EBP-8],9
- 0040D7C7 |. C745 FC 0A000>MOV DWORD PTR SS:[EBP-4],0A ; 数组赋值
- 0040D7CE |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 取参数到EAX
- 0040D7D1 |. 8B4485 D8 MOV EAX,DWORD PTR SS:[EBP+EAX*4-28] ; 数组访问宽度为4,EAX为1,EBP-28+4=ebp-24 取2
- 0040D7D5 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C] ; 取先压得参数到ECX eax为[ebp-20]为3
- 0040D7D8 |. 03448D D8 ADD EAX,DWORD PTR SS:[EBP+ECX*4-28]
- 0040D7DC |. 5F POP EDI
- 0040D7DD |. 5E POP ESI
- 0040D7DE |. 5B POP EBX
- 0040D7DF |. 8BE5 MOV ESP,EBP
- 0040D7E1 |. 5D POP EBP
- 0040D7E2 \. C3 RETN
复制代码 |
上一篇: 在窗口中绘制一条直线 有什么方法存储下一篇: 数组指针的使用和数组的加密解密
|