Получить микрооперации для CALL

Я пытаюсь понять, как цикл выборки будет записан в микрооперациях для 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 ответ

Решение

Я предполагаю, что для работы с памятью используется архитектура с прямым порядком байтов. Также я предполагаю, что один из регистров называется SP и является указателем стека, растущим вниз. Высокая часть и низкая часть ПК, 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
Другие вопросы по тегам