在 MIPS 中使用 SW 和 LW 访问代码段内存
Accessing code segment memory using SW and LW in MIPS
是否可以使用 MIPS 中的 SW
和 LW
指令访问代码段内存,给定指令地址?
例如:
0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)
代码会加载到 $s2
中什么? 0x0000
(假定数据段为空)或 0x1004
?
处指令的二进制表示
编辑:
据我所知,由于指令内存和数据内存的分离,MIPS 处理器中的流水线是可能的 - 如果我错了请纠正我。
编辑 2:
我找到了一个 ,其答案暗示可以使用 LW
和 SW
访问和修改指令。因此答案是 $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 风格的分段内存不同。 (尽管该术语有相似的起源)。
是否可以使用 MIPS 中的 SW
和 LW
指令访问代码段内存,给定指令地址?
例如:
0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)
代码会加载到 $s2
中什么? 0x0000
(假定数据段为空)或 0x1004
?
编辑:
据我所知,由于指令内存和数据内存的分离,MIPS 处理器中的流水线是可能的 - 如果我错了请纠正我。
编辑 2:
我找到了一个 LW
和 SW
访问和修改指令。因此答案是 $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 风格的分段内存不同。 (尽管该术语有相似的起源)。