コンピュータのしくみ 法政大学 情報科学研究科 中田育男 1 本講義では、機械語のプログラムを学んで コンピュータのしくみ(動作原理)を理解する。 コンピュータ(計算機)が実行できるのは、 その計算機の機械語のプログラムだけである。 どんなソフトウェアも、結局は機械語のプログラム として実行される。 機械語のプログラムは、機械語の命令の列である。 機械語の命令は1と0を組み合わせたものである。 そのままでは書きにくいので、アセンブラ言語が 開発された(アセンブリ言語ともいう)。 本講義では、アセンブラ言語によるプログラムを学ぶ。 2 コンピュータの主役はCPU(Central Processing Unit) コンピュータの構成要素 コンピュ−タ 制御 装置 演算 装置 入力 装置 記憶 装置 出力 装置 プロセッサ CPU 3 プログラムが動くまでの手順 プログラマがJavaやCなどの高水準言語で プログラムを書く Z = (X + Y); プログラムをアセンブラ言語に 翻訳(コンパイル)する LDR LDR ADD STR R0, X R1, Y R0,R0,R1 マシン語に変換する R0, Z 0110101100100000 0100001000010101 0110110000010111 0010111000010111 0110110000010110 実行時にメモリーにコピー CPUがプログラムの 内容を解釈・実行する CPU メモリー 4 機械語のプログラムの動作 CPUがメモリーにある 機械語のプログラムの 内容を解釈・実行する CPU メモリー CPU(中央処理装置) 5 CPU(中央処理装置) メモリ(記憶装置) プログラムカウンタPC 10 10 11 12 13 命令レジスタIR 条件コードNZCV R0 R1 ……… 番 地 ア ド レ ス ( 演算レジスタ ……… LDR R0, X LDR R1, Y ADD R0, R0,R1 命 令 STR R0, Z 20 (X) 21 (Y) 22 (Z) 15 21 0 デ ー タ ………. ) 実際には“LDR R0, X”は “0101100111110000…”のような2進符号 6 CPU(中央処理装置) プログラムカウンタPC 10 命令レジスタIR LDR R0, X 条件コードNZCV 演算レジスタ メモリ(記憶装置) 10 11 取 命 12 り 令 13 出の し 20 (X) 21 (Y) 22 (Z) ……… LDR R0, X LDR R1, Y ADD R0, R0,R1 命 令 STR R0, Z ……… 15 21 0 デ ー タ R0 R1 ………. 実際には“LDR R0, X”は “0101100111110000 …”のような2進符号 7 CPU(中央処理装置) メモリ(記憶装置) プログラムカウンタPC 11 命令レジスタIR LDR R0, X 解読 10 11 12 13 条件コードNZCV R0 R1 ……… 実行 演算レジスタ ……… LDR R0, X LDR R1, Y ADD R0, R0,R1 命 令 STR R0, Z 20 (X) 21 (Y) 22 (Z) 15 21 0 15 ………. “LDR R0, X” は「X番地のデータをレジスタR0に載せる」命令 8 LDRはLoad Registerという命令 デ ー タ CPU(中央処理装置) メモリ(記憶装置) プログラムカウンタPC 命令 11 取出 命令レジスタIR LDR R1, Y 解読 条件コードNZCV 実行 演算レジスタ R0 15 R1 21 ……… 10 LDR R0, X 11 LDR R1, Y 12 ADD R0, R0,R1 命 令 13 STR R0, Z ……… 20 (X) 15 21 (Y) 21 デ 22 (Z) 0 ー タ ………. “LDR R1, Y” は「Y番地のデータをレジスタR1に載せる」命令 9 (Y番地のデータはそのまま) CPU(中央処理装置) メモリ(記憶装置) プログラムカウンタPC 命令 12 取出 命令レジスタIR ADD R0,R0,R1 条件コードNZCV 解読 演算レジスタ 実行 R0 36 15 R1 21 ……… 10 LDR R0, X 11 LDR R1, Y 12 ADD R0,R0,R1 命 令 13 STR R0, Z ……… 20 (X) 15 21 (Y) 21 デ 22 (Z) 0 ー タ ………. “ADD R0,R0,R1” は「R0 = R0 + R1を実行する」命令 (レジスタR1はそのまま) 10 CPU(中央処理装置) プログラムカウンタPC 13 命令レジスタIR STR R0, Z 条件コードNZCV 演算レジスタ R0 36 R1 21 メモリ(記憶装置) ……… 10 LDR R0, X 命令 11 LDR R1, Y 取出 12 ADD R0, R0,R1 命 令 13 STR R0, Z ……… 15 解読 20 (X) 21 (Y) 21 デ 22 (Z) 36 ー 実行 タ ………. “STR R0, Z” は「レジスタR0のデータをZ番地に格納する」命令 ( STRはStore Register)Z = X + Y; の実行をしたことになる 11 命令 LDR STR ADD SUB MUL CMP BEQ BNE BLT BGE In Out 動作 Ri, mem Ri = mem (レジスタRiにmemの値を載せよ) Ri, mem mem = Ri (memにRiの値を格納せよ) Ri, Rj, Rk Ri = Rj + Rk Ri, Rj, Rk Ri = Rj - Rk Ri, Rj, Rk Ri = Rj * Rk Ri, Rj Ri - Rj した時の条件コードNZCVのセット Z = ((Ri - Rj==0)? 1 : 0) = ((Ri == Rj)? 1 : 0) , Zero N = ((Ri - Rj < 0)? 1 : 0) = ((Ri < Rj)? 1 : 0) , Negative lab1 Z==1ならlab1番地の命令へ行け(EQual) (そうでなければ,次の命令へ行け) lab1 Z==0ならlab1番地の命令へ行け(Not Equal) (そうでなければ,次の命令へ行け) lab1 N==1ならlab1番地の命令へ (Less Than) lab1 N==0ならlab1番地の命令へ (Greater or Eq) Ri レジスタRiに整数を入力せよ Ri レジスタRiの値(整数)を出力せよ 12 プログラム例 L1 In R0 ADD R0, R0,R0 Out R0 整数をR0に入力 整数の2倍 その結果を出力 LDR LDR LDR ADD Out CMP BNE M0 = 0; M1 = 1; M10 = 10; とする R0 = 0; R1 = 1; R2 = 10; R0 = 1; R0 = 2; =3;…; =10; 1を出力 2, 3, …,10を出力 Z = ((R0 == 10)? 1 : 0) Z==0ならL1へ.R0 == 10なら次へ R0, M0 R1, M1 R2, M10 R0,R0,R1 R0 R0, R2 L1 R0 = M0; do { R0 = R0 + M1; System.out.println(R0); } while (R0 != M10) 13 CPU(中央処理装置) プログラムカウンタPC 10 命令レジスタIR LDR R0, M0 条件コードNZCV メモリ 命令 取出 解読 演算レジスタ R0 R1 R2 0 実行 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 13(L1) ADD R0,R0,R1 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 20 (M0) 0 21 (M1) 1 22 (M10) 10 23 ………. 14 命 令 デ ー タ CPU(中央処理装置) プログラムカウンタPC 11 命令レジスタIR LDR R1, M1 条件コードNZCV メモリ 命令 取出 解読 演算レジスタ R0 0 R1 1 R2 実行 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 13(L1) ADD R0,R0,R1 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 20 (M0) 0 21 (M1) 1 22 (M10) 10 23 ………. 15 命 令 デ ー タ CPU(中央処理装置) メモリ プログラムカウンタPC 12 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR LDR R2, M10 条件コードNZCV 命令 取出 解読 演算レジスタ R0 0 R1 1 R2 10 実行 16 CPU(中央処理装置) メモリ プログラムカウンタPC 13 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR ADD R0,R0,R1 命令 取出 条件コードNZCV 解読 演算レジスタ R0 1 R1 1 R2 10 実行 17 CPU(中央処理装置) メモリ ……… 10 LDR R0, M0 命令 11 LDR R1, M1 取出 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 解読 デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 実行 23 ………. プログラムカウンタPC 14 命令レジスタIR Out R0 条件コードNZCV 演算レジスタ R0 1 R1 1 R2 10 出力: 1 18 CPU(中央処理装置) メモリ プログラムカウンタPC 15 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR CMP R0,R2 条件コードNZCV 1000 演算レジスタ R0 1 R1 1 R2 10 出力: 1 命令 取出 解読 実行 19 CPU(中央処理装置) メモリ プログラムカウンタPC 1613 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR BNE L1 条件コードNZCV 1000 演算レジスタ R0 1 R1 1 R2 10 出力: 1 命令 取出 解読 実行 20 CPU(中央処理装置) メモリ プログラムカウンタPC 13 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR ADD R0,R0,R1 条件コードNZCV 1000 命令 取出 解読 演算レジスタ R0 2 R1 1 R2 10 出力: 1 実行 21 CPU(中央処理装置) プログラムカウンタPC 14 命令レジスタIR Out R0 条件コードNZCV 1000 演算レジスタ R0 2 R1 1 R2 10 メモリ ……… 10 LDR R0, M0 命令 11 LDR R1, M1 取出 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 解読 デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 実行 23 ………. 出力: 1 2 22 CPU(中央処理装置) メモリ プログラムカウンタPC 15 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR CMP R0,R2 条件コードNZCV 1000 演算レジスタ R0 2 R1 1 R2 10 命令 取出 解読 実行 出力: 1 2 23 CPU(中央処理装置) メモリ プログラムカウンタPC 1613 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR BNE L1 条件コードNZCV 1000 演算レジスタ R0 2 R1 1 R2 10 命令 取出 解読 実行 出力: 1 2 24 CPU(中央処理装置) メモリ プログラムカウンタPC 13 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR ADD R0,R0,R1 条件コードNZCV 1000 命令 取出 解読 演算レジスタ R0 3 R1 1 R2 10 実行 出力: 1 2 25 CPU(中央処理装置) プログラムカウンタPC 14 命令レジスタIR Out R0 条件コードNZCV 1000 演算レジスタ R0 3 R1 1 R2 10 メモリ ……… 10 LDR R0, M0 命令 11 LDR R1, M1 取出 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 解読 デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 実行 23 ………. 出力: 1 2 3 26 CPU(中央処理装置) プログラムカウンタPC 14 命令レジスタIR Out R0 条件コードNZCV 1000 演算レジスタ R0 10 R1 1 R2 10 メモリ ……… 10 LDR R0, M0 命令 11 LDR R1, M1 取出 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… 解読 デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 実行 ………. 出力: 1 2 3 4 5 6 7 8 9 10 27 CPU(中央処理装置) メモリ プログラムカウンタPC 15 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR CMP R0,R2 条件コードNZCV 0110 演算レジスタ R0 10 R1 1 R2 10 命令 取出 解読 実行 出力: 1 2 3 4 5 6 7 8 9 10 28 CPU(中央処理装置) メモリ プログラムカウンタPC 1617 ……… 10 LDR R0, M0 11 LDR R1, M1 12 LDR R2, M10 命 13(L1) ADD R0,R0,R1 令 14 Out R0 15 CMP R0,R2 16 BNE L1 ……… デ 20 (M0) 0 ー 21 (M1) 1 タ 22 (M10) 10 23 ………. 命令レジスタIR BNE L1 条件コードNZCV 0110 演算レジスタ R0 10 R1 1 R2 10 命令 取出 解読 実行 出力: 1 2 3 4 5 6 7 8 9 10 29 問題 次のプログラムを実行すると何が出力されるか (入力された2つの整数をx,yとしたとき何が出力されるか, 出来るだけ簡潔に答えよ。) (1) In In ADD MUL Out R0 R1 R0, R0, R1 R0, R0, R0 R0 (2) L1 In STR In STR CMP BLT LDR Out R0 R0, M1 R1 R1, M2 R0, R1 L1 R0, M2 R0 30
© Copyright 2024 ExpyDoc