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

时间:2017-12-25 19:28:31

标签: assembly mips

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

例如:

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

代码加载到$s2的内容是什么? 0x0000(假设数据段为空)或0x1004处的指令的二进制表示?

修改

AFAIK,由于指令存储器和数据存储器的分离,可以在MIPS处理器中进行流水线操作 - 如果我错了,请纠正我。

编辑2:

我找到了question,其答案意味着可以使用LWSW访问和修改说明。因此答案是$s2将包含0x1004处指令的二进制表示。

2 个答案:

答案 0 :(得分:1)

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

MIPS具有平坦的内存模型;将不同的segments of an executable映射/加载到单个平坦存储器地址空间的不同部分; it's a Von Neumann architecture其中代码字节和指令字节是相同的,并共享相同的地址空间。

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

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

BTW,asm源中的.data实际上意味着.data 部分,链接器最终链接到数据可执行文件。请参阅What's the difference of section and segment in ELF file format

这里最重要的一点是,可执行文件的片段与x86样式的分段内存不同。 (术语也有类似的起源)。

答案 1 :(得分:0)

取决于您对“MIPS”的意思:

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

  • 某些MIPS模拟器,如SPIM或MARS?

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

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

(顺便说一下:您需要使用addi $s1, $0, 0x1004来确保$s1确实包含0x1004,因为$s1可能包含除0之外的其他值。)

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

如果您使用某些仿真器,如SPIM,MARS(或任何其他仿真器),则取决于仿真器的工作方式......

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

  • 一些崩溃
  • 读取二进制表示的一些
  • 有些人读了一些“愚蠢”的价值