【问题标题】:High vs Low memory addresses and branching高与低内存地址和分支
【发布时间】:2013-03-06 01:01:43
【问题描述】:

谁能解释一下在以下问题的上下文中高地址和低地址是什么意思?:

根据定义,“高”地址是那些大的无符号数字,“低”地址是那些小的无符号数字。

使用位于物理内存地址0x320ACB48beq(相等分支)指令可以将控制权转移到的最高地址是什么?

【问题讨论】:

标签: assembly mips memory-address


【解决方案1】:

答案取决于特定的 MIPS 芯片及其 MMU(如果有)。

32 位指令的有效地址为 0 到 4GB-4。但是,如果内存不在整个范围内,或者如果存在内存映射设备,或者如果您启用了虚拟到物理地址的转换,您将根本无法在任意位置或有意义的位置执行代码方式。

如果您将控制权转移到未由内存备份的位置,则会执行垃圾。这同样适用于将控制权转移到代表某些内存映射设备的寄存器或数据缓冲区的位置。

如果页面翻译设置为限制对特定地址区域的访问或不允许在那里执行,则您根本无法在这些区域执行任何操作。

现在,beq 也有一个限制,它可以将控制权从它 (beq) 所在的位置转移到多远。 beq 只能将控制权转移到其位置 +/- 大约 217 个字节 (=128KB)。

因此,理论上,位于 0x320ACB48 的 beq 可以将控制权转移到从 0x320ACB48 + 4 - 32768*4 到 0x320ACB48 + 4 + 32767*4 的任何位置(即 4 的倍数)。

如果beq 位于地址 0 附近,则它可能能够将控制权转移到 4GB 附近,除非 CPU 禁止回绕地址。同样,如果beq 接近 4GB 点,它可能 能够将控制权转移到地址 0 附近,除非 CPU 再次禁止地址换行。

【讨论】:

  • 您能否再解释一下这句话:“理论上位于 0x320acb48 的 beq 可以将控制权转移到任何 4 的倍数的位置”。 beq 给我们留下了 16 位的偏移量,那么为什么这条指令可以将控制权转移到的最高内存地址不是 0x7fff 或 32,767?我无法理解你的逻辑。
  • @curiousX MIPS 指令(除非我们谈论的是 microMIPS 和 MIPS16e 之类的扩展)长 4 个字节,并且始终位于 4 的倍数的地址上。使用 16 位没有意义offset 作为字节偏移量,那将是一种浪费。因此,分支指令中的 16 位偏移量乘以 4。
猜你喜欢
  • 2018-10-29
  • 2011-10-15
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2015-08-14
  • 2017-01-06
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多