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

汇编开发命令行OS时如何将键盘输入拼接为字符串存储?

实现字符拼接为命令字符串的方案

你需要在内存中预留一块固定的命令缓冲区,维护写入位置指针,每次用户输入字符时按顺序存入缓冲区,按下回车键时在缓冲区末尾补结束符即可得到完整的可比对命令字符串。

修改后的完整代码

; 常量定义
CMD_BUF equ 0x7E00  ; 命令缓冲区起始地址,使用引导扇区后的空闲内存,无冲突

;bg
MOV AH, 06h   
XOR AL, AL    
XOR CX, CX    
MOV DX, 184FH  
MOV BH, 1Eh  
INT 10H
;cursor
mov dh, 1
mov dl, 30
mov bh, 0
mov ah, 2
int 10h
;text
mov ah, 0x0E
mov al, 'W'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'L'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'C'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'M'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'E'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'T'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, ' '
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'D'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'A'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'R'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'H'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'O'
mov bh, 0x00
int 10h
mov ah, 0x0E
mov al, 'S'
mov bh, 0x00
int 10h
;cursor
mov dh, 3
mov dl, 2
mov bh, 0
mov ah, 2
int 10h

; 初始化缓冲区写入指针
mov word [buf_ptr], CMD_BUF

;commandline
Key:
    MOV AH,0 
    INT 16H         ; 读取键盘输入,ah=扫描码,al=ASCII码
    cmp ah, 28      ; 判断是否按下回车键
    je Newline
    
    ; 存储输入字符到缓冲区
    mov bx, [buf_ptr]
    mov [bx], al
    inc word [buf_ptr]
    
    ; 打印字符到屏幕
    mov ah, 0eh
    int 10h
    jmp Key

Newline:
    ; 给缓冲区补字符串结束符0,得到完整命令字符串
    mov bx, [buf_ptr]
    mov byte [bx], 0
    
    ; 这里可以加命令比对逻辑,直接使用CMD_BUF地址作为输入字符串的首地址即可
    
    ; 换行逻辑
    add dh, 1
    mov dl, 2
    mov bh, 0
    mov ah, 2
    int 10h
    
    ; 重置缓冲区指针,准备下一轮输入
    mov word [buf_ptr], CMD_BUF
    jmp Key

; 变量定义
buf_ptr dw CMD_BUF  ; 缓冲区写入位置指针

times 510-($-$$) db 0
dw 0xaa55

关键改动说明

  • 预留了0x7E00起始的内存作为命令缓冲区,该地址位于引导扇区(加载在0x7C00~0x7DFF)之后,属于实模式下的空闲内存,不会和现有代码冲突
  • 新增了buf_ptr变量维护当前缓冲区的写入位置,初始化时指向缓冲区起始地址
  • 每次读取到非回车的输入字符时,除了输出到屏幕,同时写入缓冲区当前位置,然后将指针后移1位
  • 按下回车键触发换行前,先在缓冲区当前指针位置写入0,形成标准的以0结尾的C风格字符串,后续直接使用CMD_BUF作为首地址即可和预设命令做比对
  • 换行完成后重置写入指针,清空缓冲区内容以便下一轮命令输入

可选扩展

如果需要更完善的输入体验,可以新增以下逻辑:

  • 判断退格键扫描码,按下退格时指针前移1位,同时输出退格符覆盖屏幕上的已输入字符
  • 增加缓冲区长度判断,输入字符超过缓冲区最大长度时做截断处理,避免内存溢出

内容的提问来源于stack exchange,提问作者D.S.Dudhia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:15:05