-2

我正在尝试学习汇编(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。

4

2 回答 2

1

无论您是否有意,您都已将您的程序与 Visual Studio C++ 运行时相关联。您正在单步执行的代码执行 C++ 运行时和 C++ 程序正确运行所需的启动初始化。最终,一旦完成,它将调用您的main函数,就像您构建了一个 C++ 程序一样。

于 2020-08-26T19:49:47.823 回答
-1

Ross Ridge 是对的,汇编器显然将程序与 C 运行时联系起来。他忘了说的是我需要在 _START 之前设置一个入口点:为了避免这种情况,感谢大家的帮助(讽刺),特别感谢 Youtube 上的 DFpercush(不是讽刺)。

于 2020-09-20T18:49:52.503 回答