我在火星模拟器中用mips做一个项目,由于奇怪的行为,我的程序挂起在系统调用上。
我想将一个给定的char缓冲区存储到file并传递给syscall适当的长度。
.data
line_length: .space 4
# ...
.text
# ...
lb $t0, line_length
li $v0, 15
lb $a0, io_descriptors+4
la $a1, output_line
move $a2, $t0
syscall
line_length中存储的值为0x80。在lb指令之前和之后也确实如此。 lb之后的$ t0中的值是0xffffff80,但这是我无法理解的原因。由于数字为负数,系统调用失败。可能是因为$ t0没有存储0x80值?我该如何解决?
答案 0 :(得分:2)
当将单个字节(8位)加载到寄存器(MIPS为32位)时,该值需要扩展以填充剩余的24位。有两种选择:
lb
加载一个字节,符号扩展,然后将其放入32位寄存器。由于您正在阅读0x80
,因此最高有效位为1,因此32位结果为0xFFFFFF80
。
由于您已将line_length
声明为4个字节,因此您希望使用lw
来加载完整的32位字(没有扩展名)。只需确保您与用于访问和操作此变量的说明一致。
另见: