x86汇编中BIOS为何在按键前自动输出字母“U”?
问题分析与解决方案
你的引导程序启动后自动输出'U'(ASCII码0x55),主要是两个原因导致:
- 键盘缓冲区残留数据:部分BIOS在启动引导程序前,键盘缓冲区中可能残留了按键数据(比如0x55),第一次调用
int 0x16 ah=0时会直接读取该数据,而非等待用户按键。 - 段寄存器未初始化:未设置
DS寄存器,部分BIOS环境下DS值可能不为0,导致内存寻址偏移错误,意外读取到引导扇区末尾的签名字节0x55(引导扇区结尾的db 0x55, 0xaa)。
修正后的代码如下:
[org 0x7c00] ; 初始化DS寄存器,确保寻址指向正确的物理地址 xor ax, ax mov ds, ax char: db 0 ; 清空键盘缓冲区,丢弃残留按键 clear_buffer: mov ah, 1 int 0x16 ; 检查缓冲区是否有未读按键 jz loop ; 缓冲区为空,进入主循环 mov ah, 0 int 0x16 ; 读取并丢弃残留按键 jmp clear_buffer loop: mov ah, 0 int 0x16 ; 等待用户输入按键 mov [char], al ; 将按键字符存入变量 mov ah, 0x0e mov al, [char] int 0x10 ; 调用BIOS中断输出字符 jmp loop times 510-($-$$) db 0 db 0x55, 0xaa
关键修正说明:
- 初始化DS寄存器:通过
xor ax, ax和mov ds, ax将DS设为0,配合[org 0x7c00]确保内存寻址正确指向引导扇区的物理地址0x7c00。 - 清空键盘缓冲区:新增
clear_buffer循环,先检查并丢弃缓冲区中所有残留按键,确保主循环中int 0x16 ah=0会等待用户的真实输入。
内容的提问来源于stack exchange,提问作者O0JJC
相关产品推荐
相关产品推荐

