在 MIPS 中使用 SW 和 LW 访问代码段内存

Accessing code segment memory using SW and LW in MIPS

是否可以使用 MIPS 中的 SWLW 指令访问代码段内存,给定指令地址?

例如:

0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)

代码会加载到 $s2 中什么? 0x0000(假定数据段为空)或 0x1004?

处指令的二进制表示

编辑:

据我所知,由于指令内存和数据内存的分离,MIPS 处理器中的流水线是可能的 - 如果我错了请纠正我。

编辑 2:

我找到了一个 ,其答案暗示可以使用 LWSW 访问和修改指令。因此答案是 $s2 将在 0x1004.

处包含指令的二进制表示

取决于你的意思 "MIPS":

  • 真正的 MIPS CPU 就像您在某些 WLAN 路由器中找到的那样?

  • 某些 MIPS 仿真器,如 SPIM 或 MARS?

对于真正的 MIPS CPU 这取决于内存管理单元的配置方式:

如果内存管理单元允许对代码段进行读访问,您确实会在地址 0x1004 处获得指令的二进制表示。

(顺便说一句:您需要使用 addi $s1, [=10=], 0x1004 来确保 $s1 确实包含 0x1004,因为 $s1 可能包含 0 之外的其他值.)

如果内存管理单元不允许访问代码段程序就会崩溃。 (大多数 MIPS CPU 似乎不允许此设置。)

如果您使用某些模拟器,如 SPIM、MARS(或任何其他模拟器),这取决于模拟器的工作方式...

理论上可以有三种类型的模拟器:

  • 有些崩溃了
  • 部分读取二进制表示
  • 一些读取了一些"stupid"值

您将在地址0x1004加载指令的机器编码。

MIPS 有一个平坦的内存模型;不同 segments of an executable are mapped / loaded into different parts of a single flat memory address space; it's a Von Neumann architecture 其中代码字节和指令字节是同一事物,并且共享相同的地址 space。

代码地址使用与数据地址相同的地址-space。 Martin 的回答表明,有可能创建一个至少权限不同的 MIPS,当然,其代码位于 ROM 中的嵌入式 MIPS 无法使用存储修改其指令。但即便如此,代码和数据也必须映射到同一物理地址的不同部分 space,即使存储到代码地址出现故障。可能您可以构建一个 MIPS,其中甚至有大量代码地址都出现故障,但这不太可能。如果您在该区域/页面上禁用了执行权限,则跳转到数据地址也可能会出错。

在普通的 MIPS 上,其指令在 RAM 中,self-modifying code is possible 如果您配置了写+执行权限。 (但请注意,为了正确起见,您通常需要刷新 i-cache,而 Q&A 中的代码并未执行此操作。)


顺便说一句,asm 源代码中的 .data 实际上意味着 .data 部分 ,链接器最终链接到数据 可执行文件的段。参见 What's the difference of section and segment in ELF file format

这里最重要的一点是可执行文件的段与 x86 风格的分段内存不同。 (尽管该术语有相似的起源)。