Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

うさぎでもわかるをモットーに大学レベルの数学・情報科目をわかりやすく解説!

計算機システム1総復習 Part02 プロセッサ編(本番レベル模試)

こんにちは、ももやまです。

今回は計算機のプロセッサについて理解できているか、プロセッサに関する問題を中心とした模擬問題を行基本変形サークルさん [ @kit_matrix ] さんに許可をいただき、こちらのサイトで解説を作成しました。ありがとうございます…!

問題はこちらのツイートからダウンロードしてください!

 

 

問題と解説、配点(私が独自に設定・100点満点)を載せています。

ぜひ1回自分で解いてから解説を見ることをおすすめします。

第1問.総括問題1

つぎの①~⑧の文章がそれぞれ正しければ○、誤りを含んでいれば×を記しなさい。ただし、計算機はストアードプロシージャー方式とする。
(配点  16)

① 計算機は、レジスタ上に保持したプログラムを実行する。

② C言語やアセンブリ言語などの言語は高水準言語(高級言語)と呼ばれている。

③ 計算機内では、効率よく命令を実行するため「演算部」がいたるところに設置されてある。

④ 機械語とは、機械が直接実行することができるバイナリの言語であり、プロセッサに依存の言語である。

⑤ CISCプロセッサは、回路が複雑化されるのを防ぐためにパイプライン処理を導入している。

⑥ プロセッサには必ず加算回路のみが含まれる。

⑦ 演算実行部の演算結果は必ず主記憶に格納される。

⑧ マウスやキーボードは周辺機器と呼ばれている。

 

解説 [2点× 8 = 16点]

① 解答:×

レジスタ上ではなく、メモリ上に保持したプログラムを実行します。

 

② 解答:×

C言語は高級言語なのですが、アセンブリ言語は高級言語とは呼ばれません

 

③ 解答:×

いたるところに設置されてあるのは演算部ではなく、制御部です。

 

④ 解答:○

説明どおりです。機械語はプロセッサに依存しているという2進数(バイナリ)で書かれた言語という部分は大切なので覚えておきましょう。

 

⑤ 解答:×

回路が複雑化されるのを防ぐためにパイプライン処理が導入されているのはRISCプロセッサです。

CISCプロセッサは、回路を複雑にすることで複雑な処理でも少ない命令量で実現できるようにしたプロセッサです。

CISCとRISCの違いを下にまとめたので参考にしてください。

 

CISC・RISCの違い

CISCプロセッサ [Complex Instruction Set Computer](例:Intel:X86)

・回路を複雑にすることにより、複雑な処理でも少ない命令量の記述で実現することが可能。

RISCプロセッサ [Reduce Instruction Set Computer](例:MIPS)

・命令を単純化するかわりに、回路の単純化・パイプライン・並列処理を導入することにより命令を高速で処理することができる

 

⑥ 解答:×

プロセッサには加算回路以外にも乗算回路など様々な回路が入っています。

 

⑦ 解答:×

演算結果は主記憶以外にもレジスタなどに格納されることもあります。

 

⑧ 解答:○

これは言うまでもないでしょう!
皆さんは他にどんな周辺機器を思い浮かんだでしょうか。

 

第2問.総括問題2

つぎの①~⑧の文章がそれぞれ正しければ○、誤りを含んでいれば×を記しなさい。ただし、計算機はストアードプロシージャー方式とする。
(配点  16)

① 機械語の命令は命令の対象を指定するオペコード部と命令の種類を指定するオペランド部に分かれる。

② どのようなプロセッサにおいても機械語命令の長さは固定長である。

③ プログラムカウンタの値は減少しない。

④ サインフラグでは、実行された命令の演算結果の値が負になるとき1がたち、それ以外のときは0が立つ。

⑤ ゼロフラグでは、実行された命令の演算結果の値がその1つ前に格納された値と等しい(差が0となる)ときに0がたち、そうでないとき1がたつ。

⑥ 比較命令では、演算結果は保存されずフラグレジスタのみが更新される。

 x \lt y のとき、 x - y を実行するとサインフラグ(SF)とゼロフラグ(ZF)はともに0となる。

 x \leqq y のとき、 x - y を実行するとSFとZFの値は必ず異なる。

 

解説 [2点× 8 = 16点]

① 解答:×

よく問題を読みましょう。

オペコード部:命令の種類を特定(動詞に相当)
オペランド部:命令の対象を指定(目的語に相当)

オペコードとオペランドが逆に書かれていますね。よって誤り。

 

② 解答:×

固定長ではない機械語の命令もあります。

 

③ 解答:×

例えば2の補数をうまく使うとPCの値を減らすことができます。

 

④ 解答:○

記述そのままです。サインフラグは演算結果が負のときに1となります。

 

⑤ 解答:×

