You need to enable JavaScript to run this app. 汇编语言如何存储键盘输入?8位操作系统NASM开发相关问题
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言如何存储键盘输入?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地址的字符串即可

编译运行命令

  1. 编译代码:nasm -f bin boot.asm -o boot.bin
  2. QEMU运行测试:qemu-system-x86_64 -drive format=raw,file=boot.bin

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:36:02