如何使代码输出两条信息

How do I make the code to output both pieces of information

我已经尝试让它工作几个小时了,但似乎没有什么可以使输出以一行或两行的形式出现。我已经用字符串进行了之前的第二个循环,将 a 更改为 b,甚至一点一点地切换顺序。

代码:

[org 0x7c00]
mov ah, 0x0e
mov bx, varName

printString:
    mov al, [bx]
    cmp al, 0
    je end
    int 0x10
    inc bx
    jmp printString
end:
    jmp $

varName:
    db "Hello World", 0


mov bh, 0x0e
mov bl, 'Z'
int 0x10

loop:
    dec bl
    cmp bl, 'A' - 1
    je exit
    int 0x10
    jmp loop
exit:
    jmp $


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

当前输出:Hello World

我尝试同时删除两者,一次删除一个,并且它按预期工作运行。

注意:我正在使用 qemu、asm、vim 并且一直在使用 vscode 来帮助解决任何书写错误

changed a's to b's

不要这样做! 如果一个 api 声明它期望 AH 寄存器中的功能编号,那么它肯定无济于事尝试在 BH 寄存器中传递它。

从某种意义上说,你很幸运 jmp $ 没有让你执行那个虚假的第二部分。


要执行代码的两个部分,您可以将 jmp $(这是一个无限循环)替换为正常跳转到第二部分的第一条指令:

    ...
end:
    jmp Part2

varName:
    db "Hello World", 0

Part2:
    mov ah, 0x0E   ; BIOS.Teletype
    mov al, 'Z'
    ...

或者,将数据移动到第二部分下方。这样就不需要跳转了:

    ...
end:
    mov ah, 0x0E   ; BIOS.Teletype
    mov al, 'Z'
    ...
varName:
    db "Hello World", 0
    ...

由于这是一个引导扇区程序,您可以查看 ,我在其中列出了一些在引导扇区程序中很重要的内容,但您当前的程序仍然缺失。例如您没有设置任何段寄存器,并且省略了 BIOS.Teletype 函数的 DisplayPage 参数。