根据指令的地址,是否可以使用MIPS中的SW
和LW
指令访问代码段内存?
例如:
0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)
代码加载到$s2
的内容是什么? 0x0000
(假设数据段为空)或0x1004
处的指令的二进制表示?
修改
AFAIK,由于指令存储器和数据存储器的分离,可以在MIPS处理器中进行流水线操作 - 如果我错了,请纠正我。
编辑2:
我找到了question,其答案意味着可以使用LW
和SW
访问和修改说明。因此答案是$s2
将包含0x1004处指令的二进制表示。
答案 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(或任何其他仿真器),则取决于仿真器的工作方式......
理论上可以有三种类型的模拟器: