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



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

例如:

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

代码将加载到$s2中?0x0000(给定数据段为空)或0x1004的指令的二进制表示?

编辑:

afaik,由于指令内存和数据存储器的分离,可能会在MIPS处理器中进行管道式启动 - 如果我错了,请纠正我。

编辑2:

我找到了一个问题,答案暗示可以使用LWSW访问和修改指令。因此,答案是$s2将包含指令的二进制表示。

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

MIPS具有平坦的内存模型;可执行文件的不同片段被映射/加载到单个平面存储地址空间的不同部分;这是一个von Neumann架构,代码字节和指令字节是同一件事,并共享相同的地址空间。

代码地址使用与数据地址相同的地址空间。马丁的回答表明,至少可以在其中的权限不同的情况下创建一个MIP,当然,嵌入式MIP具有其代码在ROM中的MIP,无法通过商店修改其说明。但是,即使那样,即使存储到代码地址的存储错误,代码和数据也必须映射到相同物理地址空间的不同部分。可能您可以构建一个MIP,即使是大量代码地址的错误,但这不太可能。如果禁用该区域/页面上执行权限,则跳到数据地址也可能会错。

在带有RAM中的指令的普通MIP上,如果您配置了Write EXEC权限,则可以进行自修改代码。(但是请注意,为了正确性,您通常需要刷新I-CACHE,该Q& a不做的代码。)


和btw,ASM源中的.data确实是指.data e节,链接器最终将其链接到可执行文件的数据 segment 。查看ELF文件格式中的部分和段的区别。

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

取决于您对" mips"的含义:

  • 像您在某些WLAN路由器中找到的真实MIPS CPU?

  • 一些MIPS模拟器,例如Spim或Mars?

对于真实MIPS CPU,这取决于如何配置内存管理单元:

如果内存管理单元允许访问对代码段的访问,则确实可以在地址0x1004中获得指令的二进制表示。

(顺便说一句:您需要使用addi $s1, $0, 0x1004来确保$s1确实包含0x1004,因为$s1可以包含另一个值,而不是0。)

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

如果您使用一些模拟器,例如SPIM,火星(或其他任何一个),则取决于模拟器的工作方式...

理论上可能有三种模拟器:

  • 有些崩溃
  • 有些阅读二进制表示的
  • 有些读一些"愚蠢"的值

最新更新