VS2012下X64平台嵌入汇编程序
VS2012在win32平台编译的时候可以很好的支持汇编语言的嵌入。建立一个控制台应用程序,选择空项目。项目建立好之后添加一个.cpp文件。在cpp文件中写入如下代码:
- #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");
- }
#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的文件。
写入如下测试代码:
- .CODE
- Int_3 PROC
- MOV EAX, 1234 ;返回1234
- RET
- Int_3 ENDP
- MY_TEST PROC
- MOV EAX, 23 ;返回23
- RET
- MY_TEST ENDP
- 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的头文件。写入如下声明信息:
- #ifndef __ASMCODE_H
- #define __ASMCODE_H
- extern "C"
- {
- int _stdcall Int_3();
- int _stdcall MY_TEST();
- }
- #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
VS2012下X64平台嵌入汇编程序的更多相关文章
- x86平台转x64平台关于内联汇编不再支持的解决
x86平台转x64平台关于内联汇编不再支持的解决 2011/08/25 把自己碰到的问题以及解决方法给记录下来,留着备用! 工具:VS2005 编译器:cl.exe(X86 C/C+ ...
- Windows7+VS2012下OpenGL 4的环境配置
系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...
- 线下AWD平台搭建以及一些相关问题解决
线下AWD平台搭建以及一些相关问题解决 一.前言 文章首发于tools,因为发现了一些新问题但是没法改,所以在博客进行补充. 因为很多人可能没有机会参加线下的AWD比赛,导致缺乏这方面经验,比如我参加 ...
- BarTender如何将条码下的数字嵌入到条码中
现今社会,在各种包装箱子.书籍.超市商品等东西上面,必不可少的绝对要数条形码或者二维码了.有时候,根据客户的需求或者其他条件限制等原因,我们需要将BarTender 2016条码下的数字嵌入到条码中. ...
- VS2012下安装NuGet
关于NuGet的两篇文章:MSDN上的使用 NuGet 管理项目库,和博客园dudu的程序员,用NuGet管理好你的包包. VS2012下安装NuGet 在工具菜单下选择“扩展和更新”. 选择“联机” ...
- 最新版Duilib在VS2012下编译错误的解决方法
svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下. 这个问题很普遍, 非常多的人遇到. 至于 ...
- VS2012下使用Moq进行单元测试
单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为VS调试完全可以满足了,所以一直也就没有用过,刚好在<Pro.ASP.NET.MVC.3.Framework>中看到了Moq这 ...
- VS2012下基于Glut 矩阵变换示例程序2:
在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...
- 基于OpenCV做“三维重建”(0)-- OpenCV3.2+VIZ6.3.0在vs2012下的编译和使用
一.问题提出 ViZ对于显示3维的效果图来说,非常有帮助:我在使用OpenCV进行双目测距的过程中,有一些参数希望能够通过可视化的方法显示出来,所以参考了这方面相关的资料.做了一些实验 ...
随机推荐
- 数据结构图文解析之:树的简介及二叉排序树C++模板实现.
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
- gRPC+etcd的优势分析
相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...
- css之display:inline-block
display:inline-block: 作用:将对象呈现为inline对象,但是对象的内容作为block对象呈现.之后的内联对象会被排列在同一行内.比如我们可以给一个link(a元素)inline ...
- 最终解决 mouseenter, mouseleave , mouseout mousehover mousemove等事件的区别?
在jquery中, html页面的div的显示和隐藏, 修改等的功能, 最终都要由 事件 触发来引用, 不管是键盘事件, 还是鼠标事件... mouseenter和mouseleave是成对对应的, ...
- mysql 存储引擎
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等 ...
- 【强烈推荐】利用NAT、Host-Only双虚拟网卡,实现Virtual Box中CentOS6.3联网
问题背景: 先前都是在Virtual Box中以“网络共享”方式,让里面的Linux虚拟机Host-Only方式联网,参考如下: Virtual Box下配置Host-Only联网方式详解 但最近被公 ...
- webview滑动事件 与内部html左右滑动事件冲突问题的解决办法
最近在做个混合app , 用html做页面,然后通过webview嵌套在activity中,效果是这样: 开始还是比较顺利,增加了菜单退出按钮,返回键页面回退功能,页面加载显示加载图标(在app端实现 ...
- ODBC API简介
1. 数据类型: 通过SQLGetTypeInfo函数来获取ODBC 3.0支持的数据类型信息.由SQLGetTypeInfo返回的数据类型是数据源所支持的数据类型. SQLRETURN S ...
- angularjs 弹出框 $modal 参数(转)
angularjs 弹出框 $modal $modal只有一个方法:open,该方法的属性有: templateUrl:模态窗口的地址 template:用于显示html标签 scope:一个作用 ...