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

