Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在MIPS中使用SW和LW访问代码段内存_Assembly_Mips - Fatal编程技术网

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

Assembly 在MIPS中使用SW和LW访问代码段内存,assembly,mips,Assembly,Mips,在给定指令地址的情况下,是否可以使用MIPS中的SW和LW指令访问代码段内存 例如: 0x1000: ADDI $s1, $zero, 0x1000 0x1004: LW $s2, 4($s1) 代码将加载到$s2中的是什么?0x0000给定数据段为空或0x1004处指令的二进制表示 编辑: 另外,由于指令内存和数据内存的分离,MIPS处理器中的流水线是可能的-如果我错了,请纠正我 编辑2: 我找到了一个,答案是可以使用LW和SW访问和修改指令。因此,答案是$s2将包含0x1004处指令的二进

在给定指令地址的情况下,是否可以使用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路由器中发现的那样

像SPIM或MARS这样的MIPS模拟器

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

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

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

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

如果您使用一些仿真器,如SPIM、MARS或任何其他仿真器,这取决于仿真器的工作方式

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

有些飞机坠毁了 一些读取二进制表示的 有些人读了一些愚蠢的价值观
您将在地址0x1004处加载指令的机器编码

MIPS具有平坦的存储模型;不同的数据被映射/加载到单个平面内存地址空间的不同部分;其中,代码字节和指令字节是相同的,并且共享相同的地址空间

代码地址使用与数据地址相同的地址空间。Martin的回答表明,可以创建一个MIPS,其中至少有不同的权限,当然,在ROM中带有代码的嵌入式MIPS不能用存储修改其指令。但即使这样,代码和数据也必须映射到同一物理地址空间的不同部分,即使存储到代码地址出现故障。可能您可以构建一个MIPS,即使加载的代码地址出现错误,但这不太可能。如果您在该区域/页面上禁用了执行权限,则跳转到数据地址也可能会出错

如果已配置写入+执行权限,则在指令位于RAM中的普通MIPS上。但是请注意,为了保证正确性,您通常需要刷新i-cache,而Q&A中的代码并没有这样做

顺便说一句,asm源中的.data实际上是指.data部分,链接器最终将其链接到可执行文件的数据段中。看


这里最重要的一点是,可执行文件的段与x86风格的分段内存不同。不过,这个术语也有类似的起源。

MIPS有设置?@old_timer:,而不是分段内存模型。但是,是的,OP似乎对程序段和x86风格的分段内存(MIPS没有)感到困惑。@old_timer是的,根据第一个google结果::你的意思是写ADDI$s1、$0、0x1000吗?或者干脆LW$s2,0x1004$零?否则,您的加载地址取决于$s1的初始值。MIPS真的允许您使用execute而不是data read权限设置内存区域/页面吗?您是否也在暗示代码提取可能使用与数据读取不同的地址空间来读取一些愚蠢的值?我看不出除了阅读指令词之外,任何东西都是合理的,除非使用了一个有缺陷的模拟器。谢谢你的回答。我会接受这一点,但我忽略了这里的默认行为。在真实世界的MIPS CPU中,您会期望什么作为默认值?@ArieR:当然,默认值是在地址0x1004处获得指令的机器编码。MIPS具有平坦的存储模型;可执行文件的不同段被映射/加载到单个平面内存地址空间的不同部分;这是一种冯·诺依曼体系结构,其中代码字节和指令字节是相同的。顺便说一句,asm源中的.data实际上是指.data部分,链接器最终将其链接到可执行文件的数据段。@PeterCordes我只是查阅了MIPS R 4400参考手册,因为我也不知道。据我所知,至少R4400不允许这样做。然而,我知道一些MPU不是MIPS,其中SoC中的内存保护单元是由不同的供应商设计的。在这种情况下,第三方MPU可能会保护代码内存不被读取。@Ped7g:依我看,这是一个错误。如果模拟器想要缓存解码的指令,它必须在内部执行,而不是在来宾内存空间中!我不确定这是什么原因
对于模拟器和模拟器,这是一个约定的特定含义。您是否认为模拟器意味着它可能只在asm源代码级别工作?我想这是一种可能的模拟器,它不能完全模拟MIPS机器。好吧,由于指令内存和数据内存的分离,MIPS处理器中的流水线是可能的-如果我错了,请纠正我。@ArieR:你错了。如果我没记错的话,MIPS并不能保证在存储即将执行的指令时会发生什么。旧指令或新指令可能会运行。如果希望存储的数据作为指令可见,则必须在执行之前刷新缓存或其他内容。ARM的工作方式是这样的:指令缓存和管道与数据存储不一致,还有isync指令之类的东西。我没有提到这一点,因为您只询问了负载,而作为代码和数据的共享只读访问是微不足道的,但x86确实有一致的I-cache。现代x86实现,因此,当存储在程序计数器前面的两条指令必须对代码提取可见时,甚至可以通过管道将CPU传输到计算机上。不过,如果没有连贯的代码缓存/管道,那么管道化体系结构要容易得多!是的,这是一个问题,但解决办法只是说,如果你想得到可预测的结果,就不要这样做。如果你能从一些在线资源提供参考,我会接受这个答案-我很难找到一个我自己找到的参考。。。