问题标签 [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.
x86-64 - 使用 MASM 64 位时的 LNK1104
我目前正在尝试为 x64 Windows 学习 Assembly。我尝试了这个 Intel website的示例代码,但每当我尝试使用文档中给出的命令编译它时:
我总是得到一个
LNK1104 错误
我知道这意味着编译器找不到库文件,我搜索了这个问题并很快发现我需要带有 Windows SDK 的 Visual Studio,我下载并安装了它。但仍然无法在 Windows 系统文件以外的任何文件中找到kernel32.lib
或。user32.lib
我尝试了一切,但我根本无法修复它。我希望有人可以帮助解决这个问题。
masm - 无法打开输入文件 Resources.res
请帮助我解决这个问题,当我在 MASM64 中构建任何项目时,我搜索了很多并没有找到答案,我收到了这个错误
我尝试了许多 ML64.exe 文件和 rc.exe 文件,但我无法解决问题即使我安装了新窗口,我也尝试了所有解决方案,但问题是一样的
windows - 为什么 WriteConsoleW 在使用 ml64 调用 CoInitialize 后会中断
我正在尝试使用 Visual Studio 2019 中的 ml64.exe 通过 64 位程序集执行一些 Office 自动化。在调用 Office COM 接口之前,我需要调用 CoInitialize。我目前正在测试初始化 COM 并写入控制台(我通常不编写汇编代码)如果我注释掉行
WriteConsoleW api 调用按预期工作并向屏幕输出消息“COM 无法初始化”但是,一旦我将调用 CoInitialize 添加回来,控制台屏幕就没有任何输出,并且也会崩溃。
在调用 CoInitialize 之前,WinDbg 显示以下寄存器状态:
在调用 CoInitialize 之后,有以下寄存器状态:
调用 GetStdHandle 后:
在调用 WriteConsoleW 时,参数似乎仍然正确,但没有输出到屏幕:
我尝试改用 CoInitializeEx 并遇到同样的问题:
assembly - 将汇编脚本与资源文件链接
我正在尝试将我的汇编脚本与使用 ResEdit 制作的资源文件链接起来,这两个文件都属于与 .bat 文件相同的目录:
结果,我得到了 .exe 文件,该文件应该在屏幕上显示一个对话框,但打开它后什么也没有发生。链接后我也得到了一些不会正常进行的快捷方式文件(当我在链接期间没有使用任何 .res 文件时)。我不确定我做错了什么。我也尝试使用cvtres.exe
将 .res 文件转换为 .obj 文件并将其替换为 .bat 文件,但结果是相同的。汇编代码是正确的,因为我是从书中复制的。
winapi - 汇编语言中堆栈上阴影区域的大小
我在网上某处找到了下面的示例程序。它的各种副本比比皆是,通常差异很小。但我的问题涉及从 Windows API 调用函数时堆栈顶部的阴影区域的大小。如图所示,这个程序完美地工作,从堆栈指针中减去十进制 40,以便为寄存器中传递的 4 个参数留出空间,再加上一个。但是,在这种情况下,没有第 5 个参数,但如果将sub rsp, 40
更改为sub rsp, 32
,并且没有进行其他更改,则不再显示“Hello world”窗口!为什么当只涉及 4 个参数时,所有参数都在寄存器中传递,是否仍然需要在堆栈顶部保留 40(5*8)字节而不是仅 32(4*8)字节?
winapi - Calling FormatMessageA from a 64 bit assembler program
I've been working for days on an assembler subroutine to call Windows API function FormatMessageA, and I think I must have some systematic misunderstanding. My routine is shown below. I have traced it in debug mode, and I know that at the time the function is called: rcx has hex 1B00, which is the flag values I specified (dwFlags); rdx has hex 33, which is the bogus initial handle value that I plugged in to provoke the error (lpSource); r8 has 6, which is the error message number that was returned by GetLastError, which equates to ERROR_INVALID_HANDLE (dwMessageId); r9 has 0, for default language (dwLanguageId); rsp+32 has the address of msgptrp, which is my area to receive the address of the error message as allocated by the called function (lpBuffer); rsp+40 has hex 28, or decimal 40, which is the minimum number of characters I arbitrarily specified for the error message (nSize); and rsp+48 has the address of argmntsp, which according to the documentation should be ignored with the flags I specified (*Arguments).
If there's a problem, and obviously there is since rax is returned as zero, I suspect that it has to do with lpBuffer, which the documentation says has data type LPTSTR, whatever that is. Sometimes I want to shout, "Okay, that's what it is in terms of C++, but what is it really? I hope someone can easily spot where I ran off the rails, because I'm at my wits' end with this, and it's something I need to get working in order to do effective error checking for my future endeavors.
#xA;assembly - 在 Treeview 中插入它们时我得到空项目
我在使用 Treeview 控件时遇到问题,当我尝试插入项目时,它显示第一行是空的,没有任何标题,如图所示: 图1
首先,我声明了一个名为 TreeCaption 的变量,其中包含项目标题:
然后我调用了插入新项目的过程:
这是程序:
我正在将 RadASM 作为 IDE 工作。
assembly - 尝试学习 x86 汇编,在简单的测试程序中得到奇怪的结果
我正在尝试从现代 x86 汇编语言编程的第 2 版中学习 x64 汇编语言的基础知识。
第 2 章中的第五个示例程序介绍了如何使用各种宽度参数执行简单的整数除法,并提供了一个简单的示例测试例程来展示结果。我遇到的问题是我似乎返回了一个错误的结果,并且我一生都无法理解为什么。
为例程提供的 C++ 代码如下:
对应的汇编程序是:
虽然代码似乎有意义,但与程序集实现相比,我从例程的 C++ 实现中得到了不同的输出(C++ 实现给出了 quo1、rem1 的预期结果——它是不正确的 quo2、rem2):
这让我摸不着头脑,为什么。我的猜测是我在某处遗漏了一个错字(尽管我从书籍 GitHub 页面的可下载代码中得到相同的结果)导致 ASM 部分中某处的溢出或截断。
社区的任何帮助将不胜感激,因为我知道我自己的知识不足以完全解决此问题。
assembly - 英特尔机器语言如何指定寄存器?
我一直在研究 Intel 机器语言,包括汇编列表中显示的生成代码和可执行文件本身的转储(由用 MASM 编写的程序生成)。我无法弄清楚机器指令中如何引用寄存器。我的 PC(当然还有很多其他的)有 16 个寄存器,所以需要 4 位来引用所有这些寄存器,从 0 到 15。作为一个例子,我查看了 lea 指令,因为它有一个 1 个字节的操作码,并且只有一个格式。这是汇编源代码:
Data2 位于程序数据部分的偏移量 5 处。这是生成的机器语言:
我知道十六进制 48 表示 64 位寄存器操作数,而 8D 是操作码,但其余的仍然是个谜。1F0000 的用途是什么?它是否引用了存储位置,这在所有三个指令中都相同?如果是这样,那么 05FE、0DF7 和 15F0 必须代表三个寄存器,但是用什么表示法呢?
我花了很多时间阅读https://software.intel.com/en-us/download/intel-64-and-ia-32-architectures-sdm-combined-volumes-1-2a-2b-2c -2d-3a-3b-3c-3d-and-4,但我觉得它不是很有帮助。例如,它从不对位和字节进行编号,以描述指令的哪些位服务于哪个功能,以及根据什么方案。它充满了细节,但基本上没有解释。
windows - 在 x64dbg 下运行的程序立即完成
我在 Windows 10 下使用 SourceForge 的 x64dbg 调试器,我一直遇到问题,我认为这可能是由于我自己的愚蠢,但到目前为止我无法确定它。
我正在使用 MASM 汇编程序,当我处理问题时,我通常会编写一个仅包含几条指令的程序,然后使用调试器对其进行跟踪,以查看在简单上下文中发生的确切情况。
我已经使用了一个名为 temp1 的程序几个星期了,现在突然当我用调试器运行这个程序时,调试数据在 x64dbg 屏幕上闪烁了几分之一秒,然后程序运行完成,如如果我点击了 Debug → Run without breakpoints。
我尝试向程序添加更多指令,但结果仍然相同。因此,我将程序重命名为 bozo,并以该名称组装和链接它,其中只有两条指令。当我bozo.exe
在 x64dbg 下运行时,它会在第一条指令处停止,没有问题。
这里会发生什么?使用不同的程序名称如何改变调试器的行为方式?