電子計算機工学I 練習問題の答
NAGASAKA Yasunori
2003/01/15
|
http://edu.isc.chubu.ac.jp/naga/index.html で公開中
1 はじめに
2 Z80アーキテクチャ
3 インタフェース信号とタイミング
4 アドレス方式
5 命令の種類
6 フラグと算術演算
7 Z80 用アセンブリ言語
1 はじめに
練習問題はありません。
2 Z80アーキテクチャ
2.2.3
練習問題
各レジスタの初期値が A=0, B=1, C=2, D=3, E= 4, F=5 となっている状態で、次のスタック
操作を行なった後に各レジスタの値がどうなるか答えなさい。
(1) PUSH AF
PUSH BC
PUSH DE
POP AF
POP BC
POP DE の一連の操作を ★ とする。★ を 2 回繰り返す。
(2) ★ を 3 回繰り返す。
(3) PUSH AF (4) PUSH AF
PUSH BC PUSH BC
PUSH DE POP DE
PUSH AF POP BC
POP DE POP AF
POP BC
POP AF
(1) A = 0, B = 1, C = 2, D = 3, E = 4, F = 5
(2) A = 3, B = 1, C = 2, D = 0, E = 5, F = 4
(3) A = 1, B = 3, C = 4, D = 0, E = 5, F = 2
(4) A = ?, B = 0, C = 5, D = 1, E = 2, F = ?
2.3.2
練習問題
次のプログラムを実行する時の、プログラムとデータのメモリ上の配置、実行
中のデータの流れを上記の例と同じ形式で示しなさい。プログラムはいずれも
1000 番地から配置されているものとする。
- (3000) のデータを (2000), (2001), (2002) に格納する。
- (3000), (3001), (3002),(3003) のデータの和を求める。
- (3000) のデータと (2000) のデータを交換する。
1. (3000) のデータを (2000), (2001), (2002) に格納する
LD A, (3000)
LD (2000), A
LD (2001), A
LD (2002), A
HALT
メモリイメージ
番地 |
内容 |
1000 |
次の番地の内容を A に |
1001 |
00 |
1002 |
30 |
1003 |
A の内容を次の番地に |
1004 |
00 |
1005 |
20 |
1006 |
A の内容を次の番地に |
1007 |
01 |
1008 |
20 |
1009 |
A の内容を次の番地に |
100A |
02 |
100B |
20 |
100C |
終了 |
|
|
2000 |
データ |
2001 |
データ |
2002 |
データ |
|
|
3000 |
データ |
1000 → AB
IR ← DB
解読すると 3 バイト命令なので残り 2 バイトを読む
1001 → AB
バッファ ← DB (00)
1002 → AB
バッファ ← DB (30)
3000 → AB ; LD A, (3000)
A ← DB
1003 → AB
IR ← DB
同様に (1004), (1005) から 00, 20 を読む
2000 → AB ; LD (2000), A
A → DB
1006 → AB
IR ← DB
同様に (1007), (1008) から 01, 20 を読む
2001 → AB ; LD (2001), A
A → DB
1009 → AB
IR ← DB
同様に (100A), (100B) から 02, 20 を読む
2002 → AB ; LD (2002), A
A → DB
100C → AB
IR ← DB
終了 ; HALT
2. (3000), (3001), (3002), (3003) のデータの和を求める
LD A, (3000)
LD B, A
LD A, (3001)
LD C, A
LD A, (3002)
LD D, A
LD A, (3003)
ADD A, B
ADD A, C
ADD A, D
HALT
(別解) 下記のようなプログラムも可
LD A, (3000)
LD B, A
LD A, (3001)
ADD A, B
LD B, A
LD A, (3002)
ADD A, B
LD B, A
LD A, (3003)
ADD A, B
HALT
メモリイメージ
番地 |
内容 |
1000 |
次の番地の内容を A に |
1001 |
00 |
1002 |
30 |
1003 |
B ← A |
1004 |
次の番地の内容を A に |
1005 |
01 |
1006 |
30 |
1007 |
C ← A |
1008 |
次の番地の内容を A に |
1009 |
02 |
100A |
30 |
100B |
D ← A |
100C |
次の番地の内容を A に |
100D |
03 |
100E |
30 |
100F |
A ← A + B |
1010 |
A ← A + C |
1011 |
A ← A + D |
1012 |
終了 |
|
|
3000 |
データ |
3001 |
データ |
3002 |
データ |
3003 |
データ |
1000 → AB
IR ← DB
解読すると 3 バイト命令なので残り 2 バイトを読む
1001 → AB
バッファ ← DB (00)
1002 → AB
バッファ ← DB (30)
3000 → AB ; LD A, (3000)
A ← DB
1003 → AB
IR ← DB
B ← A ; LD B, A
1004 → AB
IR ← DB
同様に (1005), (1006) から 01, 30 を読む
3001 → AB ; LD A, (3001)
A ← DB
1007 → AB
IR ← DB
C ← A ; LD C, A
1008 → AB
IR ← DB
同様に (1009), (100A) から 02, 30 を読む
3002 → AB ; LD A, (3002)
A ← DB
100B → AB
IR ← DB
D ← A ; LD D, A
100C → AB
IR ← DB
同様に (100D), (100E) から 03, 30 を読む
3003 → AB ; LD A, (3003)
A ← DB
100F → AB
IR ← DB
A ← A + B ; ADD A, B
1010 → AB
IR ← DB
A ← A + C ; ADD A, C
1011 → AB
IR ← DB
A ← A + D ; ADD A, D
1012 → AB
IR ← DB
終了 ; HALT
3. (3000) のデータと (2000) のデータを交換する
LD A, (3000)
LD B, A
LD A, (2000)
LD (3000), A
LD A, B
LD (2000), A
HALT
メモリイメージ
番地 |
内容 |
1000 |
次の番地の内容を A に |
1001 |
00 |
1002 |
30 |
1003 |
B ← A |
1004 |
次の番地の内容を A に |
1005 |
00 |
1006 |
20 |
1007 |
A の内容を次の番地に |
1008 |
00 |
1009 |
30 |
100A |
A ← B |
100B |
A の内容を次の番地に |
100C |
00 |
100D |
20 |
100E |
終了 |
|
|
2000 |
データ |
|
|
3000 |
データ |
1000 → AB
IR ← DB
解読すると 3 バイト命令なので残り 2 バイトを読む
1001 → AB
バッファ ← DB (00)
1002 → AB
バッファ ← DB (30)
3000 → AB ; LD A, (3000)
A ← DB
1003 → AB
IR ← DB
B ← A ; LD B, A
1004 → AB
IR ← DB
同様に (1005), (1006) から 00, 20 を読む
2000 → AB ; LD A, (2000)
A ← DB
1007 → AB
IR ← DB
同様に (1008), (1009) から 00, 30 を読む
3000 → AB ; LD (3000), A
A → DB
100A → AB
IR ← DB
A ← B ; LD A, B
100B → AB
IR ← DB
同様に (100C), (100D) から 00, 20 を読む
2000 → AB ; LD (2000), A
A → DB
100C → AB
IR ← DB
終了 ; HALT
3 インタフェース信号とタイミング
練習問題はありません。
4 アドレス方式
4.11
練習問題
次の命令に含まれるアドレス指定方式を挙げなさい。
- LD A, B : レジスタアドレス指定形式
- LD A, 10 : 直接数値指定形式
- LD A, (1000H) : 拡張アドレス指定形式
- LD A, (HL) : レジスタ間接アドレス指定形式
- LD HL, 1000H : 拡張直接数値指定形式
- LD HL, (1000H) : 拡張アドレス指定形式
- LD A, (IX + 10) : インデックスアドレス指定形式
- JP NZ, 1000H : 拡張アドレス指定形式
- JR NZ, 1000H : 相対アドレス指定形式
- NEG : 固有アドレス指定形式
5 命令の種類
5.12.1
練習問題
次の機能を実現する命令を書きなさい。
1 命令で実現できない場合は複数の命令を組み合わせて実現しなさい。
- A ← 10 ; LD A, 10
- A ← C ; LD A, C
- A ← (1000H) ; LD A, (1000H)
- A ← (BC) ; LD A, (BC)
- A ← (HL) ; LD A, (HL)
- A ← (IX + 10) ; LD A, (IX + 10)
- C ← 10 ; LD C, 10
- C ← A ; LD C, A
- C ← (1000H) ; LD HL, 1000H LD C, (HL)
- C ← (BC) ; LD A, (BC) LD C, A
- C ← (HL) ; LD C, (HL)
- C ← (IX + 10) ; LD C, (IX +10)
- (2000H) ← 10 ; LD A, 10 LD (2000H), A
- (2000H) ← C ; LD A, C LD (2000H), A
- (2000H) ← (1000H) ; LD A, (1000H) LD (2000H), A
- (2000H) ← (BC) ; LD A, (BC) LD (2000H), A
- (2000H) ← (HL) ; LD A, (HL) LD (2000H), A
- (2000H) ← (IX + 10) ; LD A, (IX + 10) LD (2000H), A
- (BC) ← 10 ; LD A, 10 LD (BC), A
- (BC) ← C ; LD A, C LD (BC), A
- (BC) ← (1000H) ; LD A, (1000H) LD (BC), A
- (BC) ← (DE) ; LD A, (DE) LD (BC), A
- (BC) ← (HL) ; LD A, (HL) LD (BC), A
- (BC) ← (IX + 10) ; LD A, (IX + 10) LD (BC), A
- (HL) ← 10 ; LD (HL), 10
- (HL) ← C ; LD (HL), C
- (HL) ← (1000H) ; LD A, (1000H) LD (HL), A
- (HL) ← (DE) ; LD A, (DE) LD (HL), A
- (HL) ← (IX + 10) ; LD A, (IX +10) LD (HL), A
- BC ← 1000H ; LD BC, 1000H
- BC ← DE ; LD B, D LD C, E
- BC ← (1000H),(1001H) ; LD BC, (1000H)
- (2000H) ← 1000H ; LD BC, 1000H LD (2000H), BC
- (2000H) ← DE ; LD (2000H), DE
- (2000H) ← (1000H),(1001H) ; LD BC, (1000H) LD (2000H), BC
- A ← B + C ; LD A, B ADD A, C
- A ← B - C - CY ; LD A, B SBC A, C
- A ← A AND 3 ; AND 3
- A ← A XOR 1 ; XOR 1
- B ← B - 1 ; DEC B
- A ← A の 0/1 反転 ; CPL
- A ← A の 2 の補数 ; NEG
- HL ← BC + DE ; LD H, B LD L, C ADD HL, DE
- A を右に算術シフト ; SRA A
- A を右に論理シフト ; SRL A
- A を左に算術シフト ; SLA A
- 1000H にジャンプ ; JP 1000H
- Z なら 1000H にジャンプ ; JP Z, 1000H
- NC なら 1000H にジャンプ ; JP NC, 1000H
- 1000H に相対ジャンプ ; JR (特定できず)
5.12.2
練習問題
A レジスタが 11010010B, CY フラグが 1 のとき、次の操作を行なった後の
A, CY の値を示しなさい。
- RLA ; 10100101 1
- RRCA ; 01101001 0
- SRA A ; 11101001 0
- SLA A ; 10100100 1
- SRL A ; 01101001 0
6 フラグと算術演算
6.5
練習問題
次の条件判断を実現する命令列を示しなさい。条件に合わなければ L2
にジャンプするようにしなさい。
- A と B を比較して A < B なら L1 にジャンプする。
- A と B を比較して A <= B なら L1 にジャンプする。
- A と B を比較して A == B なら L1 にジャンプする。
- A と B を比較して A != B なら L1 にジャンプする。
- A と B を比較して B < A なら L1 にジャンプする。
- A と B を比較して B <= A なら L1 にジャンプする。
- 符号付数として A + B を計算した時、あふれがあれば L1 にジャンプする。
- 符号無数として A + B を計算した時、あふれがあれば L1 にジャンプする。
- A の上位 6 桁の 1 の個数が奇数なら L1 にジャンプする。
- A を 1 ビット左にシフトした時、はみ出したビットが 1 なら L1 にジャンプする。
(1) CP B
JP C, L1 ; JP M, L1 も可
JP L2
(2) CP B
JP C, L1 ; JP M, L1 も可
JP Z, L1
JP L2
(3) CP B
JP Z, L1
JP L2
(4) CP B
JP NZ, L1
JP L2
(5) CP B
JP Z, L2
JP NC, L1 ; JP P, L1 も可
JP L2
(6) CP B
JP NC, L1 ; JP P, L1 も可
JP L2
(7) ADD A, B
JP PE, L1
JP L2
(8) ADD A, B
JP C, L1
JP L2
(9) AND 0FCH
JP PO, L1
JP L2
(10) SLA A
JP C, L1
JP L2
7 Z80 用アセンブリ言語
7.10
練習問題
次の機能を実現するプログラムを Z80CPU のアセンブリ言語で作成しなさい。
(????) はメモリの ???? 番地のデータを表す。== は値が等しいこと、
!= は等しくないことを表す。
- A + B + C - D を (DATA1) に入れる
- (DATA1) + 100 を (DATA2) に入れる
- (DATA1) + (DATA2), (DATA1) - (DATA2) を (DATA3), (DATA4) に入れる
- (DATA1) * 3 を (DATA2) に入れる
- (DATA1) * 5 を (DATA2) に入れる (シフト命令を使うこと)
- (DATA1), (DATA2) の小さい方を (DATA3) に入れる
- (DATA1), (DATA2), (DATA3) の最小の値を (DATA4) に入れる
- (DATA1) == (DATA2) なら 0 を、(DATA1) != (DATA2) なら 0 以外を (DATA3) に入れる
- (DATA1) == 3 なら +1 して、(DATA1) != 3 なら -1 して (DATA2) に入れる
- (DATA1) が奇数なら 1 を、偶数なら 0 を (DATA2) に入れる
(1) A + B + C - D を (DATA1) に入れる
ORG 1000H ; 1000H 番地からスタート
START ADD A, B
ADD A, C
SUB D
LD (DATA1), A ; 答の記録
HALT
DATA1 DEFS 1 : 答を入れる場所
END
(2) (DATA1) + 100 を (DATA2) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
ADD A, 100
LD (DATA2), A ; 答の記録
HALT
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
(3) (DATA1) + (DATA2), (DATA1) - (DATA2) を (DATA3), (DATA4) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA2)
LD B, A ; B に (DATA2) をセット
LD A, (DATA1) ; A に (DATA1) をセット
ADD A, B
LD (DATA3), A ; 答の記録
LD A, (DATA1) ; A に (DATA1) をセット
SUB B
LD (DATA4), A ; 答の記録
HALT
DATA1 DEFB 3 : もとのデータ
DATA2 DEFB 10 : もとのデータ
DATA3 DEFS 1 : 答を入れる場所
DATA4 DEFS 1 ; 答を入れる場所
END
(4) (DATA1) * 3 を (DATA2) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
LD B, A ; 後で使うので B にも入れておく
SLA A ; 2 倍, ADD A, B でも可
ADD A, B
LD (DATA2), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
(5) (DATA1) * 5 を (DATA2) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
LD B, A ; 後で使うので B にも入れておく
SLA A ; 2 倍
SLA A ; 2 倍
ADD A, B
LD (DATA2), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
(6) (DATA1), (DATA2) の小さい方を (DATA3) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA2)
LD B, A ; B に (DATA2) をセット
LD A, (DATA1) ; A に (DATA1) をセット
CP B ; A, B の比較
JP C, L1 ; A < B なら L1 へ, JP M, L1 も可
LD A, B : B <= A なら A ← B
L1 LD (DATA3), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFB 5 :
DATA3 DEFS 1 ; 答を入れる場所
END
(7) (DATA1), (DATA2), (DATA3) の最小の値を (DATA4) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA2) ;
LD B, A ; B に (DATA2) をセット
LD A, (DATA3) ;
LD C, A ; C に (DATA3) をセット
LD A, (DATA1) ; A に (DATA1) をセット
CP B ; A, B の比較
JP C, L1 ; A < B なら L1 へ, JP M, L1 も可
LD A, B : B <= A なら A ← B
L1 CP C ; A, C の比較
JP C, L2 ; A < C なら L2 へ, JP M, L2 も可
LD A, C : C <= A なら A ← C
L2 LD (DATA3), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFB 5 :
DATA3 DEFB 7 :
DATA4 DEFS 1 ; 答を入れる場所
END
(8) (DATA1) == (DATA2) なら 0 を、(DATA1) != (DATA2) なら 0 以外を
(DATA3) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA2) ;
LD B, A ; B に (DATA2) をセット
LD A, (DATA1) ; A に (DATA1) をセット
CP B ; A, B の比較
JP Z, L1 ; A == B なら L1 へ
LD A, 1 : A != B なら A ← 1
JP L2
L1 LD A, 0 ; A == B なら A ← 0
L2 LD (DATA3), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFB 5 :
DATA4 DEFS 1 ; 答を入れる場所
END
(別解)
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA2) ;
LD B, A ; B に (DATA2) をセット
LD A, (DATA1) ; A に (DATA1) をセット
SUB B ; A - B
LD (DATA3), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFB 5 :
DATA3 DEFS 1 ; 答を入れる場所
END
(9) (DATA1) == 3 なら +1 して、(DATA1) != 3 なら -1 して (DATA2) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
CP 3 ; 3 との比較
JP Z, L1 ; A == 3 なら L1 へ
DEC A : A != B なら A ← A - 1
JP L2
L1 INC A ; A == B なら A ← A + 1
L2 LD (DATA2), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
(10) (DATA1) が奇数なら 1 を、偶数なら 0 を (DATA2) に入れる
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
AND 1 ; 00000001B と論理積を求める
LD (DATA2), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
(別解)
ORG 1000H ; 1000H 番地からスタート
START LD A, (DATA1) ; A に (DATA1) をセット
RR A ; 右ローテート、CY ← 最下位ビット
LD A, 0 ; A を 0 にする
RL A ; 左ローテート、最下位ビット ← CY
LD (DATA2), A ; 答の記録
HALT ; ストップ
DATA1 DEFB 3 : もとのデータ
DATA2 DEFS 1 ; 答を入れる場所
END
プログラムの例「(DATA1) と (DATA2) の大きい方を RESULT に記録する」
をハンドアセンブルして機械語のプログラムを示しなさい。
ORG 1000H
(1) (2) (3)
START LD A, (DATA1) ; 3 1000 3A 10 10
LD B, A ; 1 1003 47
LD A, (DATA2) ; 3 1004 3A 11 10
CP B ; 1 1007 B8
JP NC, L1 ; 3 1008 D2 0C 10
LD A, B : 1 100B 78
L1 LD (RESULT), A ; 3 100C 32 12 10
HALT ; 1 100F 76
DATA1 DEFB 3 : 1 1010 03
DATA2 DEFB 5 : 1 1011 05
RESULT DEFS 1 ; 1 1012 ??
END