VS2010中编写x64汇编的具体方法
编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式。
在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便。
但是当目标平台为x64时,微软不再允许直接内联汇编了,这给我们编程造成了一些不便。
怎么解决这个问题呢? 一种办法是改用Intel的编译器,它仍然支持内联汇编。
另一种办法还是用VS了,但是不能内联,需要把汇编部分单独写到一个asm文件里,然后在其它源文件中引用。
我参考了一些网上的说明,在这里把过程写详细些,方便自己,也方便他人。
主要过程:
一、在asm文件中单独编写功能函数
比如要实现一个64位的加法函数,原型如下:
ULONG64 myAdd(ULONG64 u1,ULONG64 u2);
那么新建一个文件,写入以下内容
.CODE myAdd PROC
add rcx,rdx
mov rax,rcx
ret
myAdd ENDP END
将以上内容保存为myadd.asm,然后加其加入到工程中。

在其它需要引用该函数的源文件中,添加以下声明:
#include "stdafx.h"
#include <windows.h> //声明引用外部函数
EXTERN_C ULONG64 myAdd(ULONG64 u1,ULONG64 u2); int _tmain(int argc, _TCHAR* argv[])
{
ULONG64 result = myAdd(0x111111111,0x333333333);
printf("result = 0x%I64X\n",result);
return ;
}
二、设置asm文件的生成方式
在asm文件上点击右键,选择“属性”:

然后点击左侧的“常规”,“从生成中排除”选择“否”,“项类型”选择“自定义生成工具”,然后点击应用。

此时在“常规”下面就会出现“自定义生成工具”的条目。
点击它,设置“命令行”为 ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
设置输出为 $(IntDir)%(fileName).obj, 该项必须配置,否则VS认为该文件没有设置输出就会不处理它,同时它也告诉链接器到哪里去找这个obj文件。
上面的 $(IntDir)是一个宏,表示当前生成配置的目录,比如"x64\Debug"。
经过以上配置之后,asm文件编译生成的obj文件就会自动生成到相应配置的目录。

