Assembly 错误地将值从内存加载到mips中的寄存器

Assembly 错误地将值从内存加载到mips中的寄存器,assembly,mips,Assembly,Mips,我在火星模拟器的mips中做了一个项目,由于奇怪的行为,我的程序挂起在syscall上 我想将给定的字符缓冲区存储到文件中,并将其适当的长度传递给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 第_行长度中存储的值为0x80

我在火星模拟器的mips中做了一个项目,由于奇怪的行为,我的程序挂起在syscall上

我想将给定的字符缓冲区存储到文件中,并将其适当的长度传递给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

第_行长度中存储的值为0x80。在lb指令之前和之后也是如此。磅后的$t0值为0xffffff80,原因超出我的理解。由于号码为负数,系统调用失败。$t0不存储0x80值的原因可能是什么?如何修复它?

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

  • 零扩展用零填充剩余高位。当值为无符号时,这是有意义的
  • 它用最高有效位的副本填充剩余的高位。当值被签名时,这是有意义的
lb
加载单个字节,并在将其放入32位寄存器之前对其进行符号扩展。由于您正在读取
0x80
,因此最高有效位是1,因此32位结果是
0xFFFFFF80

由于您已将
line\u length
声明为4字节,因此需要使用
lw
加载完整的32位字(无扩展名)。只需确保您与用于访问和操作此变量的说明保持一致

另见:


我已经有一段时间没有使用MIPS了,但我认为现在的情况是字节值0x80被符号扩展到32位。即,它是有符号字节加载。0x80是8位2的补码值-128。MSB是1,所以它是负数。感谢您快速给出的回答。整个项目主要是在chars上,所以我太习惯lb了。我不知道标志扩展是这样工作的,所以我感到困惑。