引导扇区打印字符串出现多余空格,求原因解析
引导扇区打印字符串出现多余空格的原因及解决
问题根源
你的print函数执行顺序有误:当前逻辑是先加载字符到al,立即调用BIOS中断int 0x10打印,之后才判断是否为空终止符。这导致空字符(0)也被传递给了BIOS的0x0e输出功能。
BIOS的0x0e功能(电传打字机模式输出)处理不可打印的ASCII控制字符(比如0)时,终端会将其显示为空格,这就是你看到字符串后多出空格的原因。
修正后的汇编代码
调整判断与打印的顺序,先检查是否为空字符,再执行打印操作:
[org 0x7c00] mov ah, 0x0e mov bx, msg call print mov bx, msg1 call print jmp $ print: mov al, [bx] cmp al, 0 ; 先判断是否为空终止符 je print_done ; 是空字符则直接退出 int 0x10 ; 非空才调用BIOS打印 inc bx jmp print print_done: ret msg db "hello",0 msg1 db "goodbye",0 times 510-($-$$) db 0 dw 0xaa55
也可以用更高效的test指令替代cmp al,0:
print: mov al, [bx] test al, al ; 测试al是否为0,等价于cmp al,0但占用更少指令字节 jz print_done int 0x10 inc bx jmp print print_done: ret
验证效果
修改后运行QEMU,输出会变成hellogoodbye,不再有多余空格。
内容的提问来源于stack exchange,提问作者Aave Tatti
相关产品推荐
相关产品推荐

