【发布时间】:2020-08-25 19:21:25
【问题描述】:
我正在尝试学习汇编(MASM x64)并编写了一个简单的代码。
.code
main proc
mov rax, 1
mov rcx, 2
mov rdx, 0
div rcx
ret 0
main endp
end
现在我开始了一个调试过程以查看它是否有效(因为没有其他方法可以检查某些东西是否有效),并且在 div rcx 行,调试器开始将我一直拖到一些名为 exe_common.inl 的文件中, file_mode.cpp,回到 exe_common.inl,matherr.cpp,再回到 exe_common.inl,utility.cpp,再回到 exe_common.inl(这些是什么???????)。此时,有一段预处理器代码
#ifdef _RTC
_RTC_Initialize();
atexit(_RTC_Terminate);
#endif
在 _RTC_Initialize(); (第二行),程序关闭,消息 initsect.cpp not found。这到底是什么意思??? Stackoverflow 显示关于“initsect.cpp not found”的辉煌 0 结果,谷歌也没有帮助。 显然,当带有 ret 的行试图执行时,总是会发生同样的事情。我在 ret 之后擦除了 0,擦除了 main proc 和 main endp 之间的所有内容,并擦除了 ret 行。总是一样。这发生在 main endp 之前的行尝试执行时,无论它是什么。 它甚至发生在世界上最简单的代码中:
.code
main proc
ret 0
main endp
end
我正在使用 microsoft visual studio 2019 和 AMD x64-x86 CPU。
【问题讨论】:
-
你肯定没有一行代码只写
mov rdx? -
您能更详细地解释一下您为构建和运行代码所做的工作吗?
-
@Michael 我也有更长的代码,但它们都有相同的问题,所以我采用了最简单的代码来排除我犯错误的可能性。在 Nate,我运行了本地 Windows 调试器,正确标记了起点和终点(代码的起点和终点)并一直按 F11。当检测到上述问题时,我按 ctrl+F5 运行程序。命令提示符只是说程序以代码 blablabla 退出(只是一个没有任何意义的垃圾号)
-
这能回答你的问题吗? Why should EDX be 0 before using the DIV instruction? 关于奇怪文件的另一部分可能是因为 C++ 处理该异常的方式,您最终步入了所有这些混乱。 (即使你不是想写一个 C++ 程序,在 Visual Studio 中也很容易不小心写出来)
-
rex不是寄存器名称,因此这不是您的除法错误的minimal reproducible example。你的意思是mov rdx, 0?
标签: assembly x86-64 masm masm64