首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

vc 内联汇编的有关问题

2012-08-07 
vc 内联汇编的问题#include stdafx.hint add(int a,short b){int c_asm{mov eax,[ebp+12]mov c ,eax}pr

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 

热点排行