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

如何在RISC-V汇编中判断字符大小写?转换小写为*遇类型错误

RISC-V汇编:小写字母转*的问题修复

需求说明

实现字符串处理逻辑:将输入字符串中的所有小写字母(a-z)替换为*。示例:输入Wind On The Hill,输出W*** O* T** H***。

原代码问题分析

你提供的代码存在以下核心问题:

  1. 比较逻辑完全错误:错误地将字符与ASCII 42(*)对比,而小写字母的ASCII范围是97('a')到122('z'),完全没命中目标区间
  2. 未写回内存:即使判断逻辑正确,修改后的字符值也没有存回原字符串数组,导致结果不会更新
  3. 指针与处理顺序混乱:读取字符后立即移动指针,后续处理的字符对应的位置已经被指针跳过,无法正确修改原位置
  4. 冗余代码: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:00:29