Joh*_*ket 0 memory assembly integer mips endianness
我正在使用 MIPS 架构(不确定这是否相关,因为我们正在处理内存)。
我被告知内存中有一个 32 位整数,物理地址为 0x00A0CE48。
我假设这个数字是00000000111111110000000011111111。
系统是字节寻址的,内存地址 0x00A0 处的值是什么?
我不确定前 8 位是否位于地址 0x00、接下来的 8 位位于 0x00A0、接下来的 8 位位于 0x00A0CE、最后 8 位位于 0x00A0CE48?我这么问是因为我必须操作 0x00A0 中的值,但我不确定那里有什么。
部分问题是首先假设使用大端,然后使用小端。
32 位整数驻留在内存中的物理地址 0x00A0CE48 处。32 位字中的位从最低有效位到最高有效位编号为 0 到 31。下面的代码从这个 32 位模式中提取单个位并将该位放入 $t4 中。
lui $t0,0x00A0
ori $t0,$t0,0xCE48
lbu $t4,2($t0)
srl $t4,$t4,5
andi $t4,$t4,1
Run Code Online (Sandbox Code Playgroud)
我的作业中的下一个问题是指示如果使用的内存顺序是小端或大端,则 $t4 中剩余的 32 位字中的位数(0 到 31)。
在大端系统上,首先存储最高有效字节。因此,假设值为0x12345678,则0x12将存储在地址0x00A0CE48处,0x34将存储在地址0x00A0CE49处,0x56将存储在地址0x00A0CE4A处,0x78将存储在地址0x00A0CE4B处。
另一方面,在小端系统上,最低有效字节将首先存储。因此,0x78 将存储在 0x00A0CE48 处,依此类推。
请注意,如果 32 位字存储在地址 0x00A0CE48 处,则下一个字将在四个字节之后,位于地址 0x00A0CE4C 处。算术运算应该对整个地址进行。从内存读取时,不能单独考虑组成地址的字节。
在您发布的程序集中,lui(代表“加载立即数上限”)会将立即数向左移动 16 位并将其存储在 $t0 中。在该指令之后,$t0 中的值将是 0x00A00000。下一条指令将 $t0 的内容与 0xCE48 进行或运算,并将结果存储在 $t0 中。之后,$t0 将包含您的完整地址 0x00A0CE48。