3

我试图了解如何在微操作中编写获取周期,以便 CPU 获取 32 位的 CALL 指令。

MAR is 16 bits wide
MDR is 8 bits wide
PC is 16 bits wide
IR is 16 bits wide
Temp registers are 16 bits wide

我的问题源于指令是 32 位的事实,高 16 位代表操作码,低 16 位代表我们要跳转到的目标地址。

获取周期是这样的:

MAR <- PC

MDR <- M(MAR)

IR <- MDR opcode

MAR <- MDR address

PC <- PC + 1

由于 MDR 只有 8 位宽,我们如何调整这个获取周期以考虑整个操作码和每个 16 位宽的地址?

4

1 回答 1

0

我假设处理内存的小端架构。另外我假设其中一个寄存器称为 SP 并且是一个堆栈指针,向下增长。PC、TEMP、IR的高低部分可以独立访问。

/* FETCH................ */
MAR <- PC
PC <- PC+1
MDR <- M(MAR)  ;low 8 bits of opcode
IRlow <- MDR

MAR <- PC
PC <- PC+1
MDR <- M(MAR)  ;high 8 bits of opcode
IRhigh <- MDR

/* DECODE AND EXECUTE................ */
if MDR is opcode for CALL...
MAR <- PC
PC <- PC+1
MDR <- M(MAR)  ;low 8 bits of destination
TEMPlow <- MDR

MAR <- PC
PC <- PC+1
MDR <- M(MAR)  ;high 8 bits of destination
TEMPhigh <- MDR

SP <- SP-1
MAR <- SP
MDR <- PChigh
M(MAR) <- MDR  ;store hi part of next instruction in stack

SP <- SP-1
MAR <- SP
MDR <- PClow
M(MAR) <- MDR  ;store low part of next instruction in stack

PC <- TEMP    ;update PC to jump to the called address
于 2013-11-21T14:52:24.930 回答