文档章节

VS2012下X64平台嵌入汇编程序

simpower
 simpower
发布于 06/26 22:01
字数 1140
阅读 12
收藏 0
ASM

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

 

 

[cpp] view plain copy print?

  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的文件。

写入如下测试代码:

 

 

[cpp] view plain copy print?

  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的头文件。写入如下声明信息:

 

 

[cpp] view plain copy print?

  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文件。

 

 

 

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

 

 

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

 

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

Command Line(命令行):  ml64 /c %(fileName).asm

Outputs(输出):  %(fileName).obj;%(Outputs)

//注意:这时入口不能设置为main,而是空缺,vc会自动找到c中的main从vcrt进入到main中。
//如果是纯汇编,可以将入口设置为main,用汇编来写main

 

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

 

 

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

无法找到“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

本文转载自:https://www.cnblogs.com/kuangke/p/6155368.html

共有 人打赏支持
simpower
粉丝 26
博文 564
码字总数 43779
作品 0
海淀
程序员
私信 提问
编译《OpenGL ES 3.0 编程指南》书中代码

之前写过一篇 blog 刚开始编译时,没有编译过去。因而转向了 mingw32 。最近想起来就想再编译一次。于是写篇记录一下。 按照书中要求先下载 AdrenoSDK ,我用的是 adrenosdk50.zip 这个版本。...

iiRecord
2016/12/02
40
0
vs2010 问题 >LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题说明:当安装VS2012之后,原来的.NET 4.0会被替换为.NET 4.5。卸载VS2012时,不会恢复.NET 4.0。 l 当VS2012安装后...

nothingfinal
03/08
0
0
VS2012+Win7网站发布详细步骤

VS2012+Win7网站发布详细步骤   本机环境:   本文分三个部分介绍Web项目发布的常规方法,大神级别可以略过,主要是为了方便一些初学者。 第一部分:VS2012把项目发布到文件系统。 第二部...

yonghu86
06/26
0
0
openCV vs2013配置

让曾经也是小白的我来写一个VS一次配置永久使用OpenCV的终极小白教程: 说白了就是将VS第一次配置OpenCV的项目属性表保存下来,每次新建项目时引用即可。 目录 解压OpenCV 配置系统环境变量 ...

文剑Boy
2016/03/29
0
0
V8 JavaScript 引擎 6.9 发布:继续对内存进行优化

每六周,V8 JavaScript 引擎都会发布一个新版本,现在最新版本 6.9 已正式推出。 发布说明显示,V8 6.9 在 x64 平台上支持嵌入式内置插件,通过该插件,显著优化了 V8 的内存使用。数据显示,...

局长
08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

手写tomcat+servlet

写程序一定要有思路,思路很重要! 一、我们分两步第一步先实现手写tomcat,第二部写servlet 所用技术: 1、soket通信 IO流 2、http请求与相应 3、解析xml 4、java反射技术 导入所需要的jar...

jason_kiss
29分钟前
1
0
Beetl模板的基础用法 【变量、循环、条件】---《Beetl视频课程》(2)

本期视频做了一个博客的首页列表; 内容简介:springboot 集成 beetlsql;使用for循环,使用if控制语句,使用虚拟属性,定义变量等等 一起学beetl目录:https://my.oschina.net/u/1590490?ta...

Gavin-King
34分钟前
1
0
各种视频监控上墙方案的比较

方案1、一使用 DVR 、NVR 直接显示上墙 不得不说,这种办法是成本最低廉的,但这里有不少限制: 无法实现分散点的集中上墙。譬如连锁经营的酒店,如果我在总部建立一个集中上墙的环境,这个就...

PeakFang-BOK
58分钟前
4
0
netfilter 和 iptables

一. netfilter 1. 什么是entfilter 和 iptables netfilter指整个项目名 在这个项目里面,netfilter特指内核中的netfilter框架, iptables指用户空间的配置工具。 netfilter在协议栈中添加了5...

Fc丶
今天
2
0
搞定了微信小程序富文本渲染解决方案-后端渲染方案Html2Wxml2J

先介绍一下最近遇到的问题: 最近小程序项目中有文章详情页需要渲染富文本,微信小程序官方提供的<rich-text>是个弱鸡,很多标签不支持,用起来也麻烦,性能也不咋地。 吐槽完了,我们决定寻...

山东-小木
今天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部