汇编语言如何存储键盘输入?8位操作系统NASM开发相关问题
解决方案
你需要预留固定的内存缓冲区存储输入字符,以下是在你原有代码基础上修改后的版本,已添加输入存储逻辑,可直接编译运行:
修改后的完整代码
[ORG 0x7c00] ; 定义输入缓冲区地址(引导扇区之后的空闲内存,安全可用) INPUT_BUFFER equ 0x7e00 ; 最大输入长度,防止缓冲区溢出 INPUT_MAX_LEN equ 128 xor ax, ax mov ds, ax cld mov si, msg call bios_print call keyboard hang: jmp hang msg db "Hello World!", 13, 10, 0 prompt db 0x0a, 0x0d, '> ', 0 bios_print: lodsb or al, al jz done mov ah, 0x0E mov bh, 0 int 0x10 jmp bios_print clear: mov ah, 0x00 mov al, 0x03 int 10h ret keyboard: ; 重置缓冲区指针 mov di, INPUT_BUFFER .input_loop: mov ah, 00h int 16h cmp ah, 0x1C je .enter ; 检查是否超过最大输入长度,超过就忽略输入 cmp di, INPUT_BUFFER + INPUT_MAX_LEN je .input_loop ; 存储输入字符到缓冲区 stosb ; 回显字符 mov ah, 0x0e int 0x10 jmp .input_loop .enter: ; 给输入字符串加结束符 mov byte [di], 0 ; 后续实现命令解析逻辑时,直接读取INPUT_BUFFER地址的字符串即可 hlt mov si, prompt call bios_print jmp keyboard done: ret times 510-($-$$) db 0 db 0x55 db 0xAA
关键改动说明
- 定义了
INPUT_BUFFER常量指向空闲内存地址0x7e00,所有输入的字符都会顺序存储在这个地址开始的内存区域 - 每次启动输入逻辑时重置缓冲区指针
di,保证新的输入不会异常覆盖内容,你也可以根据需求自行调整指针逻辑 - 每次按键后先判断是否超过最大输入长度,避免缓冲区溢出
- 按下回车键时自动在缓冲区末尾加0作为字符串结束标记,后续做命令解析直接读取
INPUT_BUFFER地址的字符串即可
编译运行命令
- 编译代码:
nasm -f bin boot.asm -o boot.bin - QEMU运行测试:
qemu-system-x86_64 -drive format=raw,file=boot.bin
内容的提问来源于stack exchange,提问作者user14579376
相关产品推荐
相关产品推荐

