【问题标题】:How to debug an "unresolved externals" error when trying to compile assembly?尝试编译程序集时如何调试“未解决的外部”错误?
【发布时间】:2019-01-05 11:14:57
【问题描述】:

我正在使用 Visual Studio 2013 并尝试编写“原始”程序集。我刚开始学习汇编,所以我不太了解它,但如果可能的话,我想编写汇编,而不用 C/C++ 或任何其他语言包装它。

我有一个文件 main.asm,其中包含我正在尝试运行的以下代码。我只是想确认我可以运行一个 asm 程序,以便在阅读汇编的工作原理时可以使用代码。

.MODEL FLAT
.code
    neg eax
    add eax,5 ;eax = eax -5
END

编译时出现以下错误:

Error   1   error LNK2001: unresolved external symbol _main 
Error   2   error LNK1120: 1 unresolved externals

我该如何解决这个问题并了解正在发生的事情?

【问题讨论】:

  • 请注意,即使您的代码会链接,它也很可能在到达add eax,5 后崩溃,因为您没有添加代码来关闭进程。 CPU 不知道您的程序在那里结束并继续执行 RAM 中的任何内容。
  • 如果您不需要 C 运行时,那么在 .code 之后添加标签 _main: 。在add eax,5 之后添加ret 然后将END 更改为END _main

标签: visual-studio assembly linker-errors masm


【解决方案1】:

CRT 启动代码想要调用一个名为 main(或 asm 中的 _main)的函数。你没有提供一个,所以你的程序没有链接。

与编译缺少main 函数的C 程序完全相同的错误。去寻找一些 MASM 语法 hello world 或声明函数的例子。例如,How to write hello world in assembler under Windows? 有一个 MASM 答案(该问题被标记为 NASM,因此大多数答案都是针对 NASM,这是英特尔语法汇编的另一种主要风格。)

对 SO 的其他点击包括 x86 masm hello world,它从静态可执行文件手动调用 CRT 初始化函数,因此如果您只是编写一个简单的 C 程序的等价物,那么它比您需要的更复杂。


和/或使用PROC / END 查看编译器生成的 asm 输出以了解其工作原理http://godbolt.org/ 已安装 MSVC,以及 gcc / clang(发出 GAS 语法)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多