MIPS汇编如何打印字符串的部分子串:提取HELLO!前3个字符HEL
MIPS打印字符串前3个字符实现方案
首先说明你提供的代码存在两处核心错误:
lw $t6, string指令使用错误:lw作用是加载内存地址存储的数值到寄存器,你需要的是字符串的首地址,应该用地址加载伪指令la $t6, stringlb $a0, 0-2($t6)逻辑错误:lb一次只能加载1个字节(单个ASCII字符),且打印字符串的系统调用(编号4)要求$a0存储以\0结尾的字符串首地址,不是直接存储字符内容
下面给两种可用的实现方案:
方案1:临时插入终止符(不修改原字符串最终内容)
原理是先暂存字符串第4位(下标3)的原有字符,临时替换为\0终止符,打印完成后再把原有字符写回,不会改变原字符串的最终内容:
.data string: .asciiz "HELLO!" .text # 加载字符串首地址到$t0 la $t0, string # 暂存下标3位置的原有字符(第二个'L') lb $t1, 3($t0) # 把下标3位置临时改为终止符'\0' sb $zero, 3($t0) # 打印字符串,识别到'\0'就会停止,输出前3个字符HEL move $a0, $t0 li $v0, 4 syscall # 回写原有字符,恢复原字符串 sb $t1, 3($t0) # 程序退出 li $v0, 10 syscall
方案2:单独打印单个字符
不需要修改原字符串,直接用打印单个字符的系统调用(编号11),依次加载前3个字符打印即可:
.data string: .asciiz "HELLO!" .text la $t0, string # 打印第一个字符H lb $a0, 0($t0) li $v0, 11 syscall # 打印第二个字符E lb $a0, 1($t0) syscall # 打印第三个字符L lb $a0, 2($t0) syscall # 程序退出 li $v0, 10 syscall
内容的提问来源于stack exchange,提问作者A1122
相关产品推荐
相关产品推荐

