【问题标题】:Base + Offset Addressing Mode基址+偏移寻址模式
【发布时间】:2015-05-05 21:50:56
【问题描述】:

我只需要解释一下基本 + 偏移寻址模式的工作原理。很难找到一个明确的答案。 (我一直在使用 LC-3,不确定这是否重要)。一个简单的例子也会很有帮助。

谢谢!

【问题讨论】:

  • 我相信我找到了下面列出的答案。感谢那些试图回答问题但答案不正确的人(至少就 LC-3 架构而言,我不确定,也许 base + offset 在其他地方的工作方式不同)。任何非常熟悉 LC-3 并且对基本 + 偏移寻址的工作方式有信心的人,请查看我下面的答案,看看它是否正确。谢谢!

标签: addressing-mode


【解决方案1】:
MOV EAX,[EBP+8]
MOV EBX,[EBP+12]

EBP 是此处的基址(保存基址),例如“00402000” 因此 EAX 将加载地址 [00402000+8] 中的值,即 00402004

【讨论】:

  • 不是我想要的。在 LC-3 中,使用的基数是寄存器。 LC-3 操作码的指令如下所示: 0110 010 110 001101 前四位是操作码(本例中为 LDR);接下来的三个是目标寄存器;接下来的三个是基址寄存器;最后 6 个是偏移量(在 2 的补码中)。如果我是正确的(如果我错了,请任何人纠正我),它会获取基址寄存器的值,这是一个地址,将偏移量添加到它,并将值存储在目标寄存器中,尽管我不能似乎得到了正确的答案。
【解决方案2】:

基址+索引寻址方式

2 寄存器指定指令中操作数的地址。 将存储在这些寄存器中的数值相加得到操作数的完整地址。

Ex.
A = 1000
Register A = 1000
Register B = 8

MOV C, [A,B] => C = contents of location A+B 

Base + Indexing 寻址有一种风格,称为 base + Index + 位移

位移 = 添加到基数 + 索引的指令中的立即值。 这就是您在操作码中看到的内容。

指令 = OPCODE + 操作数 1 寄存器规范 + 操作数 2 的基址寄存器规范 + 操作数 2 的索引寄存器规范 + 立即数。

想象一个具有 8 位寄存器空间的微处理器。

所以一个 16 位的操作数可能有

4 位操作码

3 位基址寄存器 3位索引寄存器 6 位用于立即位移。

谢谢,

【讨论】:

  • 我不认为这是正确的。根据我在课堂上学到的知识,我知道您没有将两个寄存器加在一起。目的寄存器仅用于存储计算值,不作为操作数使用。
【解决方案3】:

我相信我已经找到了答案。我会把它贴在这里,以防它帮助其他有问题的人。我在老师提供的 100 张幻灯片中找到了答案 XD

这是使用基址寄存器 R6 和目标寄存器 R2 执行 LDR 时发生的情况:

MAR<-R6 + IR[5:0]
MDR<-MEM[MAR]
R2<-MDR

假设 R6 = x3000、IR[5:0] = x5 和 R2 = 0(尽管这个值无关紧要,因为它会在最后加载另一个值)

MAR<-R6 + IR[5:0]

R6 被添加到 IR[5:0](这是 LDR 指令的最后六位中的偏移值)。基数 x3000(R6 的值)添加了 x5(IR[5:0] 的值),得到 x3005。 MAR(内存地址寄存器)现在保存 x3005。

MDR<-MEM[MAR]

将 MAR (x3005) 中的值加载到 MDR(内存数据寄存器)中。

R2<-MDR

MDR (x3005) 中的值被加载到 R2 中。 R2 现在保存值:x3005。

我希望这个问题能帮助像我这样的新寻址模式的人:)

谢谢大家。

【讨论】:

  • "将 MAR (x3005) 中的值加载到 MDR(内存数据寄存器)中。" -- 这似乎是错误的,MEM[MAR] 语法可能意味着从 MAR 中给出的内存地址加载一个值。这并不意味着将 MAR 值本身加载到 MDR 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2015-04-11
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多