打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在C\\C++中嵌入汇编

在C\\C++中嵌入汇编  

2009-10-12 22:44:17|  分类: C++ |  标签: |字号 订阅

怎么样在C\\C++中嵌入汇编呢?下面我们用三篇文章来说明这个问题。

1. 按照默认设定创建一个控制台程序TestAsm,在Project/Setting的General的Microsoft Foundation Class使用的是: not    using mfc
   #include <stdio.h>
   char format[] = \"%s %s\\n\";
   char hello[] = \"Hello\";
   char world[] = \"world\";
   int main( void )
   {
       __asm
      {
          mov  eax, offset world
          push eax
          mov  eax, offset hello
          push eax
          mov  eax, offset format
          push eax
          call printf
          pop  ebx
         pop  ebx
         pop  ebx
      }
      return 0;
    }
    上面代码对应在调试时对应的汇编代码为:

10:      __asm
11:      {
12:         mov  eax, offset world
00401068   mov         eax,offset world (00422a40)
13:         push eax
0040106D   push        eax
14:         mov  eax, offset hello
0040106E   mov         eax,offset hello (00422a38)
15:         push eax
00401073   push        eax
16:         mov  eax, offset format
00401074   mov         eax,offset format (00422a30)
17:         push eax
00401079   push        eax
18:         call printf
0040107A   call        printf (004011f0)
19:         pop  ebx[Page]
0040107F   pop         ebx
20:         pop  ebx
00401080   pop         ebx
21:         pop  ebx
00401081   pop         ebx
22:      }

编译完成后,执行程序,得到预期结果: Hello world

2. 还是上面的例子,设置Project/Setting的General的Microsoft Foundation Class使用的是: using mfc in shared dll
   还是上面的代码程序,在调试的时候,得到的汇编代码如下:
   10:      __asm
11:      {
12:         mov  eax, offset world
00401068   mov         eax,offset world (00414420)
13:         push eax
0040106D   push        eax
14:         mov  eax, offset hello
0040106E   mov         eax,offset hello (00414418)
15:         push eax
00401073   push        eax
16:         mov  eax, offset format
00401074   mov         eax,offset format (00414410)
17:         push eax
00401079   push        eax
18:         call printf
0040107A   call        __imp__printf (004150a8)
19:         pop  ebx
0040107F   pop         ebx
20:         pop  ebx
00401080   pop         ebx
21:         pop  ebx
00401081   pop         ebx

22:      }

 

比较一下同一段代码在使用using mfc in shared dll 和not using mfc的时候,出现的汇编代码的不同,主要是在调用函数printf的时候,有不同,分别为: call        __imp__printf (004150a8) 和call        printf (004011f0)[Page]
在执行使用using mfc in shared dll 编译生成的执行文件时,会出现异常,得不到正常的结果.
但如果把call printf换成 call DWORD PTR[printf],程序有可以正常运行了. 这就是同一个函数因为使用了不同的库而出现的不同的结果。
因此进行了如下总结:
1. 使用静态编译和不使用mfc编译的时候,通过call ****,直接调用c的函数库函数.
2. 如果使用动态库进行编译,则应该call DWORD PTR[****]去调用函数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
漫谈递归:从汇编看尾递归的优化
堆栈和堆
【原创】内联汇编
http://blog.csdn.net/amwfnyq/article/details/...
实战X86寄存器
负数居然比正数大?无符号整型与整形混用的后果
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服