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

Lei*_*OAF 1 x86 assembly masm

我正在调试我的 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)

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

Jos*_*hua 5

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

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