vc 内联汇编的问题
#include "stdafx.h"
int add(int a,short b)
{
int c;
_asm
{
mov eax,[ebp+12]
mov c ,eax
}
printf("%d\n",c);
}
int main(int argc, char* argv[])
{
add(1,2);
return 0;
}
我在了下它的汇编模式
发现 push 1 push 2
压入到了
2 压入到 sp 0012ff34
1 压入到 sp 0012ff30
然后子程序add的入口 为 入口 sp 0012ff28
现在我比较好奇的是 mov eax,[ebp+12] 这个指令的时候 sp 指向的是 0012ff30
但是 执行完之后 eax 里为 2 。 奇怪的是 0012ff30明明是 1 的栈地址啊。。这让我搞不明白 还有 mov eax,[ebp+8] 为 1 mov eax,[ebp+12] 为 2 我自己的想法是 ebp 执行到add首地址 的时候应该直接+4个字节 就可以得到 1 了 为什么它要加 8 才可以得到? 前面的 8个 字节用在了什么地方。。 还有 为什么 mov eax,[ebp+8] 之后 在加 4 也就是 mov eax,[ebp+12] 才等于1 ? short 不是 2个字节吗? 那应该是 mov eax,[ebp+10] 就可以得到 2 啊~ 莫非vc 给每个参数都分配可 4个字节的大小吗? 跟指针似得 ...
还有个指令我搞不懂 ... 就是 下面这三个 是不是申请了个 short 堆啊?
00401023 |. 83EC 44 sub esp, 44
00401031 |. B8 CCCCCCCC mov eax, CCCCCCCC
00401036 |. F3:AB rep stos dword ptr es:[edi]
[解决办法]
程序进入的时候先调用push保存ebp值,退出的时候pop恢复ebp, 看完整的反汇编就清楚了
int add(int a,short b){00414320 push ebp 00414321 mov ebp,esp 00414323 sub esp,0CCh 00414329 push ebx 0041432A push esi 0041432B push edi 0041432C lea edi,[ebp-0CCh] 00414332 mov ecx,33h 00414337 mov eax,0CCCCCCCCh 0041433C rep stos dword ptr es:[edi] int c; _asm { mov eax,[ebp+12]0041433E mov eax,dword ptr [b] mov c, eax00414341 mov dword ptr [c],eax } printf("%d\n",c);00414344 mov esi,esp 00414346 mov eax,dword ptr [c] 00414349 push eax 0041434A push offset string "%d\n" (429D84h) 0041434F call dword ptr [__imp__printf (42FD04h)] 00414355 add esp,8 00414358 cmp esi,esp 0041435A call @ILT+2930(__RTC_CheckEsp) (411B77h) }0041435F pop edi 00414360 pop esi 00414361 pop ebx 00414362 add esp,0CCh 00414368 cmp ebp,esp 0041436A call @ILT+2930(__RTC_CheckEsp) (411B77h) 0041436F mov esp,ebp 00414371 pop ebp 00414372 ret