我正在尝试使用VS 2010附带的ML和LINK在Windows上编译一个hello world。
.MODEL FLAT
.STACK 4096
.data
msg db "Hello World!",0
.code
INCLUDELIB MSVCRT
EXTRN printf:NEAR
EXTRN exit:NEAR
PUBLIC _main
_main PROC
mov eax, offset msg
push eax
call printf
mov eax,0
push eax
call exit
_main ENDP
END _main
我不断收到链接器错误,说printf和exit是未解析的外部符号。我有几个问题。
答案 0 :(得分:4)
VC\crt\src\crt0.c
这是一个适合我的最小文件(我使用静态库,因为我有VS2008并且不想使用清单来使其与DLL一起使用)。
.386
.MODEL FLAT
.STACK 4096
.data
msg db "Hello World!",0
.code
INCLUDELIB LIBCMT
EXTRN _printf:NEAR
EXTRN _exit:NEAR
EXTRN __heap_init:NEAR
EXTRN __mtinit:NEAR
EXTRN __ioinit:NEAR
PUBLIC _main
_main PROC
push 1
call __heap_init
add esp, 4
push 1
call __mtinit
add esp, 4
call __ioinit
mov eax, offset msg
push eax
call _printf
pop ecx
mov eax,0
push eax
call _exit
_main ENDP
END _main
对于MSVCRT,初始化是不同的,例如,你需要调用set_app_type
要不依赖CRT,您必须使用OS API。在Win32的情况下,将是Win32函数,如WriteFile(文件句柄使用GetStdHandle(STD_OUTPUT_HANDLE))。请参阅一些示例here。