我只需要解释基本 + 偏移寻址模式如何工作。很难找到一个明确的答案。(我一直在使用 LC-3,不确定这是否重要)。一个简单的例子也会有所帮助。
谢谢!
MOV EAX,[EBP+8]
MOV EBX,[EBP+12]
EBP 是此处的基址(保存基地址),例如“00402000”,因此 EAX 将加载地址 [00402000+8] 中的值,即 00402004
2 寄存器指定指令中操作数的地址。将存储在这些寄存器中的数值相加以获得操作数的完整地址。
Ex.
A = 1000
Register A = 1000
Register B = 8
MOV C, [A,B] => C = contents of location A+B
Base + Indexing 寻址有一种风格,称为 base + Index + 置换
位移 = 添加到基数 + 索引的指令中的立即值。这就是您在操作码中看到的内容。
指令 = 操作码 + 操作数 1 寄存器规范 + 操作数 2 的基址寄存器规范 + 操作数 2 的索引寄存器规范 + 立即数。
想象一个具有 8 位寄存器空间的微处理器。
所以一个 16 位的操作数可能有
4位操作码
3 位用于基址寄存器 3 位用于索引寄存器 6 位用于立即位移。
谢谢,
我相信我已经找到了答案。我会把它贴在这里,以防它帮助其他有问题的人。我在老师提供的 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。
我希望这个问题可以帮助那些像我这样的寻址模式的新手:)
谢谢你们。