【问题标题】:source not found initsect.cpp找不到源 initsect.cpp
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 好吧,我觉得我不太明白。但是现在怎么解决呢?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2016-12-14
    • 2013-12-04
    • 2012-01-19
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多