ゼロフラグは、演算結果が0のときに1、それ以外のときに0となるフラグレジスタです。

 

⑥ 解答:○

記述そのままです。演算結果が保存されない命令もあるので覚えておきましょう。

 

⑦ 解答:×

2つの演算を行うと演算結果は負となりますね。なのでサインフラグは1となり、誤りです。

 

⑧ 解答:○

演算結果は0か負となるので必ずサインフラグ・ゼロフラグのどちらかは1となりますね。

第3問.プロセッサの命令実行サイクル

プロセッサの命令実行サイクルについて、以下の問いに答えなさい。

(配点 18)

問1 つぎに記す各実行ステップを実行順に並べなさい。

【実行ステップ】 命令解読・命令実行・命令フェッチ・結果の格納

 

問2 問1で示した実行ステップのうち、「命令フェッチ」で使われるパーツを下記の選択肢からすべて選びなさい。 

【選択肢】 ACC・ALU・DEC・IR・PC

 

問3 「プログラムカウンタ(PC)」とは何をする場所か、簡潔に説明しなさい。

 

問1 [6点完答]

解答: 命令フェッチ 命令解読命令実行 結果の格納

丸覚えするのではなく、流れで覚えましょう。

まずは実行する命令を探します。でもその命令の内容は見ただけではわからずに翻訳(解読)する必要がある。解読が終わったらどんな命令かがわかるので実際に実行してあげます。でも結果を保存してあげないと意味がないので結果の保存も忘れずに。

みたいに覚えるとあまり忘れないと思います。

 

問2 [6点 片方のみの人(かつ余計なものを書いていない人)は3点]

解答: PC(プログラムカウンタ)IR(命令レジスタ)

命令フェッチは、次に実行する命令をPCに聞き、聞いた結果をIRに保存するようなことをしますね。

 

問3 [6点 紫色の部分に3点×2]

解答:次に実行する命令アドレスを保持しているパーツである。

命令レジスタとごっちゃにならないように注意。

参考までに命令レジスタは「現在実行している命令の内容を格納するパーツ」となります。

 

ここまでの内容が怪しい人はこちらの記事で復習しましょう!

www.momoyama-usagi.com

 

以下の問以降ではこちらのプロセッサ仕様書に書かれた命令を用いる。

第4問.プロセッサの動き(独立)

つぎの各状態からのプロセッサの動きについて答えなさい。なお、以下に登場する数値はすべて16進数である。プロセッサの動きは上に書かれたプロセッサ仕様書に基づいて答えること。(配点 20)

現在、プロセッサは直前の命令の実行を完了し、新たな命令実行サイクルを始めるところである。次に実行される機械語が下記の(1)~(5)のそれぞれである場合について、その命令終了時のACCの値を答えなさい。

なお、各小問は独立している。

f:id:momoyama1192:20190721222414g:plain

 

★解説★

まだプロセッサの動きについていまいちわからないという人はこちらの記事をご覧ください。

www.momoyama-usagi.com

各小問ごとにACCの値は0にリセットされるので、加算命令が実質代入命令となる。

(1)

解答:0ABC

命令内容は1ABC。

オペコードが1なので、オペランド下3桁(16進数で、今回はABC)を加算。

よって、答えは0ABC。

 

(2)

解答:0AAC

命令内容は2002。

オペコードが2なので、オペランドで示されたレジスタ(今回は2番レジスタ)を加算。

2番レジスタの値は0AACなので答えは0AAC。

 

(3)

解答:0AAC

命令内容は3ABC。

オペコードが3なので、オペランドで示されたメモリ番地を(今回はABC番地)を直接参照し、加算。

ABC番地の値は0AC6なので答えは0AC6。

 

(4)

解答:0AB0

命令内容は4ABC。

オペコードが4なので、オペランドで示されたメモリ番地を(今回はABC番地)を関節参照(思わせぶり)し、加算。

ABC番地の値は0AC6なので今度は0AC6番地を参照。

0AC6番地の値は0AB0なので、答えは0AB0。

 

(5)

解答:0ACC

命令内容は521C。

オペコードが5なので、インデックスレジスタ修飾でメモリ番地を探し、示されたメモリ番地の値を加算する。

オペランドで示されているレジスタ番号(今回は2)に下2桁(16進数で)の値を加算すればよい。

0AAC(2番レジスタの値) + 1C = AC8

なので、AC8番地を参照すればよい。よって答えは0ACC。

ABC番地の値は0AC6なので今度は0AC6番地を参照。

0AC6番地の値は0AB0なので、答えは0AB0。

 

第5問.プロセッサの動き(連動)

つぎの各状態からのプロセッサの動きについて答えなさい。なお、以下に登場する数値はすべて16進数である。プロセッサの動きは上に書かれたプロセッサ仕様書に基づいて答えること。(配点 30)

