windows C/C++系列 64位汇编

news2024/9/9 0:12:49

Visual Studio 包括 32 位和 64 位托管版本的 MASM(Microsoft 宏汇编程序),面向 x64 代码。 它的名称为 ml64.exe,是接受 x64 汇编程序语言的汇编程序。 当你在 Visual Studio 安装期间选择 C++ 工作负荷时,会安装 MASM 命令行工具。 MASM 工具不可单独下载。 有关如何下载并安装 Visual Studio 副本的说明,请参阅安装 Visual Studio。 如果只需要命令行工具,而不需要完整的 IDE,请下载 Visual Studio 生成工具。

若要在命令行上使用 ml64.exe,请启动适用于 x64 目标的开发人员命令提示符。 开发人员命令提示符会设置所需的路径和其他环境变量。

x64 或 ARM64 目标不支持内联汇编程序,也不支持使用 ASM 关键字。 若要将使用内联汇编程序的 x86 代码移植到 x64 或 ARM64,可以将代码转换为 C++、使用编译器内部函数或创建汇编程序语言源文件。 Microsoft C++ 编译器支持内部函数,允许你以尽可能接近跨平台方式的方式使用特殊函数指令,例如特权、位扫描或测试、互锁等。 有关可用内部函数的信息,请参阅编译器内部函数。

将汇编程序语言文件添加到 Visual Studio C++ 项目

Visual Studio 项目系统支持在 C++ 项目中使用 MASM 生成的汇编程序语言文件。 MASM 完全支持 x64 汇编程序语言源文件,并将其生成到对象文件中。 然后,你可以将这些对象文件链接到为 x64 目标生成的 C++ 代码。 这是克服缺少 x64 内联汇编程序的一种方法。

将汇编程序语言文件添加到现有 Visual Studio C++ 项目的步骤

1. 在解决方案资源管理器中,选择项目。 在菜单栏上选择“项目”、“生成自定义”。

2. 在“Visual C++ 生成自定义文件”对话框中,选中 masm(.targets,.props) 旁边的复选框。 选择“确定”以保存你的选择并关闭对话框。

3. 在菜单栏上,依次选择“项目”、“添加新项”。

4. 在“添加新项”对话框的中心窗格中,选择“C++ 文件(.cpp)”。 在“名称”编辑控件中,输入扩展名为 .asm 而非 .cpp 的新文件名。 选择“添加”以将文件添加到项目并关闭对话框。

5. 在asm上右键,选择属性:

注意需要先应用了,才会出现下面的选项:

 这里是在添加的 .asm 文件中创建汇编程序语言代码。 生成解决方案时,将调用 MASM 汇编程序以将 .asm 文件汇编成一个对象文件,然后将其链接到项目中。 若要简化符号访问,请在 C++ 源代码中将汇编程序函数声明为 extern "C",而不是在汇编程序语言源文件中使用 C++ 名称修饰约定。

特定于 ml64 的指令

可以在面向 x64 的汇编程序语言源代码中使用以下特定于 ml64 的指令:

.ALLOCSTACK: 针对序言中的当前偏移生成具有指定大小的 UWOP_ALLOC_SMALL 或 UWOP_ALLOC_LARGE;对于给定的大小,MASM 将会选择最高效的编码。ALLOCSTACK 允许 ml64.exe 用户指定帧函数的展开方式,并且仅允许在序言中展开,该序表从 PROC FRAME 声明扩展到 PROC FRAME 声明 .ENDPROLOG 指令。 这些指令不生成代码;它们仅生成 .xdata 和 .pdata。 .ALLOCSTACK 前面应有实际实现要撤消的操作的说明。 最好将展开指令和代码包装在宏中,以确保一致。size 操作数必须是 8 的倍数l

.ENDPROLOG: 指示序言声明的结尾l

.PUSHFRAME:生成 UWOP_PUSH_MACHFRAME 展开代码条目。 如果指定了可选的 CODE 关键词,则为展开代码条目提供修饰符 1。 否则修饰符为 0l

.PUSHREG:使用序言中的当前偏移为指定寄存器编号生成 UWOP_PUSH_NONVOL 展开代码条目l

