機械語のプログラム - 法政大学 情報科学部

コンピュータのしくみ
法政大学
情報科学研究科
中田育男
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