MIPS汇编程序编写求助:移除句子中首字符非小写的单词
MIPS汇编单词过滤功能实现指南
你提供的需求描述与示例输出不匹配:若按“删除首字符非小写的单词”执行,输入
Today is A great Day的输出应为is great,但你给出的预期输出为Today A Day,因此下文默认按删除首字符为小写的单词、保留首字符大写的单词的逻辑实现。
可行实现步骤
- 配置两个指针:读指针遍历原始输入字符串,写指针记录过滤后内容的写入位置,可直接复用原输入缓冲区节省空间
- 新增单词首字符标记位:标记当前遍历到的字符是否为某个单词的第一个字符,只有首字符需要判断过滤规则
- 遍历逻辑:
- 遇到空格直接写入结果,同时标记下一个字符为新单词的首字符
- 遇到单词首字符时,判断是否符合保留规则:符合则写入结果,标记后续字符无需判断,继续遍历;不符合则直接跳过整个单词,直到遇到下一个空格或字符串结束
- 非首字符直接写入结果即可
- 遍历结束后在结果末尾补字符串结束符,输出结果
现有代码问题修正
- 原循环判断逻辑倒置:原代码判断索引小于30时直接退出,需改为索引小于30时进入循环逻辑
- 缺少写指针、首字符标记位的初始化与维护逻辑
完整可运行代码
.data input .space 30 prompt: .asciiz "Please enter a sentence: " output_prompt: .asciiz "Processed result: " .text # 输出提示 li $v0,4 la $a0,prompt syscall # 读取用户输入 li $v0,8 li $a1,30 la $a0,input syscall # 初始化寄存器 la $t0, input # $t0 = 读指针 la $t6, input # $t6 = 写指针 li $t7, 1 # $t7 = 首字符标记,1表示当前是单词首字符 li $t8, 10 # $t8 = 换行符ASCII,用于判断输入结束 li $t9, 32 # $t9 = 空格ASCII loop: lb $t4, 0($t0) # 加载当前读指针指向的字符 beq $t4, $t8, end_process # 遇到换行符结束处理 beqz $t4, end_process # 遇到结束符结束处理 beq $t4, $t9, handle_space # 当前字符是空格,跳转空格处理 bne $t7, 1, write_char # 不是首字符,直接写入 # 是单词首字符,判断是否为大写字母(A~Z ASCII 65~90) slti $t2, $t4, 65 bne $t2, $zero, skip_word # 小于A,跳过整个单词 slti $t2, $t4, 91 beq $t2, $zero, skip_word # 大于Z,跳过整个单词 # 首字符符合要求,写入,标记非首字符 sb $t4, 0($t6) addi $t6, $t6, 1 li $t7, 0 addi $t0, $t0, 1 j loop handle_space: # 空格写入结果,标记下一个是首字符 sb $t4, 0($t6) addi $t6, $t6, 1 li $t7, 1 addi $t0, $t0, 1 j loop write_char: # 非首字符直接写入 sb $t4, 0($t6) addi $t6, $t6, 1 addi $t0, $t0, 1 j loop skip_word: # 跳过整个单词,直到遇到空格或结束 lb $t4, 0($t0) beq $t4, $t9, handle_space beq $t4, $t8, end_process beqz $t4, end_process addi $t0, $t0, 1 j skip_word end_process: # 给结果加结束符 sb $zero, 0($t6) # 输出结果 li $v0,4 la $a0, output_prompt syscall li $v0,4 la $a0, input syscall EXIT: li $v0,10 syscall
内容的提问来源于stack exchange,提问作者Robo Jumble
相关产品推荐
相关产品推荐

