NASM:如何解决这些未解决的外部问题?

时间:2016-02-22 17:34:55

标签: linker nasm

我试图开始使用Paul A. Carter的书" PC汇编语言开始学习基本组装。"但是我无法运行卡特提供的第一个例子,所以我有点卡住,直到我弄清楚这一点。

我汇总了这个例子" first.asm"没有任何问题,但我无法弄清楚如何将这些文件:first.obj,driver.c,asm_io.obj链接到可执行文件中。在first.asm的评论部分,Carter提供了创建可执行文件的这些说明(我使用Windows 10,VS社区2015开发人员命令提示符):

    ; Using MS C/C++
    ; nasm -f win32 first.asm
    ; cl first.obj driver.c asm_io.obj

我正是这样做但我得到了一个致命的错误2未解决的外部,_printf和_scanf。我在同一目录中有我能想到的所有必要文件,并且我在该目录中进行编译。 Driver.c调用定义的函数,它使用名为" CDECL.h&#34 ;;的头文件。我在我的目录中有这个文件,但我不太了解这个头文件。我想知道问题是否在这里。我没有改变它或任何东西。根据卡特博士的指示,我组装了asm_io.asm。

asm_io.asm不太远看到这个:

    extern  _scanf, _printf, _getchar, _putchar, _fputs

所以这里是未解决的外部因素。不应该在stdio.h中定义它们吗? Driver.c包含stdio.h,链接器是否应该能够解析这些符号才能查看stdio.h?我可能会缺少什么?

PS。我是一般的编程新手,这是我的第一个堆栈溢出问题。我对任何批评/反馈持开放态度。如果您需要,我会提供更多信息,如果没有必要,我只是不想张贴大量的文字和代码。

1 个答案:

答案 0 :(得分:0)

欢迎来到SO。你需要明白: -

头文件之间的区别,例如

foo.h // C or maybe C++ header file)

,例如

foo.lib  foo.dll // Windows
libfoo.a, libfoo.so // Unix/Linux

实现(仅)在头文件中描述的调用接口。

编译或汇编源文件之间的区别,例如

bar.c // C source file
bar.asm // Assembly source, Windows
bar.s // Assembly source, Unix/Linux

制作目标文件。 e.g。

bar.obj // Windows
bar.o // Unix/Linux

链接目标文件和库一起构成一个完整的可执行文件。

只有在链接器提供时(或默认情况下才知道),链接才能成功 提供的目标文件和/或库的名称和位置 程序中调用的所有函数的实现 - 包括 调用接口在头文件中描述的函数。除此以外 未解决的符号错误随之而来。

研究这些观点,你很快就会陷入困境。见this pretty good introductory tutorial,虽然它是关于获取的 从GNU Compiler Collection开始 与汇编语言编程相比,将阐明原则 和你需要掌握的区别。