VS2012下X64平台嵌入汇编程序

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

[cpp] view plain copy

print?

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

#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. Int_3 PROC
  3. MOV EAX, 1234  ;返回1234
  4. RET
  5. Int_3 ENDP
  6. MY_TEST PROC
  7. MOV EAX, 23 ;返回23
  8. RET
  9. MY_TEST ENDP
  10. 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. extern "C"
  4. {
  5. int _stdcall Int_3();
  6. int _stdcall MY_TEST();
  7. }
  8. #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平台关于内联汇编不再支持的解决

jpg改rar

时间: 2024-10-13 23:35:56

VS2012下X64平台嵌入汇编程序的相关文章

VS 本地调试 x64 平台 “Visual Studio Remote Debugging Monitor 已停止工作” 问题解决

之前有一阵子发现Visual Studio 2012 的x64平台不能直接debug,总是报如下错误,查找了一下,得知VS的x64是建立在x86的远程调试上,而不是独立运行. 猜测就是远程调试上出了问题,但修改各种设置,重装软件,都没有用. 只有将x64改成x86平台,用不到远程调试机制,也就天下太平了.但是我的程序里调用的就是x64的库,没办法,将就过了一段不能调试的日子,后来不知道怎么的又好了,就稀里糊涂的把这问题给糊弄过去了. 直到这次想上外网查东西,登录Astrill SVN时,总是报错

x86平台转x64平台关于内联汇编不再支持的解决

x86平台转x64平台关于内联汇编不再支持的解决     2011/08/25   把自己碰到的问题以及解决方法给记录下来,留着备用!   工具:VS2005  编译器:cl.exe(X86 C/C++)  ml64.exe(X64 ASM64) 前提:X86下内联汇编是嵌在函数当中实现的 在X86平台下,可以轻松的在C/C++代码中嵌入汇编代码,称其为"内联汇编",使用"__asm{}"语法即可,比较简单,这里不做介绍.当你在X86平台下,由于性能和速度的要求,需

在VS2012下不安装VS2010编译VS2010的工程

虽然一路追随这VISUAL SUTDIO在编程,但是断档的情况还是有的,最近一次硬盘问题使得安装了所有的VS2003-VS2012的机器硬盘挂了,无奈只能够安装了,不过觉得没啥用了,就安装一个VS2012不就OK了嘛,不过因为VS2012对VS2010完美支持vcxproj,使得完全可能在VS2012中编译VS2010的工程,但是必须安装IDE,这太麻烦了,有人也提出了不安装VS2010进行工程编译的想法,不过最后也没有得出结论. 之前也有过研究,发现MSBUILD进行编译的需要一套“规则”,都

c语言学生管理系统链表(dev vs2012下可以运行)

struct student { char name[10]; char sex[5]; long int num;//学号 int xuhao; int age; float score[3]; float averange; char DJ;//存放等级哦 struct student *next; };//定义结构体变量保存 名字 性别 年龄 成绩] 结构体声明 int n;//存放学生人数 int man;//存放统计的男生数 float JY(float a)//校验成绩使范围0-10

VLFeat图像库在VS2012下的配置

最近做课题所需,开始使用VLFeat图像库. 库下载链接: http://download.csdn.net/detail/sunboyiris/7500097 下载解压后改名为 vlfeat,放在D盘根目录下面.即为D:\vlfeat 在系统属性里面,PATH路径添加   D:\vlfeat 如图所示: 接下来新建一个项目: 添加库文件夹,可执行文件夹,包含文件夹. 接下来开始写个测试代码了: 新建一个头文件: vlfeature.h #pragma once #include "stdafx

winpcap在VS2012 Qt5 X64下的配置

最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit (VS 2013, OpenGL),因此要在Win7 64位系统下配置Qt和WinPcap. 1.到http://www.winpcap.org/install/default.htm下载最新的WinPcap安装包,并安装,运行基于winpcap的程序需要其支持. 2.到http://www.winpcap.o

有关 node.js ,npm 和 modules 安装,使用方法的个人总结! (以下内容是在windows10 pro x64平台下实现的!)

1.node.js 的安装 windows 平台: windows x64下载地址:Current Version: v4.1.0     https://nodejs.org/en/ 注意:(新版的.msi 安装程序已经默认包含npm) 2.node.js modules 的安装( 以下为常用 modules) cli-color  https://www.npmjs.com/package/cli-color 安装命令: npm install cli-color events  https

Windows环境下ELK平台的搭建

.背景 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果需要管理数十上百台服务器,必须依次登录每台机器的传统方法查阅日志,这样很繁琐和效率低下.当务之急是使用集中化的日志管理,开源实时日志分析ELK平台能够完美的解决上述所提到的问题. 2.工具 ELK由ElasticSearch(ES).Logs

流媒体技术:VS2012下RTP开源协议库JRTPLIB 3.9.1编译

一. JRTPLIB简介 RTP 是目前解决流媒体实时传输问题的最好办法,而JRTPLIB是一个用C++语言实现的RTP库,它完全遵循RFC 1889设计,目前已经可以运行在Windows.Linux.FreeBSD.Solaris.Unix和 VxWorks等多种操作系统上.在使用JRTPLIB之前,需要对其进行编译. 二. 使用的平台与软件 操作系统:windows 7 软件:CMake 3.2.3 + Visual Studio 2012 二. 下载链接 由于要对jrtplib进行编译,且