X86 字符串未在程序集中显示

X86 字符串未在程序集中显示,x86,nasm,assembly,X86,Nasm,Assembly,我正试图搞乱一些程序集,创建一个操作系统。当这段代码加载到引导加载程序中时,它会输出这是我最酷的新操作系统!呜呼!Chiggins,但现在它说,减去最后的Chiggins。我哪里做错了 BITS 16 start: mov ax, 07C0h add ax, 288 mov ss, ax mov sp, 4096 mov ax, 07C0h mov ds, ax mov si, text_string call pri

我正试图搞乱一些程序集,创建一个操作系统。当这段代码加载到引导加载程序中时,它会输出这是我最酷的新操作系统!呜呼!Chiggins,但现在它说,减去最后的Chiggins。我哪里做错了

    BITS 16

start:
    mov ax, 07C0h
    add ax, 288
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h
    mov ds, ax

    mov si, text_string
    call print_string

    mov si, name_string
    call print_string

    jmp $ 

    text_string db 'This is my cool new OS! Woohoo!',0
    name_string db 'ChigginsOS',0

;---------------------------------------------------------------------------------------

exit:
    ret

;---------------------------------------------------------------------------------------

print_string:
    mov ah, 0Eh

.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat

.done:
    call exit

;---------------------------------------------------------------------------------------

    times 510-($-$$) db 0
    dw 0xAA55

您没有退出print_字符串子例程:当您执行“call exit”时,您正在启动一个新的子例程,因此“ret”将返回到“call exit”位置之后,并在print_字符串之后开始执行填充程序


用普通的“ret”替换“call exit”,它应该可以工作。

您没有退出print\u string子例程:当您执行“call exit”时,您正在启动一个新的子例程,因此“ret”将返回到“call exit”位置之后,并在print\u string之后开始执行填充

将“呼叫退出”替换为普通的“ret”,它应该可以工作