Assembly 错误地将值从内存加载到mips中的寄存器
我在火星模拟器的mips中做了一个项目,由于奇怪的行为,我的程序挂起在syscall上 我想将给定的字符缓冲区存储到文件中,并将其适当的长度传递给syscallAssembly 错误地将值从内存加载到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
.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位字(无扩展名)。只需确保您与用于访问和操作此变量的说明保持一致
另见: