"end main" 指令破坏了 MASM Hello World,与 "end" 一起工作正常吗?

"end main" directive breaks a MASM Hello World, works fine with "end"?

我正在调试我的 hello world 程序,结果 so I straight up copied and pasted the example from this website 陷入了 visual studio 和 运行。

成功了。然后我又花了三十分钟试图找出破坏它的错误。原来这是最后一行。下面的代码不起作用,唯一改变的是文件末尾的 end mainend.


所以这个汇编,但不起作用,使用 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

但这个版本确实有效,只使用 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

我只听说这是一个可选步骤,您可以采取该步骤来告诉程序代码从哪里开始。另外,为什么它甚至会破坏程序?

您不需要“end main”,因为您不希望您的入口点是 main,因为这是一个 libc 程序,您希望在调用 main 之前启动 C 库和 运行。

您不是 start.asm 自己写的;不要像使用无 libc 的汇编程序那样设置“end main”。