三、生成工程
全部配置完成以后,就可以愉快地生成工程了。正常的输出结果如下:
>------ 已启动生成: 项目: testasm, 配置: Release x64 ------
>生成启动时间为 // ::。
>InitializeBuildStatus:
> 正在创建“x64\Release\testasm.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>CustomBuild:
1> Performing Custom Build Tools
1> Assembling: myAdd.asm
1> Microsoft (R) Macro Assembler (x64) Version 10.00.40219.01
1> Copyright (C) Microsoft Corporation. All rights reserved.
>
>ClCompile:
> stdafx.cpp
> testasm.cpp
>Link:
> 正在生成代码
> 已完成代码的生成
> testasm.vcxproj -> F:\x64Program\testasm\x64\Release\testasm.exe
>FinalizeBuildStatus:
> 正在删除文件“x64\Release\testasm.unsuccessfulbuild”。
> 正在对“x64\Release\testasm.lastbuildstate”执行 Touch 任务。
>
>生成成功。
>
>已用时间 ::01.11
========== 生成: 成功 个,失败 个,最新 个,跳过 个 ==========
如果没什么意外的话,就会生成成功了。如果你编写的asm文件有错误的话,在输出中也能看到相应的提示,改掉错误就可以了。
至此,又可以愉快地使用汇编了呢~
VS2010中编写x64汇编的具体方法的更多相关文章
- x64汇编第四讲,c / C++中调用x64汇编
目录 x64汇编第四讲,c / C++中调用x64汇编 一丶简介 1.说明 二丶C/C++调用 asm64.asm函数. 1.配置asm参与生成 2.给Asm文件添加函数代码 3.C/C++调用asm ...
- 在vs2010中编译log4cxx-0.10.0详细方法(从下载、编译、解决错误详细介绍)
在vs2010中编译log4cxx-0.10.0详细方法(从下载.编译.解决错误详细介绍) http://blog.sina.com.cn/s/blog_a459dcf501013tbn.html
- 【转】Win7下VS2010中配置Opencv2.4.4的方法(32位和64位都有效)(亲测成功)
在vs2010下配置opencv是件痛苦的事情,一点点错误可能就会导致莫名其妙的报错,各种error让人郁闷不已,这里提供给大家一篇vs2010下配置opencv2.4.4的方法,我是64位的win7 ...
- Java中编写一个完美的equals方法
首先看下Java语言规范对equals方法的要求: 1,自反性,对于任何非控引用x,x.equals(x)都应该返回true. 2,对称性,对于任何引用x和y,如果x.equals(y)返回true, ...
- 在vs2010中编译log4cxx-0.10.0详细方法
本文一共包含了17个步骤,按照下面的步骤就可以完成vs2010中编译log4cxx的工作了. 1. 下载 log4cxx 以及 apr 和 apr-util 源码: a) http://www.apa ...
- VS2010中编写宏添加作者信息与函数注释
这里所说的宏是指通过一系列键盘组合键和可以插入自定义内容.下面介绍怎么编写一个自己的宏: 1.在Visual Studio 2010中按Alt+F11打开宏IDE: 2.打开后选择添加模块: 3.在弹 ...
- 在vs2010中编译log4cxx-0.10.0具体方法(从下载、编译、解决错误具体介绍)
一. 简单介绍 log4cxx是Java社区著名的log4j的c++移植版.用于为C++程序提供日志功能,以便开发人员对目标程序进行调试和审计,log4cxx是apache软件基金会的开源项目,基于A ...
- 如何在Java中编写一个线程安全的方法?
线程安全总是与多线程有关的,即一个线程访问或维护数据时遭到了其它线程的“破坏”,为了不被破坏,就要保持所维护变量的原子性: 1 局部变量总是线程安全的,因为每个线程都有自己的栈,而在方法中声明的变量都 ...
- VS2010 中 Entity Framework 多数据库并存方法
选中相应数据库生成的 *.edmx文件,然后在属性中找到“自定义工具命名空间”,为每个EF数据集设置不同的命名空间,这样每个数据库生成的代码就会被隔离在不同的命名空间,即使同名类型也就不会相互影响了.
随机推荐
- 【Android开发—智能家居系列】(四):UDP通信发送指令
思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...
- js可以控制文件上传的速度吗?
为了减轻服务器负载,对于上传和下载的情况,我们需要进行流量控制,一般的方法是服务端做限流举措,比如很多ftp服务器,但是我想是不是可以使用前端js做呢? 顺着这个想法,我查了下资料,目前来看结论是No ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
- 关于OC的内存管理-01
1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大.当内存占用率达到一种程度时.系统会发出内存警告.这时我们须要把一些不用 ...
- Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整
Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...
- Jenkins系列之-—07 集成JIRA
一.Jenkins Jira插件安装&配置 1. 安装插件,主要安装如下插件: Jira Issue Updater 该插件用于更新JIRA ISSUES 的工作流状态或增加备注 JIRA p ...
- 【转载】C#相等性比较
本文阐述C#中相等性比较,其中主要集中在下面两个方面 ==和!=运算符,什么时候它们可以用于相等性比较,什么时候它们不适用,如果不使用,那么它们的替代方式是什么? 什么时候,需要自定一个类型的相等性比 ...
- Intel Naming Strategy--2
http://en.wikipedia.org/wiki/Intel_Corporation#Naming_strategy Naming strategy[edit] In 2006, Intel ...
- Java多线程面试题归纳
1.多线程有哪几种实现方法?举个样例说明下线程的同步. (1)Java多线程有两种实现方式:继承Thread类和实现Runnable接口,Thread就是实现了Runnable接口. 两个最简单的线程 ...
- 关于数组类型的json解析方法
遇到了非常奇葩的数组类型的json,一时解析不出来,用jsonObject会直接报错. Json数据如: [{"id":"1000142","name ...