读书人

vc 内联汇编的有关问题

发布时间: 2012-08-07 14:54:49 作者: rapoo

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, 看完整的反汇编就清楚了

C/C++ code
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 

读书人网 >VC/MFC

热点推荐