问题标签 [masm64]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
117 浏览

assembly - 找不到源 initsect.cpp

我正在尝试学习汇编(MASM x64)并编写了一个简单的代码。

现在我开始了一个调试过程以查看它是否有效(因为没有其他方法可以检查某些东西是否有效)并且在 div rcx 行,调试器开始将我一直拖到一些名为 exe_common.inl、file_mode.cpp 的文件中,回到 exe_common.inl、matherr.cpp,再回到 exe_common.inl、utility.cpp,再回到 exe_common.inl(这些是什么???????)。此时,有一段预处理器代码

在 _RTC_Initialize(); (第二行),程序关闭,消息 initsect.cpp not found。这到底是什么意思???Stackoverflow 显示关于“initsect.cpp not found”的辉煌 0 结果,谷歌也没有帮助。显然,当带有 ret 的行试图执行时,总是会发生同样的事情。我在 ret 之后擦除了 0,擦除了 main proc 和 main endp 之间的所有内容,并擦除了 ret 行。总是一样。这发生在 main endp 之前的行尝试执行时,无论它是什么。它甚至发生在世界上最简单的代码中:

我正在使用 microsoft visual studio 2019 和 AMD x64-x86 CPU。

0 投票
2 回答
406 浏览

c++ - 为什么在visual studio x64(MASM)上gs段寄存器的地址设置为0x0000000000000000?

我目前正在阅读“终极反调试参考”,并且正在尝试实施一些技术。

要检查 NtglobalFlag 的值,他们使用此代码 -

我对在 Visual Studio 2017 上运行 x64 代码进行了所有正确的调整,我使用了本教程。

我使用此指令访问 NtGlobalFlag

lodsq gs:[rsi]

因为他们的语法在 Visual Studio 上不起作用。

但是,它仍然没有用。

在调试时,我注意到gs寄存器的值设置为 0x0000000000000000,而fs寄存器设置为实际值 0x0000007595377000。

我不明白为什么GS的值为零,因为它的值应该设置在 x64 上。

0 投票
0 回答
112 浏览

assembly - X64 ASM:可以注册 256 位 MOV 吗?

我有一个 256 位数据结构(一个 4 int64 数组),我需要在 X64 汇编程序中加载和执行(整数)加法。我没有做 4 个 MOV,而是尝试用一条指令加载所有 4 个。这可能吗?我想我可以用 MOVDQA 来做,但这显然只会加载到 XMM 寄存器中,从那里我唯一的选择是做一个浮点加法,这不是我需要的。

编辑:当前例程是:

0 投票
0 回答
34 浏览

assembly - 改变一大块内存的字节序

我将 64 字节的连续内存组织成大端 DWORD。我想复制这些数据并在其他地方组织成小端。我可以在 DWORD 之后执行该 DWORD,例如:

但我觉得有一种更有效的方法,使用xmm/ ymm/寄存器和/zmm等指令。问题是,那些只覆盖复制部分,没有设置字节序。所以我的问题是 - 有没有什么聪明的方法可以将如此大的数据块组织成 DWORD,或者我必须手动完成,如片段所示?或者也许还有另一种不涉及上述任何一种的有效方式?vmovdqavmovdqu

编辑:在@Erik Eidt 发表评论后,我改变了问题,因为原来的措辞令人困惑,并没有准确地描述手头的问题。

0 投票
0 回答
33 浏览

c - 如何调整嵌入 C 的 32 位 MMX MASM 代码以编译为 64 位?

我正在尝试将继承的 32 位 Windows 应用程序转换为 64 位。我挂断了嵌入在 32 位 C 文件中的这个位:

'x' 是 C 中的结构。

根据 MA​​SM 64 位的要求,我将 ASM 重构为一个外部文件,如下所示:

在编译时,我收到此错误:

在“punpcklbw”线上

这似乎可能是 64 位/32 位之间的不匹配,但我无法确切说明原因或如何修复它。

0 投票
0 回答
28 浏览

assembly - A2022 操作数的大小必须相同 - 将 DB 的地址放入寄存器

我写了一个简单的 Hello World 程序,当我运行它时,我有这个错误:“错误 A2022:指令操作数必须是相同的大小”。

0 投票
0 回答
104 浏览

assembly - 检测立即 32 位操作数 (imm32) 的潜在 MASM 64 位符号扩展错误

我正在尝试编写一个工具来扫描 64 位汇编代码以查找可能的符号扩展错误。
例如,假设一个 32 位常量 (imm32) 定义为

接下来,调用任何返回 SOCKET_ERROR(32 位整数)的 API,并将结果存储在 64 位变量retval中。但是,将retval与 SOCKET_ERROR_INT 进行比较会生成

请注意 SOCKET_ERROR_INT (imm32) 符号扩展为 64 位!(见下表:cmp m64, imm32)但是,qword ptr [rbp-8]0FFFFFFFFh ( retval ),所以比较阴险地失败了!

笔记

立即操作数 (imm32) 是常量值或常量表达式的结果。汇编器在汇编时将立即值编码到指令中。

在某些情况下,MASM 表达式计算器会自动对数字进行符号扩展。符号扩展只能影响从0x800000000xFFFFFFFF的数字。也就是说,符号扩展只影响可以写入 32 位且高位等于 1 的数字。

例如,当调试器将其视为 64 位数字时,数字 0x12345678 始终保持为 0x0000000012345678。另一方面,当 0x890ABCDE 被视为 64 位值时,它可能会保持 0x00000000890ABCDE 或 MASM 表达式评估器可能会将其符号扩展为 0xFFFFFFFF890ABCDE。

这是符号扩展的指令的不完整列表:

offset64.asm

要构建示例,请创建一个makeit64.bat,如下所示:

运行批处理文件会创建此输出。(没有警告或错误)

沉默的 MASM

没有警告、错误和跳转等于 FALSE。例如,

生成

问题:是否有完整的易于签名扩展的指令列表?

0 投票
0 回答
81 浏览

assembly - VS2019 编译 asm 时无法打开文件 .obj

在尝试设置 Visual Studio 2019 来编译 .asm 项目时,出现错误。

我创建了一个空的 c++ 项目并添加了一个Main.asm文件。我尝试了 MASM 和 NASM 并得到相同的错误:

NASM 和 MASM 都产生相同的错误。提到的.obj文件也不存在于该位置。手动编译时,它可以正常工作。

我按照我能找到的所有指南进行设置,但无济于事。

我在尝试之间删除并重新安装了所有内容。

最初我认为它与 MASM(我首先尝试过)有关,但由于 NASM 给出了相同的错误,所以在我看来它是另外一回事。不幸的是,我不知道是什么。

在编译之前,我验证了适用汇编程序的构建扩展已启用,并且 .asm 文件具有相应的项目类型。

任何帮助是极大的赞赏。

作为参考,我尝试编译的 .asm (NASM):来自https://cs.lmu.edu/~ray/notes/nasmtutorial/

MASM 文件:

我进行重建时的输出:

当我dir为文件

0 投票
1 回答
86 浏览

assembly - 为什么我在下面的汇编代码中收到此错误?

这是我第一次在 MASM 中运行 x64 的汇编代码:

我得到一个链接器错误LNK2001: unresolved external symbol mainCRTStartup。为什么?

main在属性>链接器>高级>入口点中有入口点

PS:代码在 x86 中按预期组装和执行。

0 投票
0 回答
44 浏览

assembly - x64 中的这段代码有什么问题?它在 VS2019 中不返回 0

下面的代码片段在 VS2019 版本 16.11.3 中不返回 0。为什么?

控制台窗口如下所示:

在此处输入图像描述