スライド 1: as-3. プログラムカウンタと 命令実行サイクル
スライド 2
スライド 3
スライド 4
スライド 5
スライド 6
スライド 7
スライド 8
スライド 9
スライド 10
スライド 11
スライド 12
スライド 13: 命令実行サイクル
スライド 14: CPU 68000 では
スライド 15
スライド 16
スライド 17
スライド 18
スライド 19
スライド 20
スライド 21
スライド 22
スライド 23
スライド 24:
スライド 25
スライド 26
スライド 27
スライド 28: 例題.繰り返し
スライド 29
スライド 30
スライド 31
スライド 32
スライド 33
スライド 34
スライド 35
スライド 36
スライド 37
スライド 38
スライド 39
スライド 40
スライド 41
スライド 42: 無条件分岐命令 bra
スライド 43
スライド 44
スライド 45
スライド 46: まとめ
as
-3.
プログラムカウ
ンタと
命令実行サイクル
1
金子邦彦
(
68000
アセンブラ)
URL:
https://www.kkaneko.jp/cc/as/index.ht
ml
アセンブラ
プログラム
ファイル
テキストエディタなど
で記述
.
add.s
など
アセンブラ
m68k-
as
など
HEX
ファイル
自動生成
.
add.abs
など
これは
ファイル
メモリのどこに何を
置くかを書いたファイル
メモリの中身
メモリにロード
HE
X
ファ
イルの
例
S0 06 000048445
2 1B
S2 14 000000 30
39000000
18D07900
00001A33C
00000 14
S2 0C 00
0010 00
1C40484
E7
20000 7F
S2 0A 000018 00
0A001400
00 BF
S5 03 0003 F9
S8 04 000000 FB
ステータスレコード(ファイル名など)
データレコード
データレコード:
メモリにロードされるべき中身
その他のレコード:
管理情報
データレコード数
終了を示す
S0 06 000048445
2 1B
S2 14 000000 30
39000000
18D07900
00001A33C
00
00
0 14
S2 0C 000010 00
1C40484E
720
00
0 7
F
S2 0A 00
0018 00
0A00140
0
0
0 BF
S5 03 0003 F9
S8 04 000000 FB
チェックサム
バイト数
メモリアドレス
データの中身
メモリの中身
①
①
メモリにロード
②
②
③
③
メモリ読み出し
(x
から
)
→
データレジスタ
d0
に格納
x
→
0x000018
y
→
0x00001a
z
→
0x00001c
アセンブラプログラムファイル中
ではラベル名
メモリアドレス
メモリ読み出し
(x
から
)
→
データレジスタ
d0
に格納
x
→
0x000018
y
→
0x00001a
z
→
0x00001c
アセンブラプログラムファイル中
ではラベル名
メモリアドレス
0x00000018
を扱う
1.
データ転送を行え
2.
転送先は
D0
3.
処理はワード単位
メモリ読み出し
(y
から
)
と加算
→
データレジスタ
d0
との加算
→
加算の結果は
d0
に格納
S0 06 000048445
2 1B
S2 14 000000 30
39000000
18D07900
00001A33C
00000 14
S2 0C 00
0010 00
1C40484
E7
20000 7F
S2 0A 000
018 00
0
A001400
0
0 B
F
S5 03 000
3 F9
S8 04 00
0
000 F
B
x
→
0x000018
y
→
0x00001a
z
→
0x00001c
1.
加算を行え
2.
使用するレジスタは
D0
3.
処理はワード単位
メモリアドレス
0x0000001A
を扱う
メモリ書き込み
(z
へ
)
→
データレジスタ
d0
の中身
を書き込む
S0 06 000048445
2 1B
S2 14 000000 30
39000000
18D07900
00001A33C
00000 14
S2 0C 00
0010 00
1C40484
E7
20000 7F
S2 0A 000018 00
0A001400
00 BF
S5 03
0
0
03 F9
S8 04
0
0
0000 F
B
x
→
0x000018
y
→
0x00001a
z
→
0x00001c
1.
データ転送を行え
2.
転送元は
D0
3.
処理はワード単位
メモリアドレス
0x0000001C
を扱う
メモリ
(
RAM)
R/W
①
リード信号
①
アドレス
②
読み出し結果
CPU
プロ
グラム
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x000000
この授業では,説明を簡単にするために,
1
命令分が
1度に読み出される説明としている
読み出し
足し算のプログラム
30 39 00 00 00
18
命令フェッチ
メモリ中の「プログラム命令」を,
CPU
へ読み
込む
こと
足し算のプログラム
30 39 00 00 00
18
命令デコード
CPU
内で,プログラム命
令の解読が行わ
れること
1.
データ転送を行え
2.
転送先は
D0
3.
処理はワード単位
メモリアドレス
0x00000018
を扱う
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x000018
読み出し
足し算のプログラム
命令実行
「プログラム命令」の実行
1.
データ転送を行え
2.
転送先は
D0
3.
処理はワード単位
メモリアドレス
0x00000018
を扱う
0x000a
が
D0
の下位
2
バイト
に入る
命令実行サイクル
命令フェッチ
プログラム命令の読み
出し
命令デコード
プログラム命令の解読
命令実行
プログラム命令の実行
命令実行サイクル
各命令ごとに「命令実行サイクル」を繰り返す
CPU 68000
では
データ
レジスタ
(data
reg
ist
ers
)
D0
D1
D2
D3
D4
D5
D6
D7
31
16
15 8 7
0
アドレス
レジスタ
(address
registers)
A0
A1
A2
A3
A4
A5
A6
31
16
15
0
31
16
15
0
A7
A7
ユーザ
スタックポインタ
スーパバイザ
スタックポインタ
(user stack
pointer
,
supervisor
stack
pointer)
31 24
23
0
プログラム
カウンタ
(program
cou
nter)
15
8
7
0
ステータス
レジスタ
(status
reg
ister)
CCR
PC
SP
とも書く
SR
32
ビ
ット
長
32
ビット長
32
ビット長
16
ビット長
32
ビット長
プログラムカウンタの機能
について,今から説明する
68000
アセ
ンブ
ラ
プロ
グラムフ
ァ
イル
①
②
③
④
⑤
プログラムは順次実行される
①
→
②
→
③
→
・・・
メモ
リの中
身
①
②
③
③
④
⑤
命令フェッチは,順次行われ
る
①
→
②
→
③
→
・・・
開始は
0x000000
①
0x000000
から命令フェッチ
②
0x000006
から命令フェッチ
③
0x00000c
から命令フェッチ
...
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x000000
読み出し
足し算のプログラム
プログラムカウンタ
0x000000
この説明は,プログラムカウンタの値が
前もって,
0x000000
にセットされて
いた場合
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
30 39 00 00 00
18
足し算のプログラム
プログラムカウンタ
0x000000
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
30 39 00 00 00
18
0x000006
命令デコ
ードの時
点で
,
プログラ
ムカ
ウン
タの値が
次に進
む
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x000018
読み出し
足し算のプログラム
0x000a
が
D0
の下位
2
バイト
に入る
プログラムカウンタ
0x000006
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x000006
読み出し
プログラムカウンタ
0x000006
d0 79 00 80 00
1a
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
足し算のプログラム
プログラムカウンタ
0x000006
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
d0 79 00 00 00
1a
0x00000c
命令デコ
ードの時
点で
,
プログラ
ムカ
ウン
タの値が
次に進
む
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x00001a
読み出し
足し算のプログラム
d0
との加算
プログラムカウンタ
0x00000c
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
R/W
①
リード信号
①
アドレス
②
読み出し結果
0x00000c
読み出し
1.
命令フェッ
チ
2.
命令デ
コー
ド
3.
命令実行
プログラムカウンタ
0x00000c
命令実行サイクル
1.
命令フェッチ
•
次に実行すべきプログラム命令を,
プロ
グラムカウ
ンタ
を使って,メモリから読み出す
2.
命令デコード
•
読み出した命令を解読し,命令の種類,オペランド
の種類,演算結果の格納場所の情報を得る
•
命令デコードの時点で,
プログラムカウンタ
の値が
次に進む
3.
命令実行
•
命令デコードの
結果に従って,必要と
なるデータにアクセス
•
演算装置に供給し,結果を適当な場所に格納する
算術演算ユニット
Arithmet
ic and Logic
Unit
CPU
アドレスバス
データバス
メモリ
R/W
命令レジスタ
Instruction
Re
gister
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
レジスタ
Registers
命令フェッチ
アドレスバス
データバス
メモリ
R/W
命令レジスタ
Instruction
Re
gister
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタ
を使用
命令が届く
命令デコード
アドレスバス
データバス
メモリ
R/W
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタが
「次の命令」をポイント
するように書き換わる
制御系は,命令デコード
の結果に従って,
CPU
内の各所に指示を出す
例題.繰り返し
•
次の例を使って,今までの内容を説明
する
=
=
3
1
i
i
s
.data
s:
.dc.l 0
.text
/* %d0 = 1, 2, 3 */
moveq.l #1,%d0
start1:
cmp.l #3,%d0
bhi
brea
k1
add.l %d0,s
addq.l #1,%d0
bra start1
break1:
.dc.w 0x4848
stop #0
繰り返し
繰り返し
データレ
ジスタ
D0
と
「
3
」と
の比
較
「
3
以下」のとき
のみ実行される
部分
ジャンプ
.data
s:
.dc.l 0
.text
/* %d0 =
1, 2,
3 */
moveq.l #1,%d0
start1:
cmp.l #3
,%d0
bhi break1
add.l %d0,s
addq.l #1,%d0
bra star
t1
break1:
.dc.w 0x
4848
stop #0
繰り返し
データレ
ジスタ
D0
と
「
3
」と
の比
較
「
3
以下」のとき
のみ実行される
部分
ジャンプ
3を超えたときは
.data
s:
.dc.l 0
.text
/* %d0 =
1, 2,
3 */
moveq.l #1,%d0
start1:
cmp.l #3
,%d0
bhi break1
add.l %d0,s
addq.l #1,%d0
bra star
t1
break1:
.dc.w 0x
4848
stop #0
繰り返し
②⑦⑫⑰
③⑧⑬⑱
④⑨⑭
⑤⑩⑮
⑥⑪⑯
①
⑲
.data
s:
.dc.l 0
.text
/* %d0 =
1, 2,
3 */
moveq.l #1,%d0
start1:
cmp.l #3
,%d0
bhi break1
add.l %d0,s
addq.l #1,%d0
bra star
t1
break1:
.dc.w 0x
4848
stop #0
最初はここ
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction
Re
gister
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタ
を使用
命令が届く
70 01
(mo
veq.l
#1,%d0)
70 01
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタが
,
次の
「
cmp.l
#3, %d0
」をポイ
ントするように書き換わる
制御系は,命令デコード
の結果に従って,
CPU
内の各所に指示を出す
R/W
70 01
70 01
(mo
veq.l
#1,%d0)
????????
アドレスバス
データバス
制御系
Control
Unit
+
命令長
レジスタ
Registers
R/W
データレジスタ
D0
に
値
00000001
が入る
命令実行では
D0
00000001
00000001
70 01
(mo
veq.l
#1,%d0)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction
Re
gister
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタ
を使用
命令が届く
0c 80 00
00 00 03
(cm
p.l
#3,%
d0)
0c 80 00 00 00
03
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタが
「
bgt break1
」をポイントす
るように書き換わる
制御系は,命令デコード
の結果に従って,
CPU
内の各所に指示を出す
R/W
0c 80 00 00 00 03
0c 80 00
00 00 03
(cm
p.l
#3,%
d0)
算術演算ユニット
Arithmet
ic and Logic
Unit
0
0
0
0
0
0
01
アドレスバス
データバス
制御系
Control
Unit
+
命令長
レジスタ
Registers
R/W
比較結果が,
CCR
(コンディションコード
レジスタ)に入る
「
d0
の値は
3
より小さ
い」という記録が残る
命令実行では
D0
00000003
00000001
0c 80 00
00 00 03
(cm
p.l
#3,%
d0)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction
Re
gister
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタ
を使用
命令が届く
62 00 0
0 0e
(bhi break1)
62 00 00 0e
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタが
,
次の
「
add.l
%d0,s
」をポイ
ント
するように書き換わる
制御系は,命令デコード
の結果に従って,
CPU
内の各所に指示を出す
R/W
62 00 00 0e
62 00 0
0 0e
(bhi break1)
アドレスバス
データバス
制御系
Control
Unit
+
命令長
レジス
タ
Regis
ters
R/W
命令実行では
bgt brea
k1
「
d0
の値が
3
より大き
い」という条件が成り立
たないので,何もしな
い
(CCR
を使用)
無条件分岐命令
bra
•
分岐先:
–
分岐先のラベル
を書く
–
ラベルが,分岐先のメ
モリアドレスであると解
釈される
bra
C
分岐先
無条件分岐命令
例)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction
Re
gister
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタ
を使用
命令が届く
60 00 ff e
c
60
00 ff ec
(bra start
1)
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction
Decoder
制御系
Control
Unit
プログラ
ムカウンタ
Program Counter
+
命令長
プログラムカウンタが
「
.dc.w 0x4848
」をポイント
するように書き換わる
制御系は,命令デコード
の結果に従って,
CPU
内の各所に指示を出す
R/W
60 00 ff e
c
アドレスバス
データバス
制御系
Control
Unit
+
命令長
R/W
命令実行では
プログラ
ムカウンタ
Program Counter
メモリ
プログラムカウンタ
に新しい値が入る
→
分岐
まとめ
•
分岐命令では、プログラムカウンタの書
き
換えが起こる
•
命令は、メモリに格納さ
れ、プログラム
カウ
ンタを使い読みださ
れる