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

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]
  • 22
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows C/C++ 和游戏逆向辅助开发有很多关联。首先,C/C++是一种面向过程的编程语言,广泛应用于Windows平台的开发中。它与Windows操作系统的API密切结合,可以直接访问系统资源和硬件设备,提供了丰富的函数库和工具,方便开发人员进行系统级编程。因此,通过使用C/C++语言,可以更轻松地开发与Windows操作系统相关的应用程序,包括游戏逆向辅助工具。 其次,游戏逆向辅助开发指的是对游戏进行逆向工程,通过分析游戏代码和内存结构,开发出一些辅助工具来改变或增强游戏的功能。C/C++作为一种低级语言,可以与汇编语言相互配合,对游戏进行深入的逆向分析。通过C/C++的编程技术,可以编写一些底层的代码,进行内存读写、函数挂钩等操作,从而达到修改游戏功能或实现自动化的效果。 此外,C/C++还具备高性能和灵活性的特点,适合用于游戏逆向辅助开发。在游戏开发中,性能是一个关键因素,而C/C++可以提供更好的性能,使得底层的逆向辅助工具更加快速和高效。同时,C/C++还提供了丰富的数据类型和库函数,可以满足辅助工具的灵活需求。通过C/C++的编程技术,可以进行数据结构设计、算法优化等方面的工作,增强逆向辅助工具的功能和效果。 综上所述,Windows C/C++与游戏逆向辅助开发密切相关。通过使用C/C++语言,可以更加方便地开发与Windows操作系统相关的应用程序,而游戏逆向辅助开发就是其中之一。C/C++的高性能和灵活性使其成为游戏逆向辅助开发的重要工具,可以对游戏进行深入分析和修改,实现自动化和增强游戏功能的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值