You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:28:19