Получить микрооперации для 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