如何在RISC-V汇编中判断字符大小写?转换小写为*遇类型错误
RISC-V汇编:小写字母转
*的问题修复 需求说明
实现字符串处理逻辑:将输入字符串中的所有小写字母(a-z)替换为*。示例:输入Wind On The Hill,输出W*** O* T** H***。
原代码问题分析
你提供的代码存在以下核心问题:
- 比较逻辑完全错误:错误地将字符与ASCII 42(
*)对比,而小写字母的ASCII范围是97('a')到122('z'),完全没命中目标区间 - 未写回内存:即使判断逻辑正确,修改后的字符值也没有存回原字符串数组,导致结果不会更新
- 指针与处理顺序混乱:读取字符后立即移动指针,后续处理的字符对应的位置已经被指针跳过,无法正确修改原位置
- 冗余代码:
t4=141未被使用,属于无效变量
原代码:
.data input: .space 80 prompt: .asciz "\nInput > " resultText: .asciz "Result > " countText: .asciz "Count > " .text main: li a7,4 la a0, prompt ecall li a7, 8 la,a0, input li a1, 16 ecall li t1, 0 # int counter = 0 li t4, 141 # int minVal = 141 li t5, 42 # int ascii * = 42 la t2, input # string* t2 = input loop: lb t3, (t2) # t3 = t2 (pointer) beqz t3, loop_exit addi t2,t2,1 # t2++ addi t1,t1,1 # count++ bgeu t3, 42, modify #------------comparision j loop modify: addi t3,t3,1 j loop
修复后的代码
.data input: .space 80 prompt: .asciz "\nInput > " resultText: .asciz "Result > " countText: .asciz "Count > " .text main: # 打印输入提示 li a7, 4 la a0, prompt ecall # 读取输入字符串(最多15个字符+终止符) li a7, 8 la a0, input li a1, 16 ecall li t1, 0 # 统计替换的小写字母数量 li t5, 42 # '*'的ASCII码 li t6, 97 # 'a'的ASCII码 li t7, 122 # 'z'的ASCII码 la t2, input # 字符串指针 loop: lb t3, (t2) # 读取当前字符 beqz t3, loop_exit # 遇到终止符,退出循环 # 判断是否为小写字母:t3 >= 'a' 且 t3 <= 'z' bltu t3, t6, skip_modify # 小于'a',跳过替换 bgtu t3, t7, skip_modify # 大于'z',跳过替换 # 是小写字母,替换为'*' sb t5, (t2) # 将'*'写回原位置 addi t1, t1, 1 # 替换计数+1 skip_modify: addi t2, t2, 1 # 指针移动到下一个字符 j loop loop_exit: # 打印结果 li a7, 4 la a0, resultText ecall la a0, input ecall # 打印替换计数 li a7, 4 la a0, countText ecall li a7, 1 mv a0, t1 ecall # 程序退出 li a7, 10 ecall
关键修改点
- 修正判断逻辑:使用
t6=97('a')和t7=122('z')作为判断边界,通过bltu和bgtu判断字符是否在小写字母区间 - 正确写回内存:符合条件时用
sb指令将*的ASCII码写回原字符串的对应位置 - 调整指针顺序:先处理当前字符(读取、判断、替换),再移动指针,确保修改的是当前指针指向的位置
- 完善功能:添加结果打印和替换计数打印,补充程序退出指令
- 移除冗余代码:删除未使用的
t4变量
内容的提问来源于stack exchange,提问作者ZaAnanasa
相关产品推荐
相关产品推荐

