编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式。

在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便。

但是当目标平台为x64时,微软不再允许直接内联汇编了,这给我们编程造成了一些不便。

怎么解决这个问题呢? 一种办法是改用Intel的编译器,它仍然支持内联汇编。

另一种办法还是用VS了,但是不能内联,需要把汇编部分单独写到一个asm文件里,然后在其它源文件中引用。

我参考了一些网上的说明,在这里把过程写详细些,方便自己,也方便他人。

主要过程:

一、在asm文件中单独编写功能函数

比如要实现一个64位的加法函数,原型如下:

ULONG64 myAdd(ULONG64 u1,ULONG64 u2);

那么新建一个文件,写入以下内容

.CODEmyAdd PROCadd rcx,rdxmov rax,rcxret
myAdd ENDPEND

将以上内容保存为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 0;
}

 二、设置asm文件的生成方式

在asm文件上点击右键,选择“属性”:

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

此时在“常规”下面就会出现“自定义生成工具”的条目。

点击它,设置“命令行”为  ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

设置输出为 $(IntDir)%(fileName).obj, 该项必须配置,否则VS认为该文件没有设置输出就会不处理它,同时它也告诉链接器到哪里去找这个obj文件。

上面的 $(IntDir)是一个宏,表示当前生成配置的目录,比如"x64\Debug"。

经过以上配置之后,asm文件编译生成的obj文件就会自动生成到相应配置的目录。

三、生成工程

全部配置完成以后,就可以愉快地生成工程了。正常的输出结果如下:

1>------ 已启动生成: 项目: testasm, 配置: Release x64 ------
1>生成启动时间为 2016/4/10 9:45:36。
1>InitializeBuildStatus:
1>  正在创建“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.
1>
1>ClCompile:
1>  stdafx.cpp
1>  testasm.cpp
1>Link:
1>  正在生成代码
1>  已完成代码的生成
1>  testasm.vcxproj -> F:\x64Program\testasm\x64\Release\testasm.exe
1>FinalizeBuildStatus:
1>  正在删除文件“x64\Release\testasm.unsuccessfulbuild”。
1>  正在对“x64\Release\testasm.lastbuildstate”执行 Touch 任务。
1>
1>生成成功。
1>
1>已用时间 00:00:01.11
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

如果没什么意外的话,就会生成成功了。如果你编写的asm文件有错误的话,在输出中也能看到相应的提示,改掉错误就可以了。

至此,又可以愉快地使用汇编了呢~

转载于:https://www.cnblogs.com/achillis/p/5369658.html

VS2010中编写x64汇编的具体方法相关推荐

  1. vs中imshow函数报错_Win7下VS2010中配置Opencv2.4.4的方法(32位和64位都有效)(亲测成功)...

    在vs2010下配置opencv是件痛苦的事情,一点点错误可能就会导致莫名其妙的报错,各种error让人郁闷不已,这里提供给大家一篇vs2010下配置opencv2.4.4的方法,我是64位的win7 ...

  2. 在VS2015中编写x86汇编

     参考教程: 作者:上下求索 VS2015,C嵌套汇编 & C,汇编相互调用 http://ylqhust.github.io/blog/2016/04/17/vs-clanguage-asm ...

  3. 32位visual studio中添加x64 ActiveX控件方法

    visual studio中创建ActiveX控件的方法可参考:https://blog.csdn.net/wangzhiyang925/article/details/38715605?tdsour ...

  4. 在VS2010中去掉ipch和sdf文件方法

    使用VS2010建立C++解决方案时,会生成SolutionName.sdf和一个叫做ipch的文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大.本文介绍两种方法使得在vs2010中不产 ...

  5. python 参数个数 同名函数_如何在python中编写不同参数的同名方法

    我在Java背景下学习Python(3.x). 我有一个python程序,我在其中创建一个personObject并将其添加到列表中.p = Person("John") list ...

  6. VS中使用nasm汇编编译器的方法

    nasm是一款可以可vs2003 甚至vc6.0兼容的汇编编译程序,在音视频底层解码的时候很容易用到汇编混合编译. 具体怎么操作哪? 一 下载nasm nasm.exe和ndisasm.exe作为加载 ...

  7. VS2010中水晶报表插件下载安装方法

    Visual Studio 2010默认不带水晶报表,需要安装一个水晶报表插件,首先下载此插件: http://downloads.businessobjects.com/akdlm/cr4vs201 ...

  8. VS 编写 x64 内联汇编

    From:https://www.cnblogs.com/talenth/p/9135626.html VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/arti ...

  9. Visual Studio 2010 中编写C代码的一些常见问题

    VS2010中编写C代码时常见的问题及相关解决办法 1.碰到VS2010调试的时候命令符窗口一闪而过,看不到自己的调试结果. 通过查找问题的解决方法并对方法进行了检验,得到以下几种解决方案 解决方案 ...

最新文章

  1. zTree 显示为‘aa’,当选择aa时,传的参数为‘22’
  2. Redux你的Angular 2应用--ngRx使用体验
  3. 在做技术面试官时,我是这样甄别大忽悠的——如果面试时你有这样的表现,估计悬
  4. Java学习手记2——多线程
  5. 【知识星球】颜值,自拍,美学三大任务简介和数据集下载
  6. 如何更改jupyter notebook显示为中文?
  7. 操作系统——实验壹——熟悉Linux基础命令及进程管理
  8. 【Java】使用For和递归解决不死神兔问题,求第20个月兔子的对数
  9. [数据结构]A*寻路算法
  10. CSDN Blog首页新增栏目和二级页面通告
  11. Yii-- DeleteAll连表删除报错问题的解决方法
  12. 美国域名总量增至8023万个:1月净增5.9万个
  13. Servlet3.0之八:基于Servlet3.0的文件上传@MultipartConfig
  14. 大会回顾丨游戏用户体验优化如何实践,看大咖怎么说(附PPT下载)
  15. 3种伺服电机控制方式
  16. java骑车与走路_骑行/步行路线规划
  17. “美亚杯”第三届中国电子数据取证大赛答案解析(个人赛)
  18. 中职双师型教师计算机培训总结,双师型教师计算机培训心得体会.doc
  19. 神经网络笔记1-三层BP神经网络
  20. D - National Railway (DP)

热门文章

  1. ctfshow-萌新-web9( 利用命令执行漏洞读取网站敏感文件)
  2. Oracle备份与还原(exp和imp),导出导入
  3. 用友U8常见问题之最大单据号修复语句
  4. hacker基础教程
  5. 翻身的废鱼——论PHP从入门到放弃需要多久?13
  6. 软件工程习题2第三小题
  7. 反编译工具Reflector ILSpy
  8. Linux利用list_head结构实现双向链表
  9. 素数和 mooc 翁恺
  10. Varnish——CDN推送平台(web页面批量清除缓存)