访问字符串中的一个字符

dar*_*sky 7 string assembly mips spim mars-simulator

我正在使用类似SPIMS或MARS的系统调用函数.

我正在读一个字符串(它可以工作,因为我可以打印出来)如下:

li $v0, 8
la $a0, string
li $a1, 256
syscall
Run Code Online (Sandbox Code Playgroud)

但是,我在访问字符串的单个字符时遇到问题.因此,如果我想访问第一个字符并打印它,我正在尝试这样做:

la $t0, string
lb $a0, ($t0)
li $v0, 4
sys call
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样的事情:

la $a0, string
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)

这会将整个字符串打印为字符串指向整个字符串.

如果我尝试类似的东西:

la $a0, string
lb $a0, ($t0)
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)

它给了我一个出界的错误.我不明白为什么 - 虽然不是一个字节长的字符,这只是将字符串中的第一个字节加载到$ a0?

谢谢

use*_*653 12

查看MARS系统调用函数的文档,您可以看到您正在使用的服务4期望$a0是"打印的以空字符结尾的字符串的地址",这解释了您所看到的行为.

你想要的是功能11"打印字符",它将低位字节打印为字符.换句话说,以下应该有效(未经测试):

la $t0, string
lb $a0, ($t0)
li $v0, 11
syscall
Run Code Online (Sandbox Code Playgroud)

  • `LI`是一个伪操作汇编器通常膨胀到`ORI $ RD,$零,low16bits`接着`LUI $ RD,hi16bits`.在"LI"指令之后,目标寄存器的完整32位被正确设置,因此无需在"LI"之前手动复位寄存器. (4认同)
  • 在执行LI之前,您应始终重置寄存器值.你永远不知道上半字可能有什么. (3认同)