给定指令的地址,可以使用MIPS中的SW和LW指令访问代码段内存吗?
例如:
0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)代码将加载到$s2中吗?0x0000 (给定数据段为空)或0x1004处指令的二进制表示形式。
编辑:
AFAIK,由于指令内存和数据存储器的分离,MIPS处理器中的流水线是可能的--如果我错了,请纠正我。
编辑2:
我找到了一个question,它的答案意味着可以使用LW和SW访问和修改指令。因此,答案是$s2将包含0x1004处指令的二进制表示形式。
发布于 2017-12-25 20:22:52
您将在address 0x1004加载指令的机器编码。
MIPS有一个平面内存模型;将不同的segments of an executable映射/加载到单个平面内存地址空间的不同部分;it's a Von Neumann architecture,其中代码字节和指令字节是相同的东西,并且共享相同的地址空间。
代码地址使用与数据地址相同的地址空间。Martin的回答表明,在权限至少不同的情况下,创建MIPS是可能的,当然,在ROM中使用其代码的嵌入式MIPS无法通过存储来修改其指令。但是即使这样,代码和数据也必须映射到同一物理地址空间的不同部分,即使存储到代码地址错误。可能您可以构建一个MIPS,即使是大量的代码地址都有错误,但这是不可能的。如果禁用该区域/页上的执行权限,跳转到数据地址也可能出错。
如果配置了self-modifying code is possible权限,则在普通MIPS上配置其在内存中的指令。(但是请注意,为了正确起见,您通常需要刷新I-缓存,而Q&A中的代码并没有这样做。)
.data源中的BTW实际上是指链接器最终链接到可执行文件的数据段的.data部分。见What's the difference of section and segment in ELF file format。
这里最重要的一点是,可执行文件的片段与x86风格的分段内存是不一样的。(不过,术语也有类似的起源)。
发布于 2017-12-25 20:04:54
取决于“MIPS”是什么意思:
对于真正的MIPS CPU,它取决于内存管理单元是如何配置的:
如果内存管理单元允许对代码段的读访问,您实际上将在地址0x1004处获得指令的二进制表示形式。
(顺便说一句:您需要使用addi $s1, $0, 0x1004来确保$s1真正包含0x1004,因为$s1可能包含比0更多的值。)
如果内存管理单元不允许访问代码段,程序将崩溃。(大多数MIPS CPU似乎不允许这种设置。)
如果您使用像SPIM、MARS (或任何其他模拟器)这样的仿真器,则取决于模拟器的工作方式.
理论上可以有三种类型的模拟器:
https://stackoverflow.com/questions/47971462
复制相似问题