志豪家裡有一部很珍貴的骨董電腦。這部電腦只有四個 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 | 123 123 |
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 | 500 100 |
解題思路
宣告兩個空的陣列,並且使用判斷式收資料。
範例程式碼-ZeroJudge A349: 指令解譯器
#include <iostream>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int num[8] = {}, tempMem[8] = {};
for (int i = 0; i < 8; i++) {
cin >> num[i];
tempMem[i] = -1;
}
int N;
cin >> N;
for (int i = 0; i<N; i++) {
string str;
cin >> str;
if (str == "LOAD") {
int RD, MS;
cin >> RD >> MS;
tempMem[RD] = num[MS];
}
else if (str == "STORE") {
int MD, RS;
cin >> MD >> RS;
num[MD] = tempMem[RS];
}
else if (str == "ADD") {
int RD, RS1, RS2;
cin >> RD >> RS1 >> RS2;
tempMem[RD] = tempMem[RS1] + tempMem[RS2];
}
else if (str == "MOVE") {
int RD, RS;
cin >> RD >> RS;
tempMem[RD] = tempMem[RS];
}
}
cout << tempMem[0] << "\n" << num[0] << "\n";
}
//ZeroJudge A349
//Dr. SeanXD