我正在调试我的 hello world 程序,感到很沮丧,所以我直接将示例从该网站复制并粘贴到 Visual Studio 中并运行它。
有效。然后我又花了三十分钟试图找出破坏它的错误是什么。原来这是最后一行。下面的代码不起作用,唯一改变的是end main文件末尾的end.
所以这可以组装,但不起作用,使用end main
; requires /coff switch on 6.15 and earlier versions
.386
.model small,c
.stack 1000h
.data
hello db "Hello world!",0
.code
includelib libucrt.lib
includelib legacy_stdio_definitions.lib
includelib libcmt.lib
includelib libvcruntime.lib
extrn printf:near
extrn exit:near
public main
main proc
push offset hello
call printf
push 0
call exit
main endp
end main
Run Code Online (Sandbox Code Playgroud)
但这个版本确实有效,只使用end
; requires /coff switch on 6.15 and earlier versions
.386
.model small,c
.stack 1000h
.data
hello db "Hello world!",0
.code
includelib libucrt.lib
includelib legacy_stdio_definitions.lib
includelib libcmt.lib
includelib libvcruntime.lib
extrn printf:near
extrn exit:near
public main
main proc
push offset hello
call printf
push 0
call exit
main endp
end
Run Code Online (Sandbox Code Playgroud)
我所听到的是,这是一个可选步骤,您可以采取该步骤来告诉程序代码从哪里开始。此外,为什么它甚至会破坏程序?
您不希望“end main”,因为您不希望入口点是 main,因为这是一个 libc 程序,并且您希望 C 库在调用 main 之前启动并运行。
你不是自己写 start.asm ;不要像使用无 libc 汇编程序那样设置“end main”。