从内存中错误地加载值以mips方式注册

时间:2014-05-20 03:25:40

标签: assembly mips

我在火星模拟器中用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值?我该如何解决?

1 个答案:

答案 0 :(得分:2)

当将单个字节(8位)加载到寄存器(MIPS为32位)时,该值需要扩展以填充剩余的24位。有两种选择:

  • 零扩展,用零填充剩余的高位。当值为 unsigned 时,这是有意义的。
  • Sign extend使用最高有效位的副本填充剩余的高位。当值为 signed 时,这是有意义的。

lb加载一个字节,符号扩展,然后将其放入32位寄存器。由于您正在阅读0x80,因此最高有效位为1,因此32位结果为0xFFFFFF80

由于您已将line_length声明为4个字节,因此您希望使用lw来加载完整的32位字(没有扩展名)。只需确保您与用于访问和操作此变量的说明一致。

另见: