[ZJ][模擬水] a349. 2. 指令解譯器
內容 :
志豪家裡有一部很珍貴的骨董電腦。這部電腦只有四個16-位元 (bit) 的暫存器和八個字組 (word,每個字組亦為16-bit) 的主記憶體。它的中央處理器的部份指令格式如下:
指令 | 指令格式 | 指令意義 |
LOAD | LOAD RD MS | 將記憶體位址MS的字組數值載入暫存器RD |
STORE | STORE MD RS | 將暫存器RS的數值存回記憶體位址 MD的字組 |
ADD | ADD RD RS1 RS2 | 將暫存器RS1 和RS2 的數值和存入暫存器RD |
MOVE | MOVE RD RS | 將暫存器RS的數值存入暫存器 RD |
假設暫存器的編號從0開始,主記憶體位址也同樣從0開始。若已知主記憶體位址0和1的數值為123和456,以下程式片段執行後會將579 (123 + 456) 存入主記憶體位址2的字組。
LOAD 0 0 LOAD 1 1 ADD 2 0 1 STORE 2 2 |
請你撰寫一個程式,讀入一串指令(只會出現上述四種指令),模擬這串指令執行的結果,並將執行後第一個暫存器和第一個記憶體字組的內容顯示出來。
假設1:所有暫存器的初始數值皆為0。
假設2:計算過程中不會有溢位情形發生。
輸入說明
:
第一行至第八行為八個記憶體字組的初始數值。
第九行有一個正整數N (1≤ N ≤ 50),代表指令個數。
第十行開始有N行,每一行為一個指令。
輸出說明
:
請依序輸出第一個暫存器(編號0號)和第一個記憶體字組(編號0號)的數值內容。
範例輸入 :
輸入範例一 123 456 0 0 0 0 0 0 4 LOAD 0 0 LOAD 1 1 ADD 2 0 1 STORE 2 2 輸入範例二 100 200 300 400 0 0 0 0 7 LOAD 0 0 LOAD 1 1 ADD 2 0 1 LOAD 0 2 MOVE 3 2 ADD 0 3 1 STORE 3 0
範例輸出 :
輸出範例一 123 123 輸出範例二 500 100
提示
:
出處
:
#include <stdio.h>
int main() {
char cmd[8];
int mem[8] = {}, reg[4] = {};
int i, n, D, S, s1, s2;
for(i = 0; i < 8; i++)
scanf("%d", &mem[i]);
scanf("%d", &n);
while(n--) {
scanf("%s", cmd);
if(cmd[0] == 'L')
scanf("%d %d", &D, &S), reg[D] = mem[S];
else if(cmd[0] == 'S')
scanf("%d %d", &D, &S), mem[D] = reg[S];
else if(cmd[0] == 'A')
scanf("%d %d %d", &D, &s1, &s2), reg[D] = reg[s1] + reg[s2];
else
scanf("%d %d", &D, &S), reg[D] = reg[S];
}
printf("%d\n%d\n", reg[0], mem[0]);
return 0;
}