電子計算機工学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 番地から配置されているものとする。
  1. (3000) のデータを (2000), (2001), (2002) に格納する。

  2. (3000), (3001), (3002),(3003) のデータの和を求める。

  3. (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     練習問題

次の命令に含まれるアドレス指定方式を挙げなさい。
  1. LD A, B : レジスタアドレス指定形式

  2. LD A, 10 : 直接数値指定形式

  3. LD A, (1000H) : 拡張アドレス指定形式

  4. LD A, (HL) : レジスタ間接アドレス指定形式

  5. LD HL, 1000H : 拡張直接数値指定形式

  6. LD HL, (1000H) : 拡張アドレス指定形式

  7. LD A, (IX + 10) : インデックスアドレス指定形式

  8. JP NZ, 1000H : 拡張アドレス指定形式

  9. JR NZ, 1000H : 相対アドレス指定形式

  10. NEG : 固有アドレス指定形式




5   命令の種類

5.12.1     練習問題

次の機能を実現する命令を書きなさい。 1 命令で実現できない場合は複数の命令を組み合わせて実現しなさい。
  1. A ← 10 ; LD A, 10

  2. A ← C ; LD A, C

  3. A ← (1000H) ; LD A, (1000H)

  4. A ← (BC) ; LD A, (BC)

  5. A ← (HL) ; LD A, (HL)

  6. A ← (IX + 10) ; LD A, (IX + 10)

  7. C ← 10 ; LD C, 10

  8. C ← A ; LD C, A

  9. C ← (1000H) ; LD HL, 1000H LD C, (HL)

  10. C ← (BC) ; LD A, (BC) LD C, A

  11. C ← (HL) ; LD C, (HL)

  12. C ← (IX + 10) ; LD C, (IX +10)

  13. (2000H) ← 10 ; LD A, 10 LD (2000H), A

  14. (2000H) ← C ; LD A, C LD (2000H), A

  15. (2000H) ← (1000H) ; LD A, (1000H) LD (2000H), A

  16. (2000H) ← (BC) ; LD A, (BC) LD (2000H), A

  17. (2000H) ← (HL) ; LD A, (HL) LD (2000H), A

  18. (2000H) ← (IX + 10) ; LD A, (IX + 10) LD (2000H), A

  19. (BC) ← 10 ; LD A, 10 LD (BC), A

  20. (BC) ← C ; LD A, C LD (BC), A

  21. (BC) ← (1000H) ; LD A, (1000H) LD (BC), A

  22. (BC) ← (DE) ; LD A, (DE) LD (BC), A

  23. (BC) ← (HL) ; LD A, (HL) LD (BC), A

  24. (BC) ← (IX + 10) ; LD A, (IX + 10) LD (BC), A

  25. (HL) ← 10 ; LD (HL), 10

  26. (HL) ← C ; LD (HL), C

  27. (HL) ← (1000H) ; LD A, (1000H) LD (HL), A

  28. (HL) ← (DE) ; LD A, (DE) LD (HL), A

  29. (HL) ← (IX + 10) ; LD A, (IX +10) LD (HL), A

  30. BC ← 1000H ; LD BC, 1000H

  31. BC ← DE ; LD B, D LD C, E

  32. BC ← (1000H),(1001H) ; LD BC, (1000H)

  33. (2000H) ← 1000H ; LD BC, 1000H LD (2000H), BC

  34. (2000H) ← DE ; LD (2000H), DE

  35. (2000H) ← (1000H),(1001H) ; LD BC, (1000H) LD (2000H), BC

  36. A ← B + C ; LD A, B ADD A, C

  37. A ← B - C - CY ; LD A, B SBC A, C

  38. A ← A AND 3 ; AND 3

  39. A ← A XOR 1 ; XOR 1

  40. B ← B - 1 ; DEC B

  41. A ← A の 0/1 反転 ; CPL

  42. A ← A の 2 の補数 ; NEG

  43. HL ← BC + DE ; LD H, B LD L, C ADD HL, DE

  44. A を右に算術シフト ; SRA A

  45. A を右に論理シフト ; SRL A

  46. A を左に算術シフト ; SLA A

  47. 1000H にジャンプ ; JP 1000H

  48. Z なら 1000H にジャンプ ; JP Z, 1000H

  49. NC なら 1000H にジャンプ ; JP NC, 1000H

  50. 1000H に相対ジャンプ ; JR (特定できず)


5.12.2     練習問題

A レジスタが 11010010B, CY フラグが 1 のとき、次の操作を行なった後の A, CY の値を示しなさい。
  1. RLA ; 10100101 1

  2. RRCA ; 01101001 0

  3. SRA A ; 11101001 0

  4. SLA A ; 10100100 1

  5. SRL A ; 01101001 0




6   フラグと算術演算

6.5     練習問題

次の条件判断を実現する命令列を示しなさい。条件に合わなければ L2 にジャンプするようにしなさい。
  1. A と B を比較して A < B なら L1 にジャンプする。

  2. A と B を比較して A <= B なら L1 にジャンプする。

  3. A と B を比較して A == B なら L1 にジャンプする。

  4. A と B を比較して A != B なら L1 にジャンプする。

  5. A と B を比較して B < A なら L1 にジャンプする。

  6. A と B を比較して B <= A なら L1 にジャンプする。

  7. 符号付数として A + B を計算した時、あふれがあれば L1 にジャンプする。

  8. 符号無数として A + B を計算した時、あふれがあれば L1 にジャンプする。

  9. A の上位 6 桁の 1 の個数が奇数なら L1 にジャンプする。

  10. 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 のアセンブリ言語で作成しなさい。 (????) はメモリの ???? 番地のデータを表す。== は値が等しいこと、 != は等しくないことを表す。
  1. A + B + C - D を (DATA1) に入れる

  2. (DATA1) + 100 を (DATA2) に入れる

  3. (DATA1) + (DATA2), (DATA1) - (DATA2) を (DATA3), (DATA4) に入れる

  4. (DATA1) * 3 を (DATA2) に入れる

  5. (DATA1) * 5 を (DATA2) に入れる (シフト命令を使うこと)

  6. (DATA1), (DATA2) の小さい方を (DATA3) に入れる

  7. (DATA1), (DATA2), (DATA3) の最小の値を (DATA4) に入れる

  8. (DATA1) == (DATA2) なら 0 を、(DATA1) != (DATA2) なら 0 以外を (DATA3) に入れる

  9. (DATA1) == 3 なら +1 して、(DATA1) != 3 なら -1 して (DATA2) に入れる

  10. (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