2012-08-24 11:33:12Morris

[ZJ][模擬水] a349. 2. 指令解譯器

最近更新 : 2012-02-08 17:36

內容 :

志豪家裡有一部很珍貴的骨董電腦。這部電腦只有四個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開始。若已知主記憶體位址01的數值為123456,以下程式片段執行後會將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號)的數值內容。

範例輸入 :help

輸入範例一
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

提示 :

出處 :

100三重考區資訊學科能力競賽 (管理:pcshic)


#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;
}