x86 ASM中的简单Hello World - Windows控制台

时间:2014-06-26 06:19:42

标签: windows winapi assembly x86 nasm

我正在尝试在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?

如何解决这些问题?或者,为什么这个例子不适合我?

1 个答案:

答案 0 :(得分:0)

使用C编译器时,标准库通常链接到代码,这在分别调用链接器时通常不会完成。

这三个函数位于“kernel32.dll”中,因此您必须链接“kernel32.lib”(或使用GNU工具时的“libkernel32.a”)。

您的入口点是“_main”,因此我假设您也想使用启动对象文件。

但是,在您的情况下这不是必需的,因此您可以简单地将“_main”定义为链接器入口点,而不是链接到启动对象文件。