如何在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
相关产品推荐
相关产品推荐