.SAVEREG:使用当前序言偏移为指定的寄存器 (reg) 和偏移(offset)生成 UWOP_SAVE_NONVOL 或 UWOP_SAVE_NONVOL_FAR 展开代码条目。 MASM 将会选择最高效的编码l

.SAVEXMM128:使用当前序言偏移为指定 XMM 寄存器和偏移生成 UWOP_SAVE_XMM128 或 UWOP_SAVE_XMM128_FAR 展开代码条目。 MASM 将会选择最高效的编码l

.SETFRAME: 使用指定寄存器 (reg) 和偏移 (offset) 在展开信息中填充帧寄存器字段和偏移。 偏移必须是 16 的倍数,并且小于或等于 240。 此指令还使用当前序言偏移为指定寄存器生成 UWOP_SET_FPREG 展开代码条目l

PROC 指令也已更新,可以与 ml64.exe 配合使用。标记名为标签的过程块的开始和结束。 可以使用 CALL 指令或 INVOKE 指令调用块中的语句l

32 位地址模式(地址大小替代)

如果内存操作数包含 32 位寄存器,MASM 将发出 0x67 地址大小替代。 例如,以下示例导致发出地址大小替代: 

mov rax, QWORD PTR [ecx]
mov eax, DWORD PTR [ecx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10d+0100h]
prefetch [eax]
movnti rax, QWORD PTR [r8d]

如果 32 位置换单独显示为内存操作数,则 MASM 会假定 64 位寻址。 目前不支持使用此类操作数进行 32 位寻址。

最后,在内存操作数中混合使用寄存器大小(如以下代码所示)会生成错误。

mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运维】远程控制与访问的协议(域,工作组,RDP,ARD,VNC,SSH,SCP)和工具(DDNS,跳板机,堡垒机)

【运维】远程控制与访问的协议(域,工作组,RDP,ARD,VNC,SSH,SCP)和工具(DDNS,跳板机,堡垒机) 文章目录 1、远程访问协议1.1 组织&#…

基于 SASL/SCRAM 让 Kafka 实现动态授权认证

