问题描述
我正在尝试学习Assembly(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。这到底是什么意思??? Stackoverflow显示有关“未找到initsect.cpp”的辉煌结果0,而google也无济于事。 显然,当带有ret的行尝试执行时,总是会发生相同的事情。撤消后我已擦除了0,擦除了主进程和主endp之间的所有内容,并擦除了撤消线。总是一样。无论主endp之前的行试图执行什么,都会发生这种情况。 它甚至通过世界上最简单的代码发生:
.code
main proc
ret 0
main endp
end
我正在使用Microsoft Visual Studio 2019和AMD x64-x86 CPU。
解决方法
无论您是否打算,都已将程序与Visual Studio C ++运行时链接。您逐步执行的代码将执行C ++运行时和C ++程序需要正确运行的启动初始化。最终,一旦完成,它将调用您的main
函数,就像您构建了C ++程序一样。
罗斯·里奇(Ross Ridge)是正确的,汇编器显然将程序与C运行时链接在一起。他忘了说的是,我需要通过_START设置一个入口点:为避免这种情况,谢谢大家的帮助(讽刺),尤其感谢DFpercush的Youtube(不是讽刺)。