as-3. プログラムカウンタと
命令実行サイクル
1
金子邦彦
68000 アセンブラ)
URL: https://www.kkaneko.jp/cc/as/index.html
アセンブラ
プログラム
ファイル
テキストエディタなど
で記述. add.s など
アセンブラ
m68k-as など
HEX
ファイル
自動生成. add.abs など
これは
ファイル
メモリのどこに何を
置くかを書いたファイル
メモリの中身
メモリにロード
HEX ファイルの
S0 06 0000484452 1B
S2 14 000000 303900000018D0790000001A33C00000 14
S2 0C 000010 001C40484E720000 7F
S2 0A 000018 000A00140000 BF
S5 03 0003 F9
S8 04 000000 FB
ステータスレコード(ファイル名など)
データレコード
データレコード: メモリにロードされるべき中身
その他のレコード: 管理情報
データレコード数
終了を示す
S0 06 0000484452 1B
S2 14 000000 303900000018D0790000001A33C00000 14
S2 0C 000010 001C40484E720000 7F
S2 0A 000018 000A00140000 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 0000484452 1B
S2 14 000000 303900000018D0790000001A33C00000 14
S2 0C 000010 001C40484E720000 7F
S2 0A 000018 000A00140000 BF
S5 03 0003 F9
S8 04 000000 FB
x 0x000018
y 0x00001a
z 0x00001c
1. 加算を行え
2. 使用するレジスタは D0
3. 処理はワード単位
メモリアドレス 0x0000001A
を扱う
メモリ書き込み (z )
データレジスタ d0 の中身
を書き込む
S0 06 0000484452 1B
S2 14 000000 303900000018D0790000001A33C00000 14
S2 0C 000010 001C40484E720000 7F
S2 0A 000018 000A00140000 BF
S5 03 0003 F9
S8 04 000000 FB
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
registers)
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
counter)
15 8 7 0
ステータス
レジスタ
(status
register)
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. 命令実行
命令デコードの結果に従って,必要となるデータにアクセス
演算装置に供給し,結果を適当な場所に格納する
算術演算ユニット
Arithmetic and Logic Unit
CPU
アドレスバス
データバス
メモリ
R/W
命令レジスタ
Instruction Register
命令デコーダ
Instruction Decoder
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
レジスタ
Registers
命令フェッチ
アドレスバス
データバス
メモリ
R/W
命令レジスタ
Instruction Register
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタ
を使用
命令が届く
命令デコード
アドレスバス
データバス
メモリ
R/W
命令デコーダ
Instruction Decoder
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタが
「次の命令」をポイント
するように書き換わる
制御系は,命令デコード
の結果に従って,CPU
内の各所に指示を出す
例題.繰り返し
次の例を使って,今までの内容を説明する
=
=
3
1i
is
.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 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 start1
break1:
.dc.w 0x4848
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 start1
break1:
.dc.w 0x4848
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 start1
break1:
.dc.w 0x4848
stop #0
最初はここ
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction Register
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタ
を使用
命令が届く
70 01
(moveq.l #1,%d0)
70 01
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction Decoder
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタが, 次の
cmp.l #3, %d0」をポイ
ントするように書き換わる
制御系は,命令デコード
の結果に従って,CPU
内の各所に指示を出す
R/W
70 01
70 01
(moveq.l #1,%d0)
????????
アドレスバス
データバス
制御系
Control Unit
+命令長
レジスタ
Registers
R/W
データレジスタ D0
00000001 が入る
命令実行では
D0
00000001
00000001
70 01
(moveq.l #1,%d0)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction Register
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタ
を使用
命令が届く
0c 80 00 00 00 03
(cmp.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
(cmp.l #3,%d0)
算術演算ユニット
Arithmetic and Logic Unit
00000001
アドレスバス
データバス
制御系
Control Unit
+命令長
レジスタ
Registers
R/W
比較結果が,CCR
(コンディションコード
レジスタ)に入る
d0 の値は 3 より小さ
い」という記録が残る
命令実行では
D0
00000003
00000001
0c 80 00 00 00 03
(cmp.l #3,%d0)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction Register
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタ
を使用
命令が届く
62 00 00 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 00 0e
(bhi break1)
アドレスバス
データバス
制御系
Control Unit
+命令長
レジス
Registers
R/W
命令実行では
bgt break1
d0 の値が 3 より大き
い」という条件が成り立
たないので,何もしな
(CCR を使用)
無条件分岐命令 bra
分岐先:
分岐先のラベルを書く
ラベルが,分岐先のメモリアドレスであると解
釈される
bra C
分岐先
無条件分岐命令
例)
命令フェッチでは
アドレスバス
データバス
R/W
命令レジスタ
Instruction Register
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタ
を使用
命令が届く
60 00 ff ec
60 00 ff ec
(bra start1)
命令デコードでは
アドレスバス
データバス
命令デコーダ
Instruction Decoder
制御系
Control Unit
プログラムカウンタ
Program Counter
+命令長
プログラムカウンタが
.dc.w 0x4848」をポイント
するように書き換わる
制御系は,命令デコード
の結果に従って,CPU
内の各所に指示を出す
R/W
60 00 ff ec
アドレスバス
データバス
制御系
Control Unit
+命令長
R/W
命令実行では
プログラムカウンタ
Program Counter
メモリ
プログラムカウンタ
に新しい値が入る
分岐
まとめ
分岐命令では、プログラムカウンタの書
換えが起こる
命令は、メモリに格納され、プログラムカウ
ンタを使い読みだされる