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

RISC-V字符串首字符大写判断问题:无法获取首字符求助

问题分析与修正

核心错误点

  • 获取首字符的逻辑完全错误:系统调用li a7,8(读取字符串)执行后,输入的字符串已经存储在string缓冲区中,a1是你指定的缓冲区最大长度,不是读取到的字符。你用sb a1, 0(s1)是把缓冲区长度写到字符串首地址,完全覆盖了输入的首字符,自然无法正确获取。
  • 错误使用输出系统调用:li a7,4是输出字符串的调用,要求a0是字符串的起始地址,但你把a0设为a1(缓冲区长度),这会把数值当作内存地址去读取,必然输出乱码。如果要测试首字符,应该用a7,11(输出单个字符)的系统调用。
  • 条件判断未正确实现:你注释的代码逻辑和判断大写字母的需求不匹配,需要针对ASCII码范围做判断。

修正后的完整代码

.data
enterString: .string "Enter a string: "
isUpperCase: .string "The first character is an upper-case letter\n"
notUpperCase: .string "The first character is not an upper-case letter\n"
string: .space 82  ; 足够的缓冲区空间
    .text
main:
    ; 提示输入字符串
    li a7, 4
    la a0, enterString
    ecall
    
    ; 读取字符串到string缓冲区,最大长度20
    li a7, 8
    addi a1, zero, 20
    la a0, string
    ecall
    
    ; 读取字符串的首字符
    la s1, string
    lb t0, 0(s1)  ; 从string首地址加载1字节(首字符)到t0
    
    ; 测试首字符是否为大写字母(ASCII 'A'=65, 'Z'=90)
    li t1, 'A'
    li t2, 'Z'
    blt t0, t1, print_not_upper  ; 小于'A',不是大写
    bgt t0, t2, print_not_upper  ; 大于'Z',不是大写
    
    ; 是大写字母的情况
    li a7, 4
    la a0, isUpperCase
    ecall
    j exit_program  ; 跳转到退出
    
print_not_upper:
    li a7, 4
    la a0, notUpperCase
    ecall

exit_program:
    li a7, 10
    ecall

关键修改说明

  1. 正确获取首字符:用lb t0, 0(s1)从缓冲区首地址加载1字节,得到输入字符串的第一个字符。
  2. 修正输出逻辑:重新定义了更清晰的结果字符串,避免原变量名的逻辑混淆。
  3. 实现大写字母判断:通过比较首字符的ASCII码是否在'A'到'Z'之间,分支到对应的结果输出。
  4. 优化程序流程:用j指令跳转到统一的退出入口,避免重复的li a7,10代码。

内容的提问来源于stack exchange,提问作者David D'Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:41:27