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

x86汇编中如何对比buffer内输入文本与'--help'等预设命令

实模式x86汇编命令字符串匹配实现方案

你当前编写的是x86实模式的引导程序,要实现用户输入和预设命令的匹配,按以下步骤修改代码即可:

1. 先修正基础定义

首先调整缓冲区和预设命令的定义,统一以\0作为字符串结束标记:

; 预设命令加结尾0作为结束标记
help db '--help', 0
; 扩大缓冲区容量,避免输入溢出,原来的8字节容量过小
buf  db 32 dup(0)
msg  db 'WELCOME TO DARSHOS', 0

2. 新增字符串匹配逻辑

你已经开启了cld方向标志,直接用字符串比较指令cmpsb/scasb就能高效实现逐字节对比,在你原有输入回车后的位置新增如下逻辑:

; 原有回车处理逻辑保留
cmp  al, 13
jne  Next      
mov  al, 10   
int  10h

; ========== 新增命令匹配逻辑 ==========
; 先把缓冲区末尾的回车符替换为结束符0
dec  di
mov  byte [di], 0

; 匹配--help命令
mov  si, buf
mov  di, help
cmp_loop:
    lodsb
    scasb
    jne  cmd_not_match  ; 字节不一致,匹配失败
    test al, al         ; 判断是否到字符串末尾
    jnz  cmp_loop

; 匹配成功,执行help对应逻辑,示例为打印帮助信息
mov  si, help_content
call print_str
jmp  input_again        ; 处理完成后回到等待输入状态

cmd_not_match:
; 匹配失败逻辑,示例为打印未知命令提示
mov  si, unknown_tip
call print_str

input_again:
; 此处可以加重置光标、清空缓冲区的逻辑,再跳回Key标签等待新输入
jmp Key

; 公共打印字符串子程序,复用你原有打印逻辑封装
print_str:
    mov  bh, 0
print_loop:
    lodsb
    cmp  al, 0
    jz   print_end
    mov  ah, 0Eh
    int  10h
    jmp  print_loop
print_end:
    ret

; 新增提示字符串定义
help_content db 'Available commands: --help, --version', 0Dh, 0Ah, 0
unknown_tip db 'Error: unrecognized command', 0Dh, 0Ah, 0

扩展说明

  • 如果需要支持多个命令,只需要在cmd_not_match位置加载下一个预设命令的地址到di,重新执行匹配逻辑即可
  • 如果需要忽略大小写匹配,在比较前把al和[di]的字符统一转为大写/小写再比较即可
  • 注意缓冲区长度要大于你定义的最长命令长度,避免用户输入过长导致内存覆盖

内容的提问来源于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.03 21:15:00