From:https://www.cnblogs.com/talenth/p/9135626.html

VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/article/details/64108715

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

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

但是当目标平台为x64时,微软不再允许直接内联汇编了。Visual C++ 至今都禁止 x64 编译模式下使用 __asm 关键字内联汇编。
每次要用汇编的时候都得另外开一个 ASM 文件写,然后 call 过去。

怎么解决这个问题呢? 一种办法是改用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 个 ==========

VS 编写 x64 内联汇编相关推荐

  1. x64内联汇编解决办法

    之前一直在x32上内联汇编用着好好的,五一换了电脑,win10 x64,想在一个点停下,结果在用__asm{}的时候vs2015报错说在本结构上不支持该拓展--一路慢慢Google vs2015 co ...

  2. mupdf不支持x64_x86平台转x64平台关于内联汇编不再支持的解决

    工具:VS2005  编译器:cl.exe(X86 C/C++)  ml64.exe(X64 ASM64) 前提:X86下内联汇编是嵌在函数当中实现的 在X86平台下,可以轻松的在C/C++代码中嵌入 ...

  3. VS2015默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)

    截至目前(2018年底2019年初),本人windows平台下的各种开发所用的IDE主要就是VS2015.虽然VS2017已经出来一年多了,本人也自己使用过一段时间,但没发现特别大的亮点,又考虑到整个 ...

  4. Visual studio 默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)

    Windows下使用内联汇编方法很简单.使用 __asm 关键词结构作为制导就可以. __asm{ // Assembly Codes here } 但是,Visual Studio目前只支持32位( ...

  5. 一步步编写操作系统80 扩展内联汇编1

    由于基本内联汇编功能太薄弱了,所以才对它进行了扩展以使其功能强大.不过,易用性往往与功能强弱是成正比的,如您所料,扩展内联汇编确实有点难,但在求知欲的驱使下,就让咱们痛并快乐着吧. gcc本身是个c编 ...

  6. 一步步编写操作系统 79 在c代码中内联汇编

    基本内联汇编是最简单的内联形式,其格式为: asm [volatile] ("assembly code") 各关键字之间可以用空格或制表符分隔也可以紧凑挨在一起不分隔,各部分意义 ...

  7. 一步步编写操作系统 77 内联汇编与ATT语法简介

    内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件. 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就 ...

  8. 汇编程序设计与计算机体系结构软件工程师教程笔记:内联汇编与宏

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

  9. 在Visual C++ 中使用内联汇编

    一. 优点 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤.在 Visual C++ 中,内联汇编是内置的编译器,因此不需要配置诸如 MASM 一类的独立汇编工 ...

最新文章

  1. 从两个bug来看Javascript的装载
  2. python3.4.4怎么打代码_Python3.4里面__name和__main__的作用
  3. 使用.reg文件删除暴风影视库图标和注册信息
  4. [Mysql]备份同库中一张表的历史记录 insert into ..select
  5. SAP透明工厂和弹性制造的原型mockup - SAP 工业 4.0 的一个尝试
  6. pyinstaller---将py文件打包成exe
  7. python 线程锁_python多线程编程(3): 使用互斥锁同步线程
  8. java输出减法表,Calendarjava时间加减法和格式化输出
  9. eclispe中相关操作
  10. 8客户端安装后无法启动_QQ下载几天后无法启动、无法运行——可能与火绒有关...
  11. VMware下安装Linux,Centos-7-x86_64-NetInstall.iso版本
  12. ORACLE EXP/IMP的使用详解 (解决9i(window)导入到10G的乱码问题)
  13. 规范 : disable account
  14. Python的视频分析
  15. pytorch实现NS方程求解-基础PINN
  16. videojs-dynamic-watermark: video.js 视频添加文字水印
  17. 使用ShareSDK实现QQ登录和分享操作
  18. 关于字符、字符集、编码和Unicode
  19. android仿微信图片编辑库,Android仿微信图片选择器
  20. 监控实时直播的四分屏的前端展示

热门文章

  1. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作
  2. 论文浅尝 - IJCAI2020 | Mucko:基于事实的多层跨模态知识推理视觉问答
  3. 基于 CNN 的中文对话情感分析
  4. Tensorflow2.0模型构建与训练
  5. CSS:盒子模型和清除float浮动的三种常用方法
  6. [vagrant]vagrant centos静态ip设置
  7. Android——检查网络是否已经链接
  8. Oracle 配置监听和本地网络服务
  9. 动手解决jar转txt软件的一个缺陷
  10. dubbo-快速入门-分布式RPC框架Apache Dubbo