获取CALL的微操作

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位宽度?


很高兴看到有关微代码的问题。+1 - Preet Sangha
1
这似乎是一个硬件实现问题,而不是汇编问题,但如果您的指令是32位且获取是8位,则每个指令需要4次获取... - Chris Dodd
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接