我正在尝试在Windows下的x86程序集中运行以下Hello Word示例:
global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section.text
_main :
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle(STD_OUTPUT_HANDLE)
push - 11
call _GetStdHandle@4
mov ebx, eax
; WriteFile(hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp - 4]
push eax
push(message_end - message)
push message
push ebx
call _WriteFile@20
; ExitProcess(0)
push 0
call _ExitProcess@4
; never here
hlt
message :
db 'Hello, World', 10
message_end :
但是当我尝试链接汇编的.obj文件时,我收到以下错误:
错误LNK2001:未解析的外部符号_GetStdHandle @ 4
错误LNK2001:未解析的外部符号_WriteFile @ 20
错误LNK2001:未解析的外部符号_ExitProcess @ 4
致命错误LNK1120:3个未解析的外部
我的示例来源:How to write hello world in assembler under Windows?
如何解决这些问题?或者,为什么这个例子不适合我?
答案 0 :(得分:0)
使用C编译器时,标准库通常链接到代码,这在分别调用链接器时通常不会完成。
这三个函数位于“kernel32.dll”中,因此您必须链接“kernel32.lib”(或使用GNU工具时的“libkernel32.a”)。
您的入口点是“_main”,因此我假设您也想使用启动对象文件。
但是,在您的情况下这不是必需的,因此您可以简单地将“_main”定义为链接器入口点,而不是链接到启动对象文件。