一、说明 在大数据处理和分析中 Apache Kafka 已经成为了一个核心组件。然而在生产环境中部署 Kafka 时,安全性是一个必须要考虑的重要因素。SASL(简单认证与安全层)和 SCRAM(基于密码的认证机制的盐化挑战响应认证机制&#xff…

傻瓜式PHP-Webshell免杀学习手册,零基础小白也能看懂

项目描述 一、PHP相关资料 PHP官方手册: https://www.php.net/manual/zh/ PHP函数参考: https://www.php.net/manual/zh/funcref.php 菜鸟教程: https://www.runoob.com/php/php-tutorial.html w3school: https://www.w3school…

网络流量分析>>pcapng文件快速分析有用价值解析

引言 在网络安全和流量管理中,解析网络协议数据包是了解网络行为和检测潜在威胁的关键步骤。本文介绍了如何使用Python解析和分析TCP、UDP和ICMP协议的数据包,并统计端口的访问次数。本文的示例代码展示了如何处理不同协议的数据包,提取关键…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞,通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段,对评估网络系统安全防护及措施至关重要,因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

前端面试宝典【vue篇】【3】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

phpenv安装redis扩展

1、下载dll文件 https://pecl.php.net/package/redis 我的是php8.1, 安装最新版的 DLL文件 2、将dll文件放到php安装目录的ext目录下 3、在php.ini中增加配置后重启服务 [Redis] extension php_redis.dll

自研Vue3开源Tree组件:节点拖拽bug修复

当dropType为after,且dropNode为父节点时,bug出现了: bug原因:插入扁平化列表的位置insertIndex计算的不对: 正确的逻辑,同inner要算上子孙节点所占的位置: bug修复!

vue里给img的src绑定数据失效

起因 在v-for遍历数据时想要通过给img的src单向绑定 图片路径时出现问题 解决过程 上网查说是webpack构建时识别不到,直接不单绑数据,写死试试看 解决方案 直接require导入图像文件模块

【C语言】VS的实用调试技巧

0. 前言 VS(Visual Studio)是集成开发环境,其内置了多种调试工具和技巧帮助开发人员在开发过程中解决问题。包含断点、监视窗口、自动窗口、调用堆栈等,通过这些技巧,开发人员可以有效地调试和解决程序中的问题。我们在VS编译器上写代码&…

yolov10在地平线旭日X3派上的部署和测试(Python版本和C++版本)

0、搭建开发环境 当前的测试根据一下的步骤并修改源码是可以实现yolov8的板端运行,如果不想再搭建环境和测试代码bug上浪费更多的时间可以直接获取本人的测试虚拟机,所有的测试代码、虚拟环境和板端测试工程以全部打包到了虚拟机,需要的可以…

微前端概念

微前端作用 大型应用程序的拆分独立的前端子应用降低程序复杂性&#xff0c;提高开发效率 微前端能力 js隔离css隔离元素隔离生命周期预加载数据通信应用跳转多层嵌套… 微前端实现方案 IframeSingle-spaQiankunMicro-app Iframe <iframe src"https://www.examp…

【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫

1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站&#xff0c;拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而&#xff0c;由于数据的复杂性和数据来源的多样性&#xff0c;如何有效地采集、存储和展示这些数…

巴黎OSGB倾斜摄影数据详细介绍

北京时间7月27日&#xff0c;第33届夏季奥林匹克运动会开幕式在法国巴黎举行&#xff0c;巴黎成为继伦敦后&#xff0c;第二个三度举办夏季奥运会的城市&#xff0c;此次为法国相隔100年后再次举办夏季奥运会&#xff0c;前两次分别在1900年及1924年。开幕式上&#xff0c;巴黎…

Shader入门精要总结(二)矩阵

1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘&#xff0c;它们的结果AB将会是一个rc大小的矩阵&#xff0c;不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#…

【WEB安全】 PHP基础文件知识完整教学中(超详细)

文章目录​​​​​​​ 1.PHP 文件处理 PHP 操作文件 PHP 文件打开/读取/关闭 ​​​​​​​文件的 复制 删除 重名 ​​​​​​​文件的判断 2.PHP获取文件属性 3.PHP目录操作 4.命名空间 PHP 命名空间可以解决以下两类问题&#xff1a; 5.正则表达式 正则表达…

网站后端管理和构建java项目的工具-Maven

maven是用于管理和构建java项目的工具。 管理Jar包 无论是使用eclipse、IDEA创建的maven项目&#xff0c;格式都是统一的。 不同开发工具创建的maven项目兼容。 test是对main测试的代码。main中的resources中放置配置文件。 对于Maven&#xff0c;一个Maven项目就是一个对象…

《基于深度学习的目标检测算法综述论文的解读》

论文阅读&#xff1a;《基于深度学习的目标检测算法综述论文的综述》的总结 作者 &#xff1a; 包晓敏&#xff0c;王思琪 ( 浙江理工大学 信息学院&#xff0c;浙江 杭州 310018) 本文章介绍了两阶段深度学习算法和单阶段深度学习算法。 一、目标检测的定义&#xff1a; 目…

Qt Designer,仿作一个ui界面的练习(二):部件内容的填充

有了完成了布局的基本框架设计之后&#xff0c;对各个部件逐步完成内容的填充。 一、还是从顶边栏开始&#xff1a; 1、在顶边栏的topLogo里面拖入一个QLabel&#xff08;标签&#xff09;&#xff0c;命名为logoImage&#xff0c;删除标签的文字。 2、右键点击topLogo&#x…

[Linux安全运维] LAMP 环境搭建保姆级教学(Apache + MySQL + PHP) ~~

LAMP LAMP 是一种网站技术&#xff0c;可以实现动态的网站页面部署。 1. LAMP概述 1 .1构成 Linux: 简介: Linux 是一种开源的操作系统&#xff0c;以其稳定性和安全性而著称。在 LAMP 堆栈中&#xff0c;它作为服务器操作系统运行。作用: 为应用程序提供一个稳定、安全的运…