问题标签 [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.
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。
assembly - X64 ASM:可以注册 256 位 MOV 吗?
我有一个 256 位数据结构(一个 4 int64 数组),我需要在 X64 汇编程序中加载和执行(整数)加法。我没有做 4 个 MOV,而是尝试用一条指令加载所有 4 个。这可能吗?我想我可以用 MOVDQA 来做,但这显然只会加载到 XMM 寄存器中,从那里我唯一的选择是做一个浮点加法,这不是我需要的。
编辑:当前例程是:
assembly - 改变一大块内存的字节序
我将 64 字节的连续内存组织成大端 DWORD。我想复制这些数据并在其他地方组织成小端。我可以在 DWORD 之后执行该 DWORD,例如:
但我觉得有一种更有效的方法,使用xmm
/ ymm
/寄存器和/zmm
等指令。问题是,那些只覆盖复制部分,没有设置字节序。所以我的问题是 - 有没有什么聪明的方法可以将如此大的数据块组织成 DWORD,或者我必须手动完成,如片段所示?或者也许还有另一种不涉及上述任何一种的有效方式?vmovdqa
vmovdqu
编辑:在@Erik Eidt 发表评论后,我改变了问题,因为原来的措辞令人困惑,并没有准确地描述手头的问题。
c - 如何调整嵌入 C 的 32 位 MMX MASM 代码以编译为 64 位?
我正在尝试将继承的 32 位 Windows 应用程序转换为 64 位。我挂断了嵌入在 32 位 C 文件中的这个位:
'x' 是 C 中的结构。
根据 MASM 64 位的要求,我将 ASM 重构为一个外部文件,如下所示:
在编译时,我收到此错误:
在“punpcklbw”线上
这似乎可能是 64 位/32 位之间的不匹配,但我无法确切说明原因或如何修复它。
assembly - A2022 操作数的大小必须相同 - 将 DB 的地址放入寄存器
我写了一个简单的 Hello World 程序,当我运行它时,我有这个错误:“错误 A2022:指令操作数必须是相同的大小”。
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 表达式计算器会自动对数字进行符号扩展。符号扩展只能影响从0x80000000到0xFFFFFFFF的数字。也就是说,符号扩展只影响可以写入 32 位且高位等于 1 的数字。
例如,当调试器将其视为 64 位数字时,数字 0x12345678 始终保持为 0x0000000012345678。另一方面,当 0x890ABCDE 被视为 64 位值时,它可能会保持 0x00000000890ABCDE 或 MASM 表达式评估器可能会将其符号扩展为 0xFFFFFFFF890ABCDE。
这是符号扩展的指令的不完整列表:
offset64.asm
要构建示例,请创建一个makeit64.bat,如下所示:
运行批处理文件会创建此输出。(没有警告或错误)
沉默的 MASM
没有警告、错误和跳转等于 FALSE。例如,
生成
问题:是否有完整的易于签名扩展的指令列表?
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
为文件
assembly - 为什么我在下面的汇编代码中收到此错误?
这是我第一次在 MASM 中运行 x64 的汇编代码:
我得到一个链接器错误LNK2001: unresolved external symbol mainCRTStartup
。为什么?
我main
在属性>链接器>高级>入口点中有入口点
PS:代码在 x86 中按预期组装和执行。