我的汇编函数打印一些字符串,但不打印其他字符串

My assembly function prints some strings, but not others

我正在开发一个简单的裸机 OS,我的打印字符串函数仅适用于某些字符串(例如“Hello World”),但不适用于其他字符串(例如“按 F1 寻求帮助”)

[ORG 0x7C00]
msg db "Press F1 for help",0

main:
    mov AH, 00h
    int 16h
    cmp AH, 0x3B
    je help 
    jmp main

help:
    mov si, msg
    call print
    jmp main

; Print library, invoke with "call print" example:
; msg db "Foobar",0
; mov SI, msg
; call print
%include "printlib.inc"
 
return:
    ret

times 510-($-$$) db 0;
db 0x55
db 0xAA

printlib.inc:

print:
    mov ax, 0x07c0
    mov ds, ax
    cld
    jmp .loop
.loop:lodsb
    or al, al ; zero=end or str
    jz .retn   ; get out
    mov ah, 0x0E
    mov bh, 0
    int 0x10
    jmp .loop
.retn:
    ret

BIOS 将始终在引导扇区的第一个字节开始执行,在您的情况下似乎是字符串,因此您正在执行数据。 (你放入一个名为 main 的标签这一事实不会影响这一点;没有人会看它。)可能是你的“Hello world”字符串恰好对应于不会完全破坏一切的指令.

尝试将字符串移动到所有代码之后,或者在它之前插入一个 jmp main

此外,您的 ORG 指令与 ds 段之间存在不一致。您的引导扇区被加载到线性地址 0x7c00。您可以将 segment:offset 形式视为 0000:7c0007c0:0000(或者如果您确实需要,也可以采用介于两者之间的其他方式)。因此,要访问引导扇区中的数据,您需要使用零加载 ds 并使用 [ORG 0x7c00],或者使用 0x07c0 加载 ds 并使用 [ORG 0] .但是,您的代码混合了两者。