8086汇编代码报错:无法正常打印字符串元音数量求助
8086汇编元音统计代码问题排查与修正
原代码存在的核心问题:
- 数据段定义错误:
MSG仅分配1字节空间,输入长字符串会直接越界破坏内存;MSG2未分配足够空间且缺少DOS打印功能要求的$结束符。 - 输入字符串无结束标记:输入完成后未在
MSG末尾添加$,导致后续循环无法终止,会读取垃圾数据。 - 循环起始指针错误:进入统计循环时,
SI指向输入字符串的末尾位置而非起始地址,初始读取的是无效数据。 - 未处理小写元音:原代码仅判断大写
A/E/I/O/U,无法统计输入中的小写元音(比如示例输入arham中的a)。 - 关键字冲突:使用汇编关键字
END作为标签,会引发编译错误。 - 数字转ASCII错误:直接将统计数字存入
MSG2,DOS打印功能只能识别ASCII字符,需将数字加30H转换为对应字符。 - 无效内存写入:统计循环中
MOV [SI], VOWEL_COUNT属于多余操作,会覆盖原字符串内容,完全无意义。
修正后的代码:
.MODEL SMALL .STACK 100H .DATA MSG DB 100 DUP(?) ; 分配足够空间存储输入字符串 MSG2 DB 2 DUP(?), '$' ; 存储统计结果(支持0-99)+ DOS打印结束符 VOWEL_COUNT DB 0 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV SI, OFFSET MSG MOV AH, 1 INPUT: INT 21H CMP AL, 0DH ; 判断是否按下回车键 JE ADD_TERMINATOR MOV [SI], AL INC SI JMP INPUT ADD_TERMINATOR: MOV [SI], '$' ; 给输入字符串添加结束标记 MOV SI, OFFSET MSG ; 重置SI到字符串起始位置 CONVERT_LOOP: MOV AL, [SI] CMP AL, '$' ; 到达字符串末尾则退出循环 JE DISPLAY ; 同时判断大写和小写元音 CMP AL, 'A' JE VOWEL CMP AL, 'a' JE VOWEL CMP AL, 'E' JE VOWEL CMP AL, 'e' JE VOWEL CMP AL, 'I' JE VOWEL CMP AL, 'i' JE VOWEL CMP AL, 'O' JE VOWEL CMP AL, 'o' JE VOWEL CMP AL, 'U' JE VOWEL CMP AL, 'u' JE VOWEL JMP DONE VOWEL: INC VOWEL_COUNT DONE: INC SI JMP CONVERT_LOOP DISPLAY: ; 将统计数字转换为ASCII字符 MOV AL, VOWEL_COUNT ADD AL, 30H ; 数字转ASCII('0'的ASCII码为30H) MOV MSG2, AL ; 调用DOS功能打印结果 MOV AH, 9 MOV DX, OFFSET MSG2 INT 21H ; 程序正常退出 MOV AH, 4CH INT 21H MAIN ENDP END MAIN
修正说明:
- 数据段优化:给
MSG分配100字节足够存储常规输入;MSG2分配2字节支持两位数统计结果,并添加$满足DOS打印要求。 - 输入收尾处理:回车后给字符串加
$结束符,同时重置SI到字符串开头,确保统计从第一个字符开始。 - 全元音覆盖:补充小写元音的判断逻辑,适配所有输入情况。
- ASCII转换:将统计数字加
30H转为ASCII字符,保证DOS打印功能能正确输出数字。 - 标签修正:将原
END标签改为DISPLAY,避免与汇编关键字冲突。
内容的提问来源于stack exchange,提问作者Arham Malik
相关产品推荐
相关产品推荐

