MIPS加载字的使用方法

How to use MIPS load word

也许这个问题听起来很愚蠢 :) 但我有点困惑,有人可以解释为什么代码使用 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)

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

lw $t0,0($t1)有很大的不同,它会先用t1中的值(用常量"displacement"+0修饰——也就是括号前面的“0”)作为内存地址,即 CPU 会将地址总线线设置为值 0x1b430010,然后它会向内存芯片发出信号,它应该使用这些地址线并从该地址加载内存,在总线数据上设置读取值-电线。一旦内存芯片将向 CPU 发出信号,即数据已读取且数据线处于正确状态,CPU 将将该状态存储为 t0.

的新值

简而言之,它将从地址为 0x1b430010 的计算机内存 加载字到寄存器 t0 - 但是内存中存储的实际值是多少,这是不可能的从你的短片中看出。

JFYI:MIPS 上的内存可以按字节寻址(地址总线是 28 位还是 30 位宽?还是全 32 位?可能取决于特定的目标 HW = 地址总线的宽度定义了您可以寻址的最大区域,即它限制了 CPU 地址 space 中可用的最大内存。所以通过设置特定的地址,你可以 read/modify 内存的任何字节(只要你有足够的权限去做,并且它不是只读内存,或者 void space 未被任何内存芯片映射).

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

0x1b430010 值可以被 4 整除(后四位为零,两个就够了,这实际上可以被 16 整除),并且该内存地址可能指向 .data 区域,所以这样做lw 从那里应该可以正常工作。