現在、プロセッサは直前の命令の実行を完了し、新たな命令実行サイクルを始めるところである。

PCが指定値を超えるまでの間の、各命令開始時のPCと、各命令終了時のACCとSF(サインフラグ)、ZF(ゼロフラグ)の値を答えなさい。

(1) PCが334を超えるまで

 

f:id:momoyama1192:20190721222418g:plain

(2) PCが810を超えるまで

f:id:momoyama1192:20190721222407g:plain

 

 ★解説★

※16進数の記号である 0x や h を省略しています。ご了承ください。

(1)

修正(07/23):328番レジスタを8000と間違えていました、計算結果が修正されているため確認してください。申し訳ございません。

命令ID 1: 開始時のPCの値 → 0326  終了時のACCの値 → 0324

命令内容は0324。

オペコードが0なのでオペランドをそのまま代入。

 

オペランドが0324なのでACCの値も0324となる。

 

命令ID 2: 開始時のPCの値 → 0328  終了時のACCの値 → 0334

命令内容は8001 (修正しました)

オペコードが8なのでオペランドで指定されたレジスタの値とのビットごとの論理和を取る。

 

オペランドが1なので1番レジスタの値を見る。すると、0514なので、0514と0324のビットごとの論理和を取ればよい。

0514  or  0324  = 0734

よりACCの値は0734となる。 

 

命令ID 3: 開始時のPCの値 → 0330  終了時のACCの値 → 0734

命令内容はD334。

オペコードがDなので、ZFが1のとき(ACCが0のとき)にオペランドで指定された番地にPCをジャンプする。

だが、ACCの値は0ではないので無視。

 

命令ID 4: 開始時のPCの値 → 0332  終了時のACCの値 → 076D

命令内容は1439。

オペコードが1なので、オペランドの値を加算する。

オペランドは439なので、734 + 439 の16進数計算をすればよい。結果は0B6D。

 

命令ID 5: 開始時のPCの値 → 0334  終了時のACCの値 → 1529

命令内容は4ABC。

オペコードが4なので、オペランドで示されたメモリ上の値を間接参照(思わせぶり)し、加算する。

オペランドはABCなので、まずはABC番地の中身を確認。

すると0ABEになっているので今度はABE番地を確認、すると09BCなので、09BCを現在のACCの値である76Dに加算すればよい。

 

計算結果は、1529となり、ACCには1529が代入される。

 

(2)

f:id:momoyama1192:20190721223627g:plain

命令ID 1: 開始時のPCの値 → 0802  終了時のACCの値 → F0F0

命令内容は7003。

オペコードが7なので、オペランドで示されたレジスタの否定(2進数の0と1入れ替え)を代入する。

3番レジスタの内容は0F0Fなので、否定にするとF0F0となる(比較的簡単な計算)。

 

よってACCはF0F0となる。

 

命令ID 2: 開始時のPCの値 → 0804  終了時のACCの値 → FFF0

命令内容は5004。

オペコードが5なので、インデックスレジスタ修飾で示されたメモリ上の値を加算する。

オペランドで示されたレジスタ番号は0(値は0812)、値は4なので、0番レジスタの値に4を足した値のメモリ番地(816番地)を見ればよい。

すると、0F00となっているので、F0F0 + 0F00をすればよい。

 

よってACCはFFF0となる。

 

命令ID 3: 開始時のPCの値 → 0806  終了時のACCの値 → FFF8

命令内容は2001。

オペコードは2なので、1番レジスタの値(0008)を加算する。

するとACCはFFF8となる。

 

命令ID 4: 開始時のPCの値 → 0808  終了時のACCの値 → FFF8

命令内容はE806。

オペコードはEなので、ZFが0のとき、オペランドで指定されたアドレス(806)にワープする。

今回はACCがFFF8なので、ZFは0であり、806番地にワープする。

 

命令ID 5: 開始時のPCの値 → 0806  終了時のACCの値 → 0000

命令内容は2001。

オペコードは2なので、1番レジスタの値(0008)を加算する。

するとACCは0000となる。

 

命令ID 6: 開始時のPCの値 → 0808  終了時のACCの値 → 0000

命令内容はE806。

オペコードはEなので、ZFが0のとき、オペランドで指定されたアドレス(806)にワープする。

しかし、ZFは1(ACCが0000)なので無視。

 

なお、ここまでの操作をもし間違えていた場合、永久にループします!!! 

 

命令ID 7: 開始時のPCの値 → 0810  終了時のACCの値 → 0000

命令内容は0000。

オペコードは0なので、オペランド(000)を代入。

結果は0000。変わらず。

 

さいごに

今回は計算機システムの総復習として、プロセッサ、機械語などに関するまとめ問題の解説を行いました。

仕様書を見ながらプロセッサの動きを理解することができれば、計算機の気持ちに一歩近づいたんではないでしょうか!