x86汇编bootloader代码如何实现同时输出两段指定内容
问题根源
- 第一段字符串打印结束后执行了
jmp $,直接进入死循环,后续打印A-Z的代码完全没有执行机会 - 调用int 0x10的0x0e(teletype输出)功能时寄存器配置错误:该功能要求
ah = 0x0e,bh为显示页号(实模式下默认设为0即可),原代码将0x0e错赋值给了bh - 字符串变量
varName放在了执行代码中间,存在被误判为指令执行的风险
修正后完整代码
[org 0x7c00] ; 提前配置int 0x10 0xe功能的公共参数,后续无需重复设置 mov ah, 0x0e mov bh, 0 mov bx, varName printString: mov al, [bx] cmp al, 0 je end_print_str int 0x10 inc bx jmp printString end_print_str: ; 可选:添加回车换行,让两段内容分行展示 mov al, 0x0d int 0x10 mov al, 0x0a int 0x10 ; 打印Z到A的逻辑 mov al, 'Z' int 0x10 loop: dec al cmp al, 'A' - 1 je exit int 0x10 jmp loop exit: jmp $ ; 字符串变量统一放在所有执行代码之后 varName: db "Hello World", 0 times 510-($-$$) db 0 dw 0xaa55
修改说明
- 移除了第一段打印结束后的
jmp $死循环,保证后续逻辑可以正常执行 - 修正了int 0x10中断的寄存器配置,统一提前设置好
ah和bh的值,避免重复赋值出错 - 调整了字符串变量
varName的存储位置,放在所有可执行代码的末尾 - 可选添加了换行输出逻辑,不需要可以直接删除对应三行代码即可
内容的提问来源于stack exchange,提问作者PurpleDDive
相关产品推荐
相关产品推荐

