• VS2012下X64平台嵌入汇编程序



    VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码:


    1. #include <iostream>  
    2. using namespace std;  
    3.   
    4. int  Add(int num1, int num2)  
    5. {  
    6.     __asm  
    7.     {  
    8.         mov eax,num1  
    9.         mov ecx,num2  
    10.         add eax,ecx  
    11.     }  
    12. }  
    13.   
    14.   
    15. void main()  
    16. {  
    17.     int a = Add(2,3);  
    18.     cout<< a <<endl;  
    19.     system("pause");  
    20. }  
    #include <iostream>
    using namespace std;
    
    int  Add(int num1, int num2)
    {
    	__asm
    	{
    		mov eax,num1
    		mov ecx,num2
    		add eax,ecx
    	}
    }
    
    
    void main()
    {
    	int a = Add(2,3);
    	cout<< a <<endl;
    	system("pause");
    }


    可以发现上述代码可以正常使用,然后将工程项目切换至x64编译模式下,就会发现有如下的错误提示:

    error C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字

    也就是说在x64编译模式下不支持__asm的汇编嵌入。从网上的资料上查到虽然不能直接嵌入汇编程序段,但是可以将程序段全部放到一个asm文件下进行编译,最后asm文件编译生成的obj文件和.cpp文件编译生成的obj文件链接到一起就可以生成exe文件了。

    新建一个asm文件,这里建立了文件名为test.asm的文件。

    写入如下测试代码:


    1. .CODE  
    2.   
    3. Int_3 PROC  
    4.         MOV EAX, 1234  ;返回1234  
    5.         RET  
    6. Int_3 ENDP  
    7.   
    8.   
    9. MY_TEST PROC  
    10.         MOV EAX, 23 ;返回23  
    11.         RET  
    12. MY_TEST ENDP  
    13.   
    14. END  
    .CODE
    
    Int_3 PROC
    		MOV EAX, 1234  ;返回1234
    		RET
    Int_3 ENDP
    
    
    MY_TEST PROC
    		MOV EAX, 23 ;返回23
    		RET
    MY_TEST ENDP
    
    END


    上述代码段中一个两个汇编函数Int_3和MY_TEST。

    然后新建一个.h文件来对汇编程序中的代码作声明。这里建立一个名为test.h的头文件。写入如下声明信息:


    1. #ifndef __ASMCODE_H  
    2. #define __ASMCODE_H  
    3.   
    4.   
    5. extern "C"  
    6. {  
    7.     int _stdcall Int_3();  
    8.     int _stdcall MY_TEST();  
    9. }  
    10.       
    11.   
    12. #endif  
    #ifndef __ASMCODE_H
    #define __ASMCODE_H
    
    
    extern "C"
    {
    	int _stdcall Int_3();
    	int _stdcall MY_TEST();
    }
    	
    
    #endif

    在main.cpp中包含上述头文件,调用汇编中的函数,在x64模式下编译,这时会发现还是有错误。下面步骤是关键!!

    鼠标右键test.asm文件。





    进入属性—>配置属性—>常规,设置从生成中排除为否,选择项类型为自定义生成工具依次点击应用,确定




    这时候就会发现多了一项自定义生成工具。


    在自定义生成工具下选择常规设置红框中的三项:




    设置完成后应用,确定,然后重新编译程序,发现这个时候就可以编译成功了。




    点击调试。可能会出现错误:

    无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件

    这是因为在链接生成的过程中都没有生成pdb调试文件,这时要修改项目属性,完成以下三项就可以了。

    首先打开菜单 项目->项目属性页 
    1、选择 配置属性->链接器->调试->生成调试信息 改为 是 
    2、选择 配置属性->C/C++ ->常规->调试信息格式 改为 用于“编辑并继续”的程序数据库(/ZI) 
    3、选择 配置属性->C/C++ ->优化->优化 改为 禁用(/Od)

    这是就可以正常的在VS2012 x64模式下使用汇编程序了,根据网上资料,X64下汇编指令和32位汇编指令会有些许不同,深入使用的时候还需要去查询X64下汇编手册。


    参考资料:

    http://bbs.pediy.com/showthread.PHP?p=1318183  在VS2012 x64下编译驱动使用asm关键字的完整方案

    http://www.cnblogs.com/cryinstall/archive/2011/04/24/2280843.html    VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

    http://blog.sina.com.cn/s/blog_6b849dd00100xcgj.html      x86平台转x64平台关于内联汇编不再支持的解决


    注意汇编文件名不能与cpp文件名重复

    jpg改rar


  • 相关阅读:
    20155217 2016-2017-2《java程序设计》第一周学习总结
    20155217杨笛-安装虚拟机
    20155217-杨笛-c与java
    我所期望的师生关系
    jQ学习之实现全选全不选操作
    jQ学习之实现表格的隔行换色
    jQ学习之过滤选择器的测试
    jQ学习之层级选择器的测试
    jQ学习之基础选择器的测试
    jQ学习之实现图片的定时弹出
  • 原文地址:https://www.cnblogs.com/kuangke/p/6155368.html
Copyright © 2020-2023  润新知