【问题标题】:How to use MIPS load word如何使用 MIPS 加载字
【发布时间】:2019-06-01 15:45:45
【问题描述】:

也许这个问题听起来很愚蠢:) 但我有点困惑,有人可以解释为什么代码使用lw 将单词从内存加载到寄存器,而0x1b430010 已经在寄存器$t1 中使用luiori?

lui $t1,0x1b43 
ori $t1,$t1,0x0010 
lui $t2,0xabbb 
ori $t2,$t2,0x8050

lw $t0,0($t1) 
srl $t0,$t0,6 
andi $t0,$t0,0x3

lw $t3,0($t2) 
andi $t3,$t3,0xff9f 
sll $t0,$t0,5 
or $t3,$t3,$t0 
sw $t3,0($t2)

【问题讨论】:

    标签: assembly memory mips


    【解决方案1】:

    0x1b430010t1 中是数字(32 位无符号整数),表示内存地址。 lui + ori 从直接在 lui/ori 指令操作码中编码的部分立即值在 t1 中构建此常量(每个 MIPS 指令被编码为 32 位字,因此这些位的一部分形成 CPU 称为 lui 指令的模式, 或 ori 指令,其余的 16 位 IIRC 构成指令要使用的立即值)。

    lw $t0,0($t1) 就不同了,它会先用t1 中的值(修改为常量“位移”+0——即括号前的那个“0”)作为内存地址,即CPU会设置地址总线线到值 0x1b430010,然后它会向内存芯片发出信号,它应该使用这些地址线并从该地址进行内存加载,在总线数据线上设置读取值。一旦内存芯片向 CPU 发出信号,表明数据已被读取并且数据线处于正确状态,CPU 就会将该状态存储为 t0 的新值。

    简而言之,它会将字从计算机内存 地址 0x1b430010 加载到寄存器 t0 - 但是内存中存储的实际值是什么,这无法从你的简短 sn- p.

    JFYI:MIPS 上的内存可按字节寻址(地址总线是 28 位还是 30 位宽?还是全 32 位?可能取决于特定的目标硬件 = 地址总线的宽度定义了您可以寻址的最大区域,即它限制了CPU 地址空间中可用的最大内存)。因此,通过设置特定地址,您可以读取/修改任何字节的内存(只要您有足够的权限,并且它不是只读内存,或者任何内存芯片未映射的空白空间)。

    有一个小问题,加载/存储字指令要求(以使内存管理单元的硬件设计更简单)内存地址是“字对齐”的,即可被 4 整除(等于“底部两位为零”) .与读取半字类似,存储器地址必须是半字对齐的(可被 2 整除 = 底部地址位为零)。如果您正在使用未对齐的数据缓冲区,则必须按单个字节加载它(并从四个字节读取中组合字值),以避免在错误的地址上使用 lw 导致未对齐的内存访问崩溃。

    值 0x1b430010 可以被 4 整除(后四位为零,而两个就足够了,这实际上可以被 16 整除),并且该内存地址可能指向.data 区域,所以从lw应该没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多