MIPS-如何将字符值存储到空间中

MIPS-如何将字符值存储到空间中,mips,Mips,我试图将一个字符存储到空间x中 .data x: .space 1 .text .globl main main: lb $t0, '*' sb $t0, x lb $a0, x li $v0, 11 syscall jr $ra 它显示“数据/堆栈中的错误地址” 但当我使用int时,它可以完美地工作 .data x: .space 4

我试图将一个字符存储到空间x中

        .data
x:      .space  1
        .text
        .globl main
main:
    lb  $t0, '*'
    sb  $t0, x

    lb  $a0, x
    li  $v0, 11
    syscall

        jr  $ra
它显示“数据/堆栈中的错误地址” 但当我使用int时,它可以完美地工作

     .data
x:      .space  4
        .text
        .globl main
main:
    li  $t0, 6
    sw  $t0, x

    lw  $a0, x
    li  $v0, 1
    syscall

        jr  $ra

他们之间有什么区别?为什么int-one可以工作而char-one不能工作?

根据您使用的系统调用判断,您正在SPIM或MARS之类的模拟器中运行此功能。模拟器向您显示了问题所在:

0x00400000处的运行时异常:地址超出范围0x0000002a

在代码窗口中的地址0x00400000处,您可以看到
lb$8,0x0000002a($0)

因此,您试图从地址0x2a加载一个字节(0x2a恰好是
'*'
的ASCII码)

实际上,如果从MIPS中查找指令集引用中的
LB
,您将看到:

LB rt, offset(base)
Description: rt ← memory[base+offset]
显然,这不是加载常量值
'*'
所需的指令。为此,应使用
li
伪指令(或
addi
ori



TL;DR:您尝试使用内存加载指令加载立即数常量。不要忽略模拟器提供给您的信息。

根据您正在使用的系统调用判断,您正在SPIM或MARS之类的模拟器中运行此功能。模拟器向您显示了问题所在:

0x00400000处的运行时异常:地址超出范围0x0000002a

在代码窗口中的地址0x00400000处,您可以看到
lb$8,0x0000002a($0)

因此,您试图从地址0x2a加载一个字节(0x2a恰好是
'*'
的ASCII码)

实际上,如果从MIPS中查找指令集引用中的
LB
,您将看到:

LB rt, offset(base)
Description: rt ← memory[base+offset]
显然,这不是加载常量值
'*'
所需的指令。为此,应使用
li
伪指令(或
addi
ori


TL;DR:您尝试使用内存加载指令加载立即数常量。不要忽略模拟器给你的信息