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

如何在x86汇编中打印用户输入的文本

问题定位

你的代码一共三个核心错误,执行顺序问题确实存在:

  • 按键值读取逻辑错误:int 0x16的ah=0功能调用完成后,按下按键的ASCII码直接存在AL寄存器里,你根本没有保存这个返回值,反倒执行mov al, [key]把AL覆盖成了内存位置的初始值0,后续肯定拿不到正确的按键字符。
  • 显示中断参数缺失:int 0x10要显示单个字符需要先把AH设为0x0e(电传打字输出模式),BH填当前显示页码(实模式文本模式下填0即可),BL填字符显示属性(0x07是默认黑底白字),你没有配置这些参数就直接调用中断,此时AH里存的还是键盘中断返回的按键扫描码,根本触发不了字符显示逻辑。
  • 代码执行顺序错误:你把存储数据的key: db 0放在了int 0x10和jmp $中间,CPU跑完int 0x10会顺着内存地址往下执行,直接把db 0对应的字节当成机器指令运行,不会直接进入死循环,很容易出现程序跑飞的问题。
正确实现代码
[org 0x7c00]

; 循环读取按键并实时显示
read_key:
    mov ah, 0       ; 键盘中断功能号0:阻塞等待按键输入
    int 0x16        ; 调用键盘中断,返回后al=按键ASCII码,ah=按键扫描码

    mov ah, 0x0e    ; 显示中断功能号0x0e:电传模式输出单个字符
    mov bh, 0       ; 设定显示页码为0
    mov bl, 0x07    ; 设定字符属性为黑底白字
    int 0x10        ; 调用显示中断,直接用al中存储的ASCII码输出字符

    jmp read_key    ; 回到读键逻辑,等待下一次按键输入

jmp $   ; 兜底死循环,正常运行时不会走到这一行

; 数据定义放在代码段最后,避免被CPU当成指令执行
key:
    db 0

times 510-($-$$) db 0
db 0x55, 0xaa
编译运行方法

用NASM编译的命令为:
nasm -f bin boot.asm -o boot.bin
编译完成后用QEMU启动即可:
qemu-system-i386 boot.bin
程序运行后按下键盘任意按键,对应的字符就会直接显示在屏幕上。

如果你确实需要把按键值暂存到key对应的内存位置,只需要在int 0x16调用后加一句mov [key], al,显示前再把值从内存读回AL即可,当前单字符实时显示的场景下直接用寄存器传参效率更高。

内容的提问来源于stack exchange,提问作者user17400329

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:27:19