第4章 基本的なアセンブリ言語プログラミング -...
TRANSCRIPT
3E マイクロコンピュータプリント 2017(第4章)
4-1
第4章 基本的なアセンブリ言語プログラミング
1.アセンブリ言語プログラム
(1)プログラムの例
アドレス 機械語 ラベル ニ-モニック コメント
.INCLUDE sfr_r829.inc ;擬似命令
.SECTION PROGRAM, CODE ;擬似命令
0D000 .ORG 0D000H ;擬似命令
0D000 Start:
0D000 C706FE00 MOV.B #00000110b, p1_drr
0D004 C706E100 MOV.B #00000110b, p1
0D008 C706E300 MOV.B #00000110b, pd1
0D00C 7E8F0907 BCLR p1_1
0D010 7E8F0A07 BCLR p1_2
0D014 Loop: ;永久ループで
0D014 FEFF JMP Loop ;実行停止
.SECTION FIXVECTOR, ROMDATA ;擬似命令
0FFFC .ORG 0FFFCH ;擬似命令
0FFFC Reset:
0FFFC 00D0F00F .LWORD Start | 0FF00000h ;擬似命令
.END ;擬似命令
(2)プログラムの構成とアセンブル
授業で作るプログラムの部分
PC
エミュレータ
または書込み回路
マイコン
(「ターゲット」とも呼ぶ)
アセンブリ言語で記述されたソースプログラム
オブジェクトプログラム
アセンブリ言語で記述された
ソースプログラムをアセンブ
ラでアセンブルをしてオブジ
ェクトプログラム(機械語)に
変換する
エミュレータ:プログラムを PCから MPU
に書き込みができ,さらにプログラム実
行途中でメモリやレジスタの値を監視
したり,プログラムの実行を一時停止し
たりしながらデバッグ作業などをする
ための装置
3E マイクロコンピュータプリント 2017(第4章)
4-2
1)ソースプログラム(ソースコード)
プログラミング言語 で記述したプログラムのことで,機械語に 変換する前の
のプログラム
2)オブジェクトプログラム(オブジェクトコード)
ソースプログラムを アセンブル や コンパイル をして得られた 機械語 のプ
ログラム
3)オペコード
アセンブリ言語命令において 命令の動作 を表す部分
4)オペランド
アセンブリ言語命令において 動作の対象 となる部分
5)ニーモニック
オペコード と オペランド を用いて表したアセンブリ言語命令
6)ラベル
アセンブリ言語プログラム中において アドレス を数値で指定する代わりに用いる
文字記号名。ラベル名はプログラマによって自由(アルファベット,数字,記号を用い
る)に作成できる。ただし先頭文字はアルファベット。分岐命令やデータ転送命令など
でアドレスを指定するときに用いる。
7)アセンブル
アセンブリ言語プログラムを 機械語 に変換する作業
8)アセンブラ
アセンブリ言語プログラムを機械語に変換する ソフトウェア
9)擬似命令
アセンブリ言語プログラムを,どのように機械語に変換するのかを, アセンブラ に
対して指示する命令で,直接,機械語には 変換されない 命令。CPU への命令ではない。
3E マイクロコンピュータプリント 2017(第4章)
4-3
(3)メモリへのプログラムの入り方
プログラムメモリ
アドレス 命令
0D000h C7
0D001h 06
0D002h FE
0D003h 00
0D004h C7
0D005h 06
0D006h E1
0D007h 00
0D008h C7
0D009h 06
0D00Ah E3
0D00Bh 00
0D00Ch 7E
0D00Dh 8F
・・・
以降,同様にしてメモリに入っていく
MOV.B #00000110b, p1_drr
MOV.B #00000110b, p1
MOV.B #00000110b, pd1
3E マイクロコンピュータプリント 2017(第4章)
4-4
2.アセンブリ言語プログラミングの基礎
次に示す基本的な命令について学び,アセンブリ言語プログラミングの基礎を学ぶ。
■転送命令(MOV命令):データをある場所(レジスタやメモリ)からある場所(レジス
タやメモリ)へ転送する命令。命令中の書いた数値をレジスタやメモリに格納すること
もできる。転送元のデータをソース,転送先のデータをディスティネーションと呼ぶ。
基本形 MOV.B ソース, ディスティネーション
MOV.W ソース, ディスティネーション
ソースとディスティネーションの組合せ例(下図)
■キャリーなし加算命令(ADD命令):キャリーを加えない加算。(キャリーとは桁上げ
のこと)
基本形 ADD.B ソース, ディスティネーション
ADD.W ソース, ディスティネーション
ソースとディスティネーションの組合せ例
レジスタ
R0(R0H,R0L)
R1(R1H,R1L)
R2
R3
A0
A1
など
データ
プログラム
CPU メモリ
CPU
MOV.B 8bitレジスタ,8bitレジスタ
MOV.W 16bitレジスタ,16bitレジスタ
MOV.B 8bitレジスタ, アドレス
MOV.W 16bitレジスタ, アドレス
MOV.B アドレス,8bitレジスタ
MOV.W アドレス,16bitレジスタ
MOV.B #IMM,8bitレジスタ
MOV.W #IMM,16bitレジスタ
ADD.B 8bitレジスタ, 8bitレジスタ
ADD.W 16bitレジスタ, 16bitレジスタ
など
ADD.B 8bitレジスタ, アドレス
ADD.W 16bitレジスタ, アドレス
ADD.B #IMM, 8bitレジスタ
ADD.W #IMM, 16bitレジスタ
ラベルが用いられる
※上図は MOV 命令のソースとディスティネーションの組合せ
の一部である。図に示してない組合せも存在する。
数値(命令上に埋め込められる)
3E マイクロコンピュータプリント 2017(第4章)
4-5
■ボローなし減算命令(SUB命令):ボローを引かない減算。(ボローとは借りのこと)
基本形 SUB.B ソース,ディスティネーション
SUB.W ソース,ディスティネーション
ソースとディスティネーションの組合せ例
■無条件分岐命令(JMP命令):指定したアドレスに強制的にジャンプする。
基本形 JMP アドレス
★復習★ レジスタについて
16bit 8bit 8bit
R0
R1
R2
R3
A0
A1
FB
データレジスタ:R0,R1,R2,R3
アドレスレジスタ:A0,A1
フレームベースレジスタ:FB(授業では扱わない)
SUB.B 8bitレジスタ,8bitレジスタ
SUB.W 16bitレジスタ,16bitレジスタ
など
SUB.B 8bitレジスタ,アドレス
SUB.W 16bitレジスタ,アドレス
SUB.B #IMM,8bitレジスタ
SUB.W #IMM,16bitレジスタ
R0H R0L
R1H R1L
R2R0
32bit
R3R1
A1A0
3E マイクロコンピュータプリント 2017(第4章)
4-6
例題1 数値のレジスタへの転送,レジスタ同士の加算と減算,無条件分岐
(1)【8bit データの場合】R0L に 100,R0H に 15,R1L に 61,R1H に 20 を格納してから,
R0L+R1L+R0H-R1Hを計算して R0Lに求めなさい
.ORG 0D000h ;① プログラムを格納する先頭アドレスを 0D000hとする
MOV.B #100,R0L (1) ;② R0L ← 100
MOV.B #15,R0H (1) ;③ R0H ← 15
MOV.B #61,R1L (1) ;④ R1L ← 61
MOV.B #20,R1H (1) ;⑤ R1H ← 20
ADD.B R1L,R0L (2) ;⑥ R0L ← R0L + R1L
ADD.B R0H,R0L (2) ;⑦ R0L ← R0L + R0H
SUB.B R1H,R0L (3) ;⑧ R0L ← R0L – R1H
Stop:
JMP Stop (4) ;⑨ 実行停止
(2)【16bitデータの場合】R0に 10240,R1に 4566,R2に 12300を格納してから,R0-R1+R2
を計算して R0に求めなさい
.ORG 0D000h ;①プログラムを格納する先頭アドレスを 0D000hとする
MOV.W #10240,R0 (1) ;② R0 ← 10240
MOV.W #4566,R1 (1) ;③ R1 ← 4566
MOV.W #12300,R2 (1) ;④ R2 ← 12300
SUB.W R1,R0 (3) ;⑤ R0 ← R0 - R1
ADD.W R2,R0 (2) ;⑥ R0 ← R0 + R2
Stop:
JMP Stop ;⑦ 実行停止
3E マイクロコンピュータプリント 2017(第4章)
4-7
解説1
(1)数値をレジスタに転送する(転送命令)
【8bitデータの場合】
MOV.B #IMM, 8bitレジスタ
オペレーション(動作)
#IMM → 8bitレジスタ(数値#IMMを 8bitレジスタに転送する)
例
1)MOV.B #5,R0L
2)MOV.B #0Ah,R0L
3)MOV.B #01110001b,R0L
※数値の書き方について他の命令も同じ形式(”#”を先頭につける)で書く
※数値を「即値」とか「イミディエートデータ」などと呼ぶ
【16bitデータの場合】
MOV.W #IMM, 16bitレジスタ
オペレーション(動作)
#IMM → 16bitレジスタ(数値#IMMを 16bitレジスタに転送する)
例
1)MOV.W #10000,R0
2)MOV.W #0FFFFh,A1
3)MOV.W #1100001001110001b,R1
R0L,R0H,R1L,R1H
数値(”#”を先頭につける) 2進数は数値の右に”b”を,16進数は数値の右に”h”を,10進数は数値の右に何もつけない
8bitデータを扱うので“B”を指定
R0,R1,R2,R3,A0,A1
数値(”#”を先頭につける) 2進数は数値の右に”b”を,16進数は数値の右に”h”を,10進数は数値の右に何もつけない
16bitデータを扱うので“W”を指定
3E マイクロコンピュータプリント 2017(第4章)
4-8
(2)レジスタ同士を加算する(キャリーなし加算命令)
【8bitデータの場合】
ADD.B 8bitレジスタ①, 8bitレジスタ②
オペレーション(動作)
8bitレジスタ② ← 8bitレジスタ② + 8bitレジスタ①
例
1)ADD.B R0L,R1H
2)ADD.B R1L,R1H
3)ADD.B R1H,R1H
【16bitデータの場合】
ADD.W 16bitレジスタ①, 16bitレジスタ②
オペレーション(動作)
16bitレジスタ② ← 16bitレジスタ② + 16bitレジスタ①
例
1)ADD.W R0,R1
2)ADD.W A1,A0
3)ADD.W R1,R1
R0L,R0H,R1L,R1H
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
16bitデータを扱うので“W”を指定
R0,R1,R2,R3,A0,A1
R0,R1,R2,R3,A0,A1
3E マイクロコンピュータプリント 2017(第4章)
4-9
(3)レジスタ同士を減算する(ボローなし減算命令)
【8bitデータの場合】
SUB.B 8bitレジスタ①, 8bitレジスタ②
オペレーション(動作)
8bitレジスタ② ← 8bitレジスタ② - 8bitレジスタ①
例
1)SUB.B R0L,R1H
2)SUB.B R1L,R1H
3)SUB.B R1H,R1H
【16bitデータの場合】
SUB.W 16bitレジスタ①, 16bitレジスタ②
オペレーション(動作)
16bitレジスタ② ← 16bitレジスタ② - 16bitレジスタ①
例
1)SUB.W R0,R1
2)SUB.W A0,A1
3)SUB.W R1,R1
R0L,R0H,R1L,R1H
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
16bitデータを扱うので“W”を指定
R0,R1,R2,R3,A0,A1
R0,R1,R2,R3,A0,A1
3E マイクロコンピュータプリント 2017(第4章)
4-10
(4)無条件分岐命令(無条件ジャンプ命令)
JMP label
※label(ラベル)とはアセンブリ言語プログラムにおいて,ジャンプ先な
どのプログラム中の位置を表すもので,プログラマが任意の文字列(アル
ファベット・数字)を使ってラベルを作る。機械語に変換される際に,ラ
ベルは自動的にアドレス値に変換される。
オペレーション(動作)
PC ← labelのアドレス
(labelの示すアドレスにジャンプし,そこから実行をする。)
例
1) Stop:
JMP Stop
2) Loop:
JMP Loop
ジャンプ先のアドレスをラベルで記す
何らかの繰り返したい処理
(永久ループになる)
3E マイクロコンピュータプリント 2017(第4章)
4-11
例題2 レジスタ間同士のデータ転送
(1)【8bit データの場合】R0L に 5 を格納してから,R0L の値を R0H,R1L,R1H にコピーを
しなさい
.ORG 0D000h ;① プログラムを格納する先頭アドレスを 0D000hとする
MOV.B #5,R0L ;② R0L ← 5
MOV.B R0L,R0H (1) ;③ R0H ← R0L
MOV.B R0L,R1L (1) ;④ R1L ← R0L
MOV.B R0L,R1H (1) ;⑤ R1H ← R0L
Stop:
JMP Stop ;⑥ 実行停止
(2)【16bitデータの場合】R0に 10000を格納してから,R0 の値を R1,R2,R3,A0,A1にコ
ピーをしなさい
.ORG 0D000h ;① プログラムを格納する先頭アドレスを 0D000hとする
MOV.W #10000,R0 ;② R0 ← 10000
MOV.W R0,R1 (1) ;③ R1 ← R0
MOV.W R0,R2 (1) ;④ R2 ← R0
MOV.W R0,R3 (1) ;⑤ R3 ← R0
MOV.W R0,A0 (1) ;⑥ A0 ← R0
MOV.W R0,A1 (1) ;⑦ A1 ← R0
Stop:
JMP Stop ;⑧ 実行停止
3E マイクロコンピュータプリント 2017(第4章)
4-12
解説2
(1)レジスタ間同士のデータ転送(転送命令)
【8bitデータの場合】
MOV.B 8bitレジスタ①, 8bitレジスタ②
オペレーション(動作)
8bitレジスタ② ← 8bitレジスタ①
例
1)MOV.B R0L,R1H
【16bitデータの場合】
MOV.W 16bitレジスタ①, 16bitレジスタ②
オペレーション(動作)
16bitレジスタ② ← 16bitレジスタ①
例
1)MOV.W R0,R1
2)MOV.W A0,R1
3)MOV.W A1,A0
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
R0L,R0H,R1L,R1H
16bitデータを扱うので“W”を指定
R0,R1,R2,R3,A0,A1
R0,R1,R2,R3,A0,A1
3E マイクロコンピュータプリント 2017(第4章)
4-13
プログラムリストはオペコード,オペランドの縦の列を揃えて書くこと。
問1 64+48+16を計算するプログラム作れ。ただし例題1(1)をまねてプログラムせよ。
問2 200+34-116-44 を計算するプログラム作れ。ただし例題1(1)をまねてプログラ
ムせよ。
問3 問1のプログラムで数値を 2進数で指定する場合はどのようにすればよいか。問1のプ
ログラムで変更すべき行とそれを変更した後の行について示しなさい。
問4 問1のプログラムで数値を 16 進数で指定する場合はどのようにすればよいか。1のプ
ログラムで変更すべき行とそれを変更した後の行について示しなさい。
問5 14500+2040-20+6245-555を計算するプログラム作れ。ただし例題1(2)をまね
てプログラムせよ。(すべて 16bitデータとして扱えばよい)
問6 R0L,R0H,R1L,R1H をすべて 0にクリアするプログラム作れ。
問7 R0,R1,R2,R3,A0,A1をすべて 0にクリアするプログラム作れ。
問8 R0L に 10,R0H に 20,R1L に 30 を入れておき,R0L の内容を R0H に移動,R0H の内容を
R1Lに移動,R1Lの内容を R0Lに移動するプログラム作れ。
問9 R0 に 10000,R1 に 20000 を入れておき,R0 の内容と R1 の内容を交換するプログラム
作れ。
3E マイクロコンピュータプリント 2017(第4章)
4-14
3.アセンブリ言語プログラミングの基礎 (I/O操作)
ここでは,I/O に関する操作およびアセンブリ言語プログラミングの基礎について学び,ア
センブラプログラミングによってマイコンに接続した外部機器とのデータ入出力方法の基礎
を習得する。
I/O は,第 3 章において述べた SFR(Special Function Register)にデータを読み書き
することで,入出力方向や機能を決定したり,外部とのデータの入出力を行うことができる。
SFRは「レジスタ」と名付けられているが,実際は R8Cのメモリアドレス 00000h~002FFh
番地に配置されており,メモリと同様な扱い方でデータの移動ができる。SFR には多くのレジ
スタがあり,その一覧表は第 3章の最後に載せてある。この一覧表のように SFRにはメモリア
ドレスが割り当てられているので,基本的に転送命令(MOV命令)を用いて SFRのアドレスを指
定し,SFRにデータを読み書きすることで I/Oに設定をしたりデータを入出力したりすること
ができる。ただし,実際にプログラミングする際に,SFRのアドレスは第 3章の最後に載せて
ある一覧表の「シンボル」を使用する。
例題3 【回路図1】DIP-SWの 1~4と LEDの 1~4の順番を対応させて考える。ONになった
DIP-SWの bit位置に対応する LEDを点灯し,OFFになった DIP-SWの bit位置に対応する LED
を消灯しなさい。(回路図1の SWは SW-OFFで「1」(5V),SW-ONで「0」(0V)がマイコンに
入力できる。また,LED はマイコンから「1」(5V)を出力すると消灯,「0」(0V)を出力する
と点灯する。)
.ORG 0D000h ; ①次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #00000000B,p1drr(4); ②p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにしている
MOV.B #11110000B,p1(2) ; ③p1(ポート p1) に初期出力データをセット
MOV.B #11110000B,pd1(3) ; ④pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力。
この例の場合,P1の上位 4bitが出力用に,下位 4bitが入力用に設定。
Loop:
MOV.B p1(2),R0L ;⑤ R0L ← p1(ポート1から DIP-SWの値を入力)
SHL.B #4,R0L (8);⑥ R0Lを 4回左シフト(下位 4bitのデータを上位 4bitに移動)
MOV.B R0L,p1(2) ;⑦ p1(ポート1)← R0L。(入力に設定した bitには出力されない)
JMP Loop ;⑧ ラベル Loopから繰り返す
※補足
MOV.B #00000000B,p1drrは,MOV.B #0,p1drr または MOV.B #00H,p1drr でも可。
MOV.B #11110000B,p1は, MOV.B #240,p1 または MOV.B #0F0H,p1 でも可。
MOV.B #11110000B,pd1は, MOV.B #240,pd1 または MOV.B #0F0H,pd1 でも可。
I/O ポート制御関係の SFR のアドレスを示すシンボル。これらのシンボルはアセンブラが自動的に
各 SFR のアドレスに置き換えてアセンブルする。I/O 関係の SFR のアドレスを示すシンボルは,
p1,p3,p4,pd1,pd3,pd4,p1drr があるが,詳しくは第 3 章最後の一覧表を参照せよ。
10 進で指定 16 進で指定
3E マイクロコンピュータプリント 2017(第4章)
4-15
【回路図
1】
R8C/29
3E マイクロコンピュータプリント 2017(第4章)
4-16
■ポート p1レジスタ”p1”, ポート p3レジスタ”p3”,ポート p4レジスタ”p4”
・・・I/Oへ入出力するデータの受け渡し窓口となる SFR
■ポート p1方向レジスタ”pd1”, ポート p3方向レジスタ”pd3”,ポート p4方向レジスタ”pd4”
・・・I/Oポートの各ビットごとに入出力方向を設定するための SFR
■ポート p1駆動能力制御レジスタ”p1drr”
・・・ポート p1の最大入出力電流を設定するための SFR(ポート p1のみ最大入出力電流を変更できる)
3E マイクロコンピュータプリント 2017(第4章)
4-17
3E マイクロコンピュータプリント 2017(第4章)
4-18
解説3
(1)R8C/29の I/Oポートの構成
① R8C/29には I/Oポートとしてポート p1,ポート p3,ポート p4の 3ポートがある。
② ポート p1 には 8 本(p1_7,p1_6,p1_5,p1_4,p1_3,p1_2,p1_1,p1_0)が
ある。入出力が可能であり,入出力方向をポート p1方向レジスタ pd1に設定デー
タを書き込むことにより入出力方向をプログラムすることができる。
③ ポート p3 には 4 本(p3_7,p3_5,p3_4,p3_3)がある。入出力が可能であり,
入出力方向をポート p3方向レジスタ pd3に設定データを書き込むことにより入出
力方向をプログラムすることができる。
④ ポート p4 には 4 本(p4_7,p4_6,p4_5,p4_2)がある。p4_7 と p4_6 と p4_2
は入力専用である。p4_5 のみ入出力が可能であり,p4_5 は入出力方向をポート
p4 方向レジスタ pd4 に設定データを書き込むことにより入出力方向をプログラム
することができる。ただし,外部クロックを R8C/29に接続する場合,p4_7と p4_6
の端子はクロック入力端子(XOUT,XIN)として使われるため p4_7と p4_6は I/O
ポートとして使用できない。
⑤ 通常は,どのポートも入出力電流は 5mAとなっている。
⑥ ポート p1の 8本のみ,ポート 1駆動能力制御レジスタ p1drrに設定データを書き
込むことにより LED駆動ポートとして最大 15mAの駆動電流を流すことができるよ
うになる。
(2)I/Oポートにデータを入出力をする SFR
① ポート p1レジスタ“p1”
ポート p1 のデータを入出力するレジスタである。p1_7~p1_0 にデータを書き込
むと,出力モードに設定された p1 の各 bit からそのデータを出力できる。また,
p1_7~p1_0 にデータを読み込むと,入力モードに設定された p1 の各 bit からデ
ータ入力ができる。
② ポート p3レジスタ“p3”
ポート p3 のデータを入出力するレジスタである。p3_7,p3_5~p3_3 にデータを
書き込むと,出力モードに設定された bit からそのデータを出力できる。また,
p3_7,p3_5~p3_3からデータを読み込むと,入力モードに設定された bitからデ
ータ入力ができる。
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
p1 p1_7 p1_6 p1_5 p1_4 p1_3 p1_2 p1_1 p1_0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
p3 p3_7 0 p3_5 p3_4 p3_3 0 0 0
3E マイクロコンピュータプリント 2017(第4章)
4-19
③ ポート p4レジスタ“p4”
ポート p4のデータを入出力するレジスタである。p4_5が出力モードに設定されて
いるときは,pd4_5にデータを書き込むとそのデータを出力できる。また,入力モ
ードに設定された p4_5または入力専用の p4_7と p4_6と p4_2からデータを読み
込むとデータ入力ができる。なお,p4_7と p4_6と p4_2は入力専用である。
※プログラムでデータを入出力する方法
例 1)R0Lからポート p1に出力
MOV.B R0L,p1
2)数値 00110011Bをポート p1へデータを出力
MOV.B #00110011B,p1
3)ポート p1の p1_5のみに”1”を出力
BSET p1_5 (ビットセット命令)
4)ポート p1の p1_4のみに”0”を出力
BCLR p1_4 (ビットクリア命令)
5)ポート p1から R0Lにデータを入力
MOV.B p1,R0L
6)ポート p1の p1_2が”0”なのか,”1”なのかを確かめる
BTST p1_2 (ビットテスト命令)
➢ もし p1_2=”0”ならばフラグ C=0,Z=1となる
➢ もし p1_2=”1”ならばフラグ C=1,Z=0となる
(3)I/Oポートの入出力方向を設定する SFR
① ポート p1方向レジスタ“pd1”
ポート p1の各 bitの入出力方向を設定するレジスタである。pd1_7~pd1_0に”0”
または”1”をセットして各 bitごとに入出力方向を設定をする。
0:入力モード,1:出力モード
② ポート p3方向レジスタ“pd3”
ポート p3の各 bitの入出力方向を設定するレジスタである。pd3_7,pd3_5~pd3_3
に”0”または”1”をセットして入出力方向を設定をする。bit6 および bit2~bit0
は未使用のため”0”をセットしておく。
0:入力モード,1:出力モード
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
p4 p4_7 p4_6 p4_5 0 0 p4_2 0 0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
pd1 pd1_7 pd1_6 pd1_5 pd1_4 pd1_3 pd1_2 pd1_1 pd1_0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
pd3 pd3_7 0 pd3_5 pd3_4 pd3_3 0 0 0
3E マイクロコンピュータプリント 2017(第4章)
4-20
③ ポート p4方向レジスタ“pd4”
ポート p4 の各 bit の入出力方向を設定するレジスタである。pd4_5 に”0”また
は”1”をセットして入出力設定をする。bit4~bit0は未使用のため”0”をセットし
ておく。また,pd4_7と pd4_6と pd4_2は入力専用のため”0”をセットしておく。
0:入力モード,1:出力モード
※プログラムで入出力方向を設定する方法
例 1)ポート p1の p1_7~p1_5 を入力に,p1_4~p1_0を出力に設定
MOV.B #00011111B,pd1
2)ポート p3の pd3_7 を出力に,p3_5~p3_3を入力に設定
MOV.B #10000000B,pd3
(4)ポート p1の駆動能力(最大電流)を設定する SFR
① ポート p1駆動能力制御レジスタ“p1drr”
ポート p1の p1_7,p1_6,p1_5,p1_4,p1_3,p1_2,p1_1,p1_0の電流の駆動
能力を設定するレジスタである。p1drr7~p1drr0に”0”または”1”をセットして駆
動能力を設定する。
0:駆動能力 LOW(5mA),1:駆動能力 HIGH(15mA)
※プログラムで駆動能力を HIGHに設定する方法
例
1)ポート p1の p1_3および p1_2を駆動能力 HIGHに設定
MOV.B #00001100B,p1drr
注意:本書では LEDを使用する場合でも,駆動能力は LOWに設定している。
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
pd4 pd4_7 pd4_6 pd4_5 0 0 pd4_2 0 0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
p1drr p1drr7 p1drr6 p1drr5 p1drr4 p1drr3 p1drr2 p1drr1 p1drr0
3E マイクロコンピュータプリント 2017(第4章)
4-21
(5)プログラム上の 1Byte数値データをメモリ空間に転送する(転送命令)
MOV.B #IMM,abs16
オペレーション(動作)
abs16で指定したアドレスのメモリ ← #IMM
例
1)MOV.B #000011111B,p1drr 数値 45を p1drr番地のメモリ空間に転送
2)MOV.B #0ah,p1 数値 10をラベル p1番地のメモリ空間に転送
(6)メモリ空間の 1Byteデータをレジスタに転送する(転送命令)
MOV.B abs16, 8bitレジスタ
オペレーション(動作)
8bitレジスタ ← abs16で指定したアドレスのメモリ空間の値
例
1)MOV.B p1, R0H メモリ空間 p1番地の値を R0Hに転送
(7)8bitレジスタの値をメモリ空間に転送する(転送命令)
MOV.B 8bitレジスタ, abs16
オペレーション(動作)
abs16で指定したアドレスのメモリ空間 ← 8bitレジスタの値
例
1)MOV.B R0L,p1 R0Lの値をメモリ空間 p1番地に転送
8bitデータを扱うので“B”を指定
16bitのアドレス値。 プログラム時にはラベルを使用する。
数値データ(”#”を先頭につける)
2進数は数値の右に”b”を,16進数は数値の右に”h”を,10進
数は数値の右に何もつけない
8bitデータを扱うので“B”を指定
16bitのアドレス値。プログラム時にはラベルを使用する。
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
16bit のアドレス値。プログラム時にはラベルを使用する。
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-22
(8)データを指定された bit数分,左または右にシフトする(論理シフト命令)
SHL.B #IMM,8bitレジスタ
オペレーション(動作)
#IMMに指定した回数だけ,8bitレジスタの値を bitシフトする。ただし,#IMM<0
のときは右方向に,また#IMM>0のときは左方向にシフトする。レジスタからあふ
れた bitは Cフラグに入る。
#IMM<0のとき
#IMM>0のとき
例
1)SHL.B #2,R0L
➢ R0Lを 2bit左シフトする。
➢ 仮に実行前:R0L=01011011,C=0ならば,実行後:R0L=01101100,C=1
2)SHL.B #-3,R0H
➢ R0Hを 3bit右シフトする。
➢ 仮に実行前:R0H=01011011,C=0ならば,実行後:R0H=00001011,C=0
応用
左シフト 1回は,2倍したことと等価である。
右シフト 1回は,1/2倍したことと等価である。
MSB LSB
0 C
MSB LSB
C 0
3E マイクロコンピュータプリント 2017(第4章)
4-23
問10 次のアセンブラ命令を示しなさい
(1)p1_7,p1_6 ,p1_2,p1_1を入力モードに, p1_5,p1_4,p1_3,p1_0を出力モード
に設定する
(2)p3_7を出力モードに,p3_5~p3_3を入力モードに設定する
(3)p4_5を出力モードに設定する
(4)p1_2,p1_1の駆動能力を HIGHに設定する
(5)ポート p3から R1Lに入力する
(6)R0Hからポート p3に出力する
問11 【回路図1】DIP-SWの 1~4と LEDの 1~4の順番を対応させて考える。ONになった
DIP-SWの bit位置に対応する LEDを消灯し,OFFになった DIP-SWの bit位置に対応する LED
を点灯しなさい。ただし,プログラムは永久ループの構造にする。
問12 【回路図1】DIP-SWの ON状態を”0”,OFF状態を”1”と見立てる。DIP-SWの 1を LSB,
DIP-SWの 4を MSBとしてできる 4bitの 2 進数を考える。この 2 進数に 2を加算して LEDの
1~4に表示しなさい。ただし LED1を LSB,LED4 を MSBとし,2進数の”1”は点灯,”0”は消
灯とする。プログラムは永久ループの構造にする。
問13 【回路図1】DIP-SWの ON状態を”0”,OFF状態を”1”と見立てる。DIP-SWの 1を LSB,
DIP-SW の 4 を MSB としてできる 4bit の 2 進数を考える。この 2 進数から 3 を減算して LED
の 1~4に表示しなさい。ただし LED1を LSB,LED4 を MSBとする,2進数の”1”は点灯,”0”
は消灯とする。プログラムは永久ループの構造にする。
3E マイクロコンピュータプリント 2017(第4章)
4-24
例題 4 【回路図1】DIP-SW の 1~4 と LED の 1~4 の順番を対応させて考える。押しボタン
スッチ SW1 が押されて ON になったときに DIP-SW の状態を入力し,DIP-SW が ON になってい
る bit 位置に対応する LED を点灯,OFF になっている bit 位置に対応する LED を消灯し続け
なさい。
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #00000000B,p1drr ;② p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11110000B,p1 ;③ p1(ポート p1) に初期出力データをセット
MOV.B #11110000B,pd1 ;④ pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力
MOV.B #00000000B,pd3 ;⑤ pd3(ポート p3方向レジスタ) に入出力方向を設定。1:出力,0:入力
Loop:
BTST p3_3 (2);⑥ SW1の ON/OFFチェック。p3_3が 1 (つまり SW1:OFF)で,C=1となる
JC OWARI(1-1) ; ⑦上記⑧の結果 C=1 (つまり SW1:OFF) ならば⑩をジャンプして出力しない
MOV.B p1,R0L ; ⑧ R0L ← p1。ポート1から R0Lに入力
SHL.B #4,R0L ; ⑨R0Lを 4回左シフト
MOV.B R0L,p1 ;⑩ p1(ポート1)← R0L。(入力に設定した bitには出力されない)
OWARI:
JMP Loop ;⑪Loopから繰り返す
解説4
(1-1)条件分岐(この例題4に使用している。 Cフラグ=1でジャンプする)
JC label
オペレーション(動作)
Cフラグ=0のとき … ジャンプしないで次の命令を実行する
Cフラグ=1のとき … labelの番地へジャンプする
例
1)Start: 命令 1
命令 2
:
:
BTST p3_3
JC Start
:
ジャンプ先のアドレスをラベルで記す (ただし,PC-127≦label≦PC+128)
Cフラグ(キャリーフラグ) フラグレジスタの中の何種類かのフ
ラグのうちの1つのフラグ。サイズは1bit で 0 か 1 かの値を持つ。 ビットテスト命令(BTST 命令),比
較命令(CMP 命令)および演算命令などにおいて,結果に応じて C フラグが変化する。
C フラグ
3E マイクロコンピュータプリント 2017(第4章)
4-25
(1-2)条件分岐(この例題4には使用していない。 Cフラグ=0でジャンプする)
JNC label
オペレーション(動作)
Cフラグ=0のとき … labelの番地へジャンプする
Cフラグ=1のとき …ジャンプしないで次の命令を実行する
例
1)Start: 命令 1
命令 2
:
:
BTST p3_3
JNC Start
:
(1-3)条件分岐 (Zフラグ=1でジャンプする。この例題4には使用していない)
JZ label
オペレーション(動作)
Zフラグ=0のとき … ジャンプしないで次の命令を実行する
Zフラグ=1のとき … labelの番地へジャンプする
例
1) Start: 命令 1
命令 2
:
:
BTST p3_3
JZ Start
:
ジャンプ先のアドレスをラベルで記す (ただし,PC-127≦label≦PC+128)
ジャンプ先のアドレスをラベルで記す (ただし,PC-127≦label≦PC+128)
3E マイクロコンピュータプリント 2017(第4章)
4-26
(1-4)条件分岐(Zフラグ=0でジャンプする。この例題4には使用していない)
JNZ label
オペレーション(動作)
Zフラグ=0のとき … labelの番地へジャンプする
Zフラグ=1のとき … ジャンプしないで次の命令を実行する
例
1)Start: 命令 1
命令 2
:
:
BTST p3_3
JNZ Start
:
(2)指定した bitが“0”か“1”かをテストする (ビットテスト命令)
BTST bitシンボル
オペレーション(動作)
bitシンボルの示す bitが“1”ならば,C=1,Z=0となる。
bitシンボルの示す bitが“0”ならば,C=0,Z=1となる。
例
1)p1_5が”1“ならば Loopへジャンプする。
BTST p1_5
JC Loop
または
BTST p1_5
JNZ Loop
2)p4_7が”0“ならば Loopへジャンプする。
BTST p4_7
JNC Loop
または
BTST p4_7
JZ Loop
p1_7,p1_6,p1_5,p1_4,p1_3,p1_2,p1_1,p1_0などの,解説3の(2)~(4)に述べた各 SFRの bitシンボル
ジャンプ先のアドレスをラベルで記す (ただし,PC-127≦label≦PC+128)
Zフラグ フラグレジスタの中の何種類かのフ
ラグのうちの1つのフラグ。サイズは1bit で 0 か 1 かの値を持つ。 ビットテスト命令(BTST 命令),比
較命令(CMP 命令)および演算命令などにおいて,結果に応じて Z フラグが変化する。
3E マイクロコンピュータプリント 2017(第4章)
4-27
例題5 【回路図1】DIP-SW の 1~4 と LED の 1~4 の順番を対応させて考える。SW1 が ON
になったときの DIP-SWの状態を入力し,DIP-SWが ONになっている bit位置に対応する LED
を点灯,OFF になっている bit 位置に対応する LED を消灯し続けなさい。また,SW2 が ON に
なったときの DIP-SWの状態を入力し,DIP-SWが ONになっている bit位置に対応する LEDを
消灯,OFFになっている bit位置に対応する LEDを点灯し続けなさい。
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #00000000B,p1drr ;②p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11110000B,p1 ;③p1(ポート p1) に出力初期データをセット
MOV.B #11110000B,pd1 ;④pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力
MOV.B #00000000B,pd3 ;⑤pd3(ポート p3方向レジスタ) に入出力方向を設定。1:出力,0:入力
Loop:
BTST p3_3 ;⑥ SW1の ON/OFFチェック。p3の bit3が 1ならば C=1となる
JC SW2_CHK ;⑦ C=1 (つまり SW1:OFF) ならば SW2のチェックにジャンプ
MOV.B p1,R0L ; ⑧ R0L ← p1。ポート1から入力
SHL.B #4,R0L ; ⑨ R0Lを 4回左シフト
MOV.B R0L,p1 ;⑩ p1(ポート1)← R0L。(入力に設定した bitには出力されない)
JMP OWARI ;⑪ 処理の終わりへ
SW2_CHK:
BTST p3_4 ;⑫ SW2の ON/OFFチェック。p3の bit4が 1ならば C=1となる
JC OWARI ;⑬ C=1 (つまり SW2:OFF) ならば終わりへジャンプ
MOV.B p1,R0L ; ⑭ R0L ← p1。ポート1から入力
SHL.B #4,R0L ; ⑮ R0Lを 4回左シフト
NOT.B R0L(1) ;⑯ R0Lを反転
MOV.B R0L,p1 ;⑰ p1(ポート1)← R0L。(入力に設定した bitには出力されない)
OWARI:
JMP Loop ;⑱ 繰り返し
解説5
(1)8bitレジスタの各 bitの”0”,”1” を反転する (ビット反転命令)
NOT.B 8bitレジスタ
オペレーション(動作)
8bitレジスタ → 8bitレジスタ
例
NOT.B R0L 実行前:R0L=10101010B
”0”,”1” を反転
実行後:R0L=01010101B
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-28
問14 【回路図1】 SW1 が押されたら LEDを●○●○のパターンに点灯させ,SW2が押され
たら LED を○●○●のパターンに点灯させよ。ただし○は点灯,●は消灯とする。また,SW1
と SW2 の同時押しは禁止されているものとする。LED はプログラム動作開始時に全部消灯して
おく。プログラムは永久ループの構造にする。
問15 【回路図1】 SW1 と SW2 が押されていないときは LED を○●●○のパターンに,SW1
が押されている間は LED を●●○○のパターンに,SW2 が押されている間は LED を○○●●の
パターンに点灯させ続けよ。ただし○は点灯,●は消灯とする。また,SW1 と SW2 の同時押し
は禁止されているものとする。プログラムは永久ループの構造にする。
問16 【回路図1】 SW1 を押した度に,押した回数を LED に表示しなさい。ただし LED1 を
LSB,LED4 を MSB とし,2進数の”1”は点灯,”0”は消灯とする。プログラム動作時は,0000B
を LEDに表示する。プログラムは永久ループの構造にする。
3E マイクロコンピュータプリント 2017(第4章)
4-29
例題6 問16のスイッチ入力をソフトでチャタリング処理をするプログラムに変更せよ
問16【回路図1】 SW1を押した度に,押した回数を LEDに表示しなさい。ただし LED1を LSB,
LED4 を MSBとし,2進数の”1”は点灯,”0”は消灯とする。プログラム動作時は,0000Bを LED
に表示する。プログラムは永久ループの構造にする。
.ORG 0D000h ;①次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #00000000B, p1drr ;②p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11110000B,p1 ;③p1(ポート p1) に出力初期データをセット
MOV.B #11110000B,pd1 ;④pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力
MOV.B #00000000B,pd3 ;⑤pd3(ポート p3方向レジスタ) に入出力方向を設定。1:出力,0:入力
MOV.B #0,R0L ;⑥SW1を押したカウントを 0にする
Loop:
MOV.B R0L,R0H ;⑦カウント値を表示用レジスタ(R0H)にコピー
SHL.B #4,R0H ;⑧表示用レジスタ(R0H)を 4bit左シフト
NOT.B R0H ;⑨LEDをつけるために反転
MOV.B R0H,p1 ;⑩LEDへ出力
SW1_OFF:
BTST p3_3 ;⑪SW1の bitをチェック
JC SW1_OFF ;⑫SW1が OFFの間は⑪⑫を繰り返して待つ
;★⑬~⑮はチャタリング除去のための時間待ち(約 18ms待つ)
MOV.W #30000,R3 (1) ;⑬ループカウンタ←30000(約 18ms待つためのデータ)[1サイクル]
Chatter1:
SUB.W #1,R3 ;⑭チャタリング除去時間待ち(カウンタ減算)[2サイクル]
JNZ Chatter1 ;⑮チャタリング除去時間待ち(ループ終了判定)[4サイクル/2サイクル]
SW1_ON:
BTST p3_3 ;⑯SW1の bitをチェック
JNC SW1_ON ;⑰SW1が ONの間は⑯⑰を繰り返して待つ
;★⑱~⑳はチャタリング除去のための時間待ち(約 18ms待つ)
MOV.W #30000,R3 (1) ;⑱ ループカウンタ←30000(約 18ms待つためのデータ)[1サイクル]
Chatter2:
SUB.W #1,R3 ;⑲チャタリング除去時間待ち(カウンタ減算)[2サイクル]
JNZ Chatter2 ;⑳チャタリング除去時間待ち(ループ終了判定)[4サイクル/2サイクル]
ADD.B #1,R0L ;21 SW1を押したカウントを+1
JMP Loop ;22 最初から繰り返し
.END
3E マイクロコンピュータプリント 2017(第4章)
4-30
解説6
(1)時間待ちプログラム(ここではチャタリング除去に応用)
➢ 各命令の実行時間はマニュアルに示されている「サイクル数」で計算できる。
➢ 1サイクルとは,動作クロック 1周期分をいう。
➢ 例えば動作クロックが10MHzであれば,1サイクル分の実行時間は0.1μsである。
命令実行に 3 サイクルかかる命令は 0.1μs×3 サイクル=0.3μs の実行時間がかか
る。
➢ 例題 6 のプログラム中の枠内(1)のようにループカウンタの減算だけをするルー
プを挿入すると,時間待ちをすることができる。
➢ この例題の場合,正確に待ち時間ループのサイクル数を求めると
1サイクル + (2サイクル + 4サイクル)×30000回 – 2サイクル = 179999サイクル
となるが,
1サイクル + (2サイクル + 4サイクル)×30000回 – 2サイクル = 180000サイクル
とみなしてもほとんど問題ない。したがって,動作クロックが 10MHz であれば,
この待ち時間ループの所要時間は
0.1μs × 180000サイクル = 18ms
である。
3E マイクロコンピュータプリント 2017(第4章)
4-31
問17 【回路図1】 SW1 を押して離した度に,SW1 を押した回数を LED に表示する。また
SW2を押して離したたびに,表示している SW1の押した回数を 1つ減らしなさい。ただし LED1
を LSB,LED4 を MSBとし,2進数の”1”は点灯,”0”は消灯とする。プログラム動作時は,0000B
を LEDに表示する。スイッチのチャタリング処理を行うこと。プログラムは永久ループの構造
にする。
問18 【回路図1】 DIP-SWの ON状態を”0”,OFF状態を”1”と見立てる。DIP-SWの 1を
LSB,DIP-SWの 4を MSBとしてできる 4bitの 2進数を考える。プログラムが動作したら,ま
ず,0000B を LED に表示する。その後,SW1 を押して離した度に,DIP-SW から入力した 2 進
数をLEDの表示に加算しなさい。ただしLED1をLSB,LED4 をMSBとし,2進数の”1”は点灯,”0”
は消灯とする。スイッチのチャタリング処理を行うこと。プログラムは永久ループの構造にす
る。加算をして 4bitより大きくなる場合については考慮しなくて良い。
問19 【回路図1】 DIP-SWの ON状態を”0”,OFF状態を”1”と見立てる。DIP-SWの 1を
LSB,DIP-SWの 4を MSBとしてできる 4bitの 2進数を考える。プログラムが動作したら,ま
ず,0000Bを LEDに表示する。その後,SW1を押して離したに DIP-SWから入力した 2進数を
LEDの表示に加算し,また SW2を押して離した度に DIP-SWから入力した 2進数を LEDの表示
から減算しなさい。ただし LED1 を LSB,LED4 を MSB とし,2 進数の”1”は点灯,”0”は消灯
とする。スイッチのチャタリング処理を行うこと。プログラムは永久ループの構造にする。加
算や減算をして 4bitより大きくなる場合や小さく場合については考慮しなくて良い。
3E マイクロコンピュータプリント 2017(第4章)
4-32
例題7 【回路図2】動作開始時に LEDをすべて消灯する。その後,LEDを LSBから1つずつ
順番に点灯しては消灯して行く動作を MSBまで繰り返す。MSBを点灯/消灯させたら,再び LSB
から同様の動作を繰り返し続けなさい。
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #00000000B,p1drr ;② p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11111111B,p1 ;③ p1(ポート p1) に出力初期データをセット(全部消灯)
MOV.B #11111111B,pd1 ;④pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力
Lsb:
MOV.B #11111110B,R0L ;⑤LSBを点灯する初回の点灯データを R0Lに用意
Loop:
MOV.B R0L,p1 ;⑥点灯データを LEDへ出力
MOV.W #500,R2 ;⑦2重ループの外側ループの時間待ちループカウンタ R2←500[1サイクル]
WaitLoop1:
MOV.W #1000,R3 ;⑧2重ループの内側ループの時間待ちループカウンタ R3←1000[1サイクル]
WaitLoop2:
NOP (1) ;⑨何もしない命令で時間稼ぎ[1サイクル]
NOP (1) ;⑩何もしない命令で時間稼ぎ[1サイクル]
NOP (1) ;⑪何もしない命令で時間稼ぎ[1サイクル]
SBJNZ.W #1,R3,WaitLoop2(2);⑫2重ループの内側ループの終了判定[7サイクル/3サイクル]
SBJNZ.W #1,R2,WaitLoop1(2);⑬2重ループの外側ループの終了判定[7サイクル/3サイクル]
SHL.B #1,R0L ;⑭点灯 LEDデータを1bit左へシフト(LSBには 0が入ってくる)
ADD.B #00000001B,R0L ;⑮点灯 LEDデータの LSBを 1にする
CMP.B #11111111B,R0L(4);⑯点灯データが 11111111Bかどうかチェック
JNZ Loop ;⑰点灯データが 11111111Bでなければ繰り返す
JMP Lsb ;⑱点灯データが 11111111Bならば Lsbからやり直す
.END
時間待ち A
時間待ち B
3E マイクロコンピュータプリント 2017(第4章)
4-33
解説7
(1)ノーオペレーション
NOP
オペレーション(動作)
何もしない。1サイクル使用する。
用途
1サイクル分の時間を待ちたいときに使う
(2)減算&条件分岐
SBJNZ.B #数値 , 8bitレジスタ, ジャンプ先アドレス(ラベル)
SBJNZ.W #数値 , 16bitレジスタ, ジャンプ先アドレス(ラベル)
オペレーション(動作)
① 8bit(16bit)レジスタ ← 8bit(16bit)レジスタ - #数値
② ①の演算後,8bit(16bit)レジスタ≠0 ならばジャンプ先アドレスへジャンプす
る
(3)加算&条件分岐
ADJNZ.B #数値 , 8bitレジスタ, ジャンプ先アドレス(ラベル)
ADJNZ.W #数値 , 16bitレジスタ, ジャンプ先アドレス(ラベル)
オペレーション(動作)
① 8bit(16bit)レジスタ ← 8bit(16bit)レジスタ + #数値
② ①の演算後,8bit(16bit)レジスタ≠0 ならばジャンプ先アドレスへジャンプす
る
※ 8bit(16bit)レジスタが,11111111B(1111111111111111B)のときに,
+1 を加算すると,8bit(16bit)レジスタは 00000000B(0000000000000000B)
となる
-7≦数値≦+8
R0,R1,R2,R3,A0,A1
R0L,R0H,R1L,R1H
-8≦数値≦+7
R0,R1,R2,R3,A0,A1
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-34
(4)比較命令
CMP.B #IMM, 8bitレジスタ
CMP.W #IMM, 16bitレジスタ
CMP.B 8bitレジスタ , 8bitレジスタ
CMP.W 16bitレジスタ, 16bitレジスタ
オペレーション(動作)
・ 比較対象②-比較対象①の減算を仮に試算して,減算結果の状態をフラグ
レジスタに残す。フラグを見ると大小関係がわかる。あくまで減算は試算
であり,減算結果は捨てられて,実行後の比較対象②の値は実行前と同じ
である。
・ Cフラグの変化
大小関係 比較対象②-比較対象① Cフラグ
比較対象② > 比較対象① 比較対象②-比較対象① > 0 C = 1
比較対象② = 比較対象① 比較対象②-比較対象① = 0 C = 1
比較対象② < 比較対象① 比較対象②-比較対象① < 0 C = 0
・ Zフラグの変化
大小関係 比較対象②-比較対象① Zフラグ
比較対象② > 比較対象① 比較対象②-比較対象① > 0 Z = 0
比較対象② = 比較対象① 比較対象②-比較対象① = 0 Z = 1
比較対象② < 比較対象① 比較対象②-比較対象① < 0 Z = 0
・ Sフラグおよび Oフラグも変化をするが,授業では説明を省略する。
・ この比較命令は,条件分岐(JC,JNC,JZ,JNZ)の直前に用い,比較結果を
フラグに残す。そして比較命令の次に書かれた条件分岐は,そのフラグの
値をジャンプするかしないかの条件として利用する。
比較対象② 比較対象①
3E マイクロコンピュータプリント 2017(第4章)
4-35
例
1)CMP.B R0L, R1L R1L-R0Lを試算。演算結果残らず。フラグが変化。
➢ R1L>R0L ならば C=1,Z=0 となる
➢ R1L=R0L ならば C=1,Z=1 となる
➢ R1L<R0L ならば C=0,Z=0 となる
もし
CMP.B R0L, R1L
JNZ Start
:
:
というプログラムを実行すると,
R1L=R0Lの時・・・そのまま下のプログラムへ
R1L≠R0Lの時・・・Startへジャンプ
となる。
3E マイクロコンピュータプリント 2017(第4章)
4-36
問20 例題7の時間待ち Aと時間待ち Bは,それぞれ何秒の時間待ちができるか。CPUの動
作クロックは 10MHzとする。
問21 【回路図2】動作開始時に LEDをすべて消灯する。その後,LEDを MSBから1つずつ
順番に点灯しては消灯して行く動作を LSBまで繰り返す。LSBを点灯/消灯させたら,再び MSB
から同様の動作を繰り返し続けなさい。LEDの点灯間隔時間は例題7と同じでよい。
問22 【回路図2】動作開始時に LEDをすべて消灯する。その後,LEDを MSBから1つずつ
順番に点灯しては消灯して行く動作を LSBまで繰り返す。LSBを点灯/消灯させたら,今度は,
LSBから逆方向に1つずつ順番に点灯しては消灯して行く動作を MSBまで繰り返す。この一連
の動作が終わったら,同様の動作を繰り返し続けなさい。LEDの点灯間隔時間は約 0.2秒にし
てみよ。CPUの動作クロックは 10MHzとする。
問23 【回路図2】LEDを(MSB)○●○●○●○●(LSB)と(MSB)●○●○●○●○(LSB)
のパターンを交互に点灯させ続けなさい。点灯間隔時間は約 0.3秒とする。CPUの動作クロッ
クは 10MHzとする。動作開始時には LEDを(MSB)○●○●○●○●(LSB)とする。
回路図 2
p3_3
p3_4
(LSB)
p1_0
p1_7
(MSB)
3E マイクロコンピュータプリント 2017(第4章)
4-37
例題8 【回路図2】「LED1を 0.5秒間点灯と 1秒間消灯」を交互に繰り返す。なお,電源が
入った直後の初期設定では LEDは全て消灯する。
.ORG 0D000h ;①次のプログラムを格納する先頭アドレスを 0D000hとする
LDC #0500H,isp ;②LDC命令は例題 9で説明をする。サブルーチン利用時には必須
MOV.B #00000000B,p1drr ;③ p1drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11111111B,p1 ;④ p1(ポート p1) に出力初期データをセット
MOV.B #11111111B,pd1 ;⑤ pd1(ポート p1方向レジスタ) に入出力方向設定。1:出力,0:入力
MOV.B #00000000B,pd3 ;⑥ pd3(ポート p3方向レジスタ) に入出力方向設定。1:出力,0:入力
LED_ON:
BCLR p1_0(1) ;⑦ LED1を点灯
JSR Wait05s (3) ;⑧ 0.5 秒待ちサブルーチンコール
BSET p1_0(2) ;⑨ LED1を消灯
JSR Wait05s ;⑩ 0.5秒待ちサブルーチンコール
JSR Wait05s ;⑪ 0.5秒待ちサブルーチンコール
JMP LED_ON ;⑫ 永久ループ
;***** ここより 0.5秒待ちのサブルーチン(例題 7の時間待ちと同じ)
Wait05s: ; ⑬サブルーチンの先頭につけたラベルがサブルーチン名になる
MOV.W #500,R2 ;⑭2重ループの外側ループの時間待ちループカウンタ R2←500[1サイクル]
WaitLoop1:
MOV.W #1000,R3 ;⑮2重ループの内側ループの時間待ちループカウンタ R3←1000[1サイクル]
WaitLoop2:
NOP ;⑯何もしない命令で時間稼ぎ[1サイクル]
NOP ;⑰何もしない命令で時間稼ぎ[1サイクル]
NOP ;⑱何もしない命令で時間稼ぎ[1サイクル]
SBJNZ.W #1,R3,WaitLoop2 ;⑲2重ループの内側ループの終了判定[7サイクル/3サイクル]
SBJNZ.W #1,R2,WaitLoop1 ;⑳2重ループの外側ループの終了判定[7サイクル/3サイクル]
RTS (4) ;21 サブルーチンを終了し呼び出した命令の次の命令に実行を移す
.END
サブルーチンの先頭に付けたラベルが,サブル
ーチンを呼び出すときに「JSR Wait05s」の
ように使用される。
サブルーチンの終わりは必ず「RTS」命令で終
える
3E マイクロコンピュータプリント 2017(第4章)
4-38
解説8
(1)指定した bitを“0”にクリアする (ビットクリア命令)
BCLR bitシンボル
オペレーション(動作)
bitシンボルの示す bitのみを“0”にする。
(2)指定した bitを“1”にセットする (ビットセット命令)
BSET bitシンボル
オペレーション(動作)
bitシンボルの示す bitのみを“1”にする。
(3)(4)サブルーチンコール(呼び出し)とリターン
JSR命令(Jump Subroutine )
JSR命令で指定されたラベルのサブルーチンに実行を移す。
JSR サブルーチン先頭アドレス(ラベル)
動作:①戻りアドレス(呼び出した JSR命令の次の命令があるアドレス)を
スタックに記憶 スタックについては例題 9で説明する
②サブルーチン先頭アドレスに実行を移す
RTS命令(Retern from Subroutine )
サブルーチンを終えて,コールした JSR命令の次の命令に実行を戻す。
RTS
動作:①スタックに記憶していた戻りアドレスを取り出して PC に入れること
によって,呼び出した JSR命令の次の命令に実行を戻す。
例えばチャタリング待ちをサブルーチン化すると下図のようになる
p1_7,p1_6,p1_5,p1_4,p1_3,p1_2,p1_1,p1_0などの bitシンボル
p1_7,p1_6,p1_5,p1_4,p1_3,p1_2,p1_1,p1_0などの bitシンボル
<メインプログラム>
: : JSR ChatterWait
: : : : JSR ChatterWait
: :
<サブルーチン>
ChatterWait: MOV.W #30000,R3 Chatter1: SUB.W #1,R3
JNZ Chatter1 RTS
もどる
もどる
サブルーチンへ
サブルーチンへ
3E マイクロコンピュータプリント 2017(第4章)
4-39
問24【回路図2】「LED1を 1秒間点灯して消灯し,その後 LED2 を 2秒間点灯して消灯し,
さらに LED3を 3秒間点灯して消灯」を繰り返す。なお,電源が入った直後の初期設定では LED
は全て消灯する。点灯・消灯は BCLR命令,BSET命令を使用する。時間待ちサブルーチンは 1
秒待ちサブルーチン「Wait1s」を作る。2秒待ちは「Wait1s」を 2回,3秒待ちは「Wait1s」
を 3回呼び出せばよい
問25 【回路図2】図に示した T字路交差点の自動車専用の交通信号機を作る。道路 Bには
感応センサーが設置されているが,道路 A には設置されていない。通常状態において,道路 A
の信号機は青,道路 Bの信号機は赤になっている。道路 Bの感応センサーが車を感知したとき
のみ,道路 Aの信号機が青から黄(2秒間維持)を経て赤(10秒間維持)に変わる。道路 Bの
信号機は,道路 A の信号機が赤になったときに,赤から青(8 秒間維持)に変わり,さらに黄
(2秒間維持)を経て赤に戻る。道路 Bの信号機が赤に戻ったとき,道路 Aの信号機が青に戻
り,通常状態に戻る。時間待ちサブルーチンは 2秒待ちサブルーチン「Wait2s」を作る。8秒
待ちは「Wait2s」を 4回呼び出せばよい
LED1~3を道路 Bの信号機,LED4~6を道路 Aの信号機,SW1を感応センサーに見立ててプ
ログラムを作れ。 自動車用の信号機の点灯は MOV命令を使用する。
道路 A【LED6(p1_5):赤,LED5(p1_4):黄,LED4(p1_3):青】
道路 B【LED3(p1_2):赤,LED2(p1_1):黄,LED1(p1_0):青】
問26 【回路図2】問 25の信号機に,道路 Aを横断するための歩行者用信号機を増設する。
この歩行者用信号機が赤になるのは,信号 Aが青および黄のときである。歩行者用信号機が青
になるのは,信号 Aが赤になったときである。また,道路 Aが赤になって 8秒後に,歩行者用
信号機は青点滅(0.2秒間隔)を 2秒間継続する。その後,歩行者用信号機は赤に戻る。この
プログラムを問 25のプログラムに追加しなさい。歩行者信号は LED7を青,LED8を赤とする。
自動車用の信号機の点灯は MOV 命令を使用する。歩行者用の消灯には BSET 命令を使用する。
時間待ちサブルーチンは2秒待ちサブルーチン「Wait2s」と0.2秒待ちサブルーチン「Wait02s」
を作る。8秒待ちは「Wait2s」を 4回呼び出せばよい
道路 A【LED6(p1_5):赤,LED5(p1_4):黄,LED4(p1_3):青】
道路 B【LED3(p1_2):赤,LED2(p1_1):黄,LED1(p1_0):青】
歩行者用【LED8(p1_7):赤,LED7(p1_6):青】
道路 B
道路 A
感応センサ
道路 B
道路 A
感応センサ
3E マイクロコンピュータプリント 2017(第4章)
4-40
問 25 の状態遷移図
問 26 の状態遷移図
信号機 A:青
信号機 B:赤
信号機 A:赤
信号機 B:青
信号機 A:黄
信号機 B:赤
信号機 A:赤
信号機 B:黄
電源 ON
感応センサ
SW1:ON 通常状態
状態1
状態 2
状態 3
2 秒後
状態 4
8 秒後
2 秒後
信号機 A:青
信号機 B:赤
歩行者用:赤
信号機 A:赤
信号機 B:青
歩行者用:青
信号機 A:黄
信号機 B:赤
歩行者用:赤
電源 ON
感応センサ
SW1:ON
通常状態
状態1
状態 2
状態 3
2 秒後
状態 4
8 秒後
点滅カウンタ=0
点滅カウ
ンタ←5
信号機 A:赤
信号機 B:黄
歩行者用:青
信号機 A:赤
信号機 B:黄
歩行者用:消
点滅カウ
ンタ-1
すぐに
0.2 秒後
0.2 秒後 点滅カウンタ≠0 状態 5
3E マイクロコンピュータプリント 2017(第4章)
4-41
例題9 例題7の時間待ちをサブルーチン化したプログラムに変更せよ(サブルーチンのネス
ティング(入れ子)を用いた待ち時間処理)
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
LDC #0500H,isp ;②スタックポインタ ispに 0500Hを設定
Start:
MOV.B #00000000B,p1drr ;③drr(ポート p1駆動能力制御レジスタ) ← すべて Lowにする
MOV.B #11111111B,p1 ;④p1(ポート p1) に出力初期データをセット
MOV.B #11111111B,pd1 ;⑤pd1(ポート p1方向レジスタ) に入出力方向を設定。1:出力,0:入力
LSB:
MOV.B #11111110B,R0L ;⑥LSBを点灯する点灯データの用意
Loop:
MOV.B R0L,p1 ;⑦点灯データを LEDへ出力
JSR Wait500ms ;⑧0.5s時間待ちサブルーチンコール
SHL.B #1,R0L ;⑨点灯 LEDデータを1つ左へずらす(LSBに 0が入る)
ADD.B #00000001B,R0L ;⑩点灯 LEDデータの LSBを 1にする
CMP.B #11111111B,R0L ;⑪点灯データが 11111111Bかどうかチェック
JNZ Loop ;⑫点灯データが 11111111Bでなければ繰り返す
JMP LSB ;⑬点灯データが 11111111Bならば LSBからやり直す
;***** ここからサブルーチン「Wait500ms」 *****
Wait500ms:
MOV.W #500,R2 ;⑭0.5s時間待ちループカウンタ R2←500[1サイクル]
WaitLoop1:
JSR Wait1ms ;⑮1ms時間待ちサブルーチンコール[8サイクル]
SBJNZ.W #1,R2,WaitLoop1 ;⑯ 0.5s時間待ちループ終了判定[7サイクル/3サイクル]
RTS ;⑰リターン[6サイクル]
;***** ここからサブルーチン「Wait1ms」 *****
Wait1ms:
MOV.W #1000,R3 ;⑱1ms 時間待ちループカウンタ R3←1000[1サイクル]
WaitLoop2:
NOP ;⑲何もしない命令で時間稼ぎ[1サイクル]
NOP ;⑳何もしない命令で時間稼ぎ[1サイクル]
NOP ;21 何もしない命令で時間稼ぎ[1サイクル]
SBJNZ.W #1,R3,WaitLoop2 ; 22 1ms 時間待ちループの終了判定[7サイクル/3サイクル]
RTS ;23リターン[6サイクル]
.END
3E マイクロコンピュータプリント 2017(第4章)
4-42
解説9
(1)サブルーチンのネスティング(入れ子)
この例題はサブルーチンの中から,さらに他のサブルーチンを呼び出している。このようなプ
ログラムの構造を「ネスティング」とか,「入れ子」と呼ぶ
(2)サブルーチンの呼び出しとリターンのしくみ
サブルーチンを JSR命令で呼び出した後,サブルーチンを RTS命令で終了すると,必ず呼び出
した側のプログラムの JSR命令の次の命令に実行が戻ってくる。これは,JSR命令で呼び出す
際に,その JSR命令の次の命令があるメモリアドレスを戻りアドレスとして,メモリ内の「ス
タック」と呼ばれる記憶領域に保存しておき,RTS 命令でサブルーチンから戻る際にスタック
から戻りアドレスを取り出して,そこに実行を写すしくみによって実現している。
【再掲】
➢ JSR命令(Jump Subroutine )
JSR命令で指定されたサブルーチンに実行を移す。
JSR サブルーチン先頭アドレス(ラベル)
動作:①戻りアドレス(呼び出した JSR命令の次の命令があるアドレス)を
スタックに記憶
②サブルーチン先頭アドレスに実行を移す
➢ RTS命令(Retern from Subroutine )
サブルーチンを終えて,コールした JSR命令の次の命令に実行を戻す。
RTS
動作:①スタックに記憶していた戻りアドレスを取り出して PC に入れること
によって,呼び出した JSR命令の次の命令に実行を戻す。
<サブルーチン「Wait1ms」>
Wait1ms:
MOV.W #1000,R3
: : RTS
<メインプログラム>
: : JSR Wait500ms
: : : :
<サブルーチン「Wait500ms」>
Wait500ms:
MOV.W #500,R2
JSR Wait1ms
SBJNZ.W #1,R2,WaitLoop1
RTS
もどる
もどる
サブルーチンへ サブルーチンへ
3E マイクロコンピュータプリント 2017(第4章)
4-43
スタック(Stack)・・・メモリの中で、スタック方式と呼ばれるやり方でデータを記憶する領
域。スタック領域ともいう。スタックへのデータの書き込み・読み出しは、
最後に記憶したデータを最初に取り出す LIFO(Last In, First Out)構造
になっている。逆の見方をすると,最初に記憶したデータを最後に取り出す
FILO(First In, Last Out)構造になっている。これはコインホルダや座
布団積みを想像するとわかりやすい。
スタックはメモリのある領域を使用するのだが,スタックを使用する場
合はあらかじめプログラムによってスタック領域の先頭アドレスを指定して
おく必要がある。スタックの先頭アドレスはレジスタのひとつであるスタッ
クポインタ ISP に記憶する。スタックポインタには,スタックの先頭アドレ
ス(記憶順が最後となっているデータのアドレス)が常に記憶されている。
スタックからデータが取り出されたり,スタックにデータが記憶(データを
積む)したりすると,マイコンが自動的にスタックポンタを変更し,常にス
タックポインタがスタックの先頭アドレス(記憶順が最後となっているデー
タのアドレス)を指し示すようになっている。
R8Cのスタックポインタには ISPと USPと呼ばれるものがあるが,授業で
は ISPを使用する。スタックを使用する場合(サブルーチンコールや割込み
処理などの利用時)は,プログラムの先頭においてスタックポインタ ISPへ
の初期アドレス値を,LDC命令を使って設定しておく。この設定をしないと,
スタックポインタが適当な値となっておりマイコンが暴走をする可能性が
ある。
スタックはデータを記憶するときはアドレスが小さい方向に記憶させて
いく。また、データを取り出すときはアドレスが大きい方向へ向かって取り
出しをしていく。
スタック
プログラム
メモリ
00000h
アドレス
ISP
FFFFFh
3E マイクロコンピュータプリント 2017(第4章)
4-44
(3)スタックポインタの設定方法
LDC #アドレス値,ISP
動作 スタックポインタ ISPにアドレス値を格納する。
(スタックポインタについては上記のスタックの説明を参照)
授業ではスタックの初期アドレス値は RAMがある 0500H番地とする。(この値
ならば,プログラムが入るメモリ領域と重ならない)
3E マイクロコンピュータプリント 2017(第4章)
4-45
(4)スタックの利用のイメージ
①LDC命令でスタック領域の先頭アドレスを設定(プログラムの先頭で必ず行う)
②スタックへのデータの記憶ととり出しのイメージ
※スタックに 2Byteデータを記憶またはとり出しするときは ISPは 2アドレス分変化する。
4FBh 4FCh 4FDh 4FEh 4FFh 500h
4FBh 4FCh 4FDh 4FEh 4FFh 500h
4FBh 4FCh 4FDh 4FEh 4FFh 1番目のデータ 500h
4FBh 4FCh 4FDh 4FEh 2番目のデータ 4FFh 1番目のデータ
500h
4FBh 4FCh 4FDh 3番目のデータ 4FEh 2番目のデータ 4FFh 1番目のデータ
500h
…
0500h ISP
…
…
…
ISP 0500h
…
…
ISP 04FFh
…
…
ISP 04FEh
…
…
ISP 04FDh
1Byteを記憶
①ISP←ISP-1
②ISPの指すメモリに 1Byte 記憶
1Byteをとり出す
①ISPの指すメモリから 1Byte とり出し
②ISP←ISP+1
1Byteを記憶
①ISP←ISP-1
②ISPの指すメモリに 1Byte 記憶
1Byteを記憶
①ISP←ISP-1
②ISPの指すメモリに 1Byte 記憶
1Byteをとり出す
①ISPの指すメモリから 1Byte とり出し
②ISP←ISP+1
1Byteをとり出す
①ISPの指すメモリから 1Byte とり出し
②ISP←ISP+1
初期状態
LDC #0500h,ISP
スタック領域は空
スタック領域
スタック領域
スタック領域
3E マイクロコンピュータプリント 2017(第4章)
4-46
例題 9の補足(サブルーチン呼び出しにおける復帰先のスタックにおける記憶と取り出し)
トランジスタ技術スペシャル No.101 から引用
3E マイクロコンピュータプリント 2017(第4章)
4-47
問27 【回路図2】LEDを(MSB)○●○●○●○●(LSB)と(MSB)●○●○●○●○(LSB)
のパターンを交互に点灯させ続けなさい。時間待ちにはサブルーチンを使用し,点灯間隔時間
は約 0.3秒とする。CPUの動作クロックは 10MHzとする。動作開始時には LEDを(MSB)○●
○●○●○●(LSB)とする。(問 23の時間待ちのサブルーチン化)
問28 【回路図1】DIP-SWの ON状態を”0”,OFF状態を”1”と見立てる。DIP-SWの 1を LSB,
DIP-SW の 4 を MSB としてできる 4bit の 2 進数を考える。プログラムが動作したら,まず,
0000Bを LEDに表示する。その後,SW1が押される度に DIP-SWから入力した 2進数を LEDの
表示に加算し,また SW2が押される度に DIP-SWから入力した 2進数を LEDの表示から減算し
なさい。ただし LED1 を LSB,LED4 を MSB とし,2 進数の”1”は点灯,”0”は消灯とする。サ
ブルーチンを用いてチャタリングを除去すること。CPU の動作クロックは 10MHz とする。(問
19のチャタリングを除去のサブルーチン化)
問29 【回路図2】LEDを
①(MSB)●●●○○●●●(LSB)
②(MSB)●●○●●○●●(LSB)
③(MSB)●○●●●●○●(LSB)
④(MSB)○●●●●●●○(LSB)
⑤(MSB)●○●●●●○●(LSB)
⑥(MSB)●●○●●○●●(LSB)
⑦(MSB)●●●○○●●●(LSB)
のパターンで,①~⑦の順番で点灯させ,⑦の点灯が終わったら再び①から同じように点灯を
繰り返す。各パターンの切り替えは 0.2秒おきとする。CPUの動作クロックは 10MHzとする。
3E マイクロコンピュータプリント 2017(第4章)
4-48
例題10 1byte データのメモリ操作【数値をメモリに転送】【メモリをレジスタに転送】【レ
ジスタをメモリに転送】【メモリ領域の確保】
まず,プログラム命令により内部 RAM の 0400h 番地に数値 123 を,また 0401h 番地に数値 5
を入れておく。その後でこの 0400h 番地と 0401h 番地に入れた 1Byte データを加算して,結
果を 0402h番地に入れなさい
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #123,Memory1(1);② Memory1番地(0400h番地)← 数値 123
MOV.B #5,Memory2(1) ;③ Memory2番地(0401h番地)← 数値 5
MOV.B Memory1,R0L(2) ;④ R0L ← Memory1番地(0400h番地)の値
MOV.B Memory2,R1L(2) ;⑤ R1L ← Memory2番地(0401h番地)の値
ADD.B R1L,R0L ;⑥ R0L ← R0L + R1L
MOV.B R0L,Memory3(3) ;⑦ Memory3番地(0402h番地) ← R0Lの値
Stop: JMP Stop ;⑧ 実行停止
.SECTION WORK,DATA ;⑨ 擬似命令 内部 RAM領域を WORKとして使用する
.ORG 0400h ;⑩ 擬似命令 ここからのプログラムを 0400hに格納する
Memory1: .BLKB 1 ;⑪ ここのメモリ 1Byteを確保する。アドレスは Memory1
Memory2: .BLKB 1 ;⑫ ここのメモリ 1Byteを確保する。アドレスは Memory2
Memory3: .BLKB 1 ;⑬ ここのメモリ 1Byteを確保する。アドレスは Memory3
.END
.BLKB擬似命令 (メモリ領域の確保)
アセンブル時(機械語生成時)にメモリ領域を確保する擬似命令。.BLKB 擬似命令は
そのアドレスのメモリから 1Byte 分のメモリ領域をオペランドに指定した個数分をア
センブル時(機械語生成時)確保する。オペランドの数値は確保するメモリ領域の個数
を指定する。
例 Memory1: .BLKB 1 ・・・1Byte 領域を 1個確保(Memory1番地に 1Byte分)
Memory1: .BLKB 5 ・・・1Byte領域を 5個確保(Memory1番地から 5Byte分)
3E マイクロコンピュータプリント 2017(第4章)
4-49
例題10の悪い例(メモリ領域の確保をしないでアドレスを数値で指定してデータをメモリに
いれると,そのメモリ領域が確保されていないので,他のプログラムによってそのデータを破
壊される可能性がある)
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.B #123,0400h ;② 0400h番地 ← 数値 123
MOV.B #5,0401h ;③ 0401h番地 ← 数値 5
MOV.B 0400h,R0L ;④ R0L ← 0400h番地の値
MOV.B 0401h,R1L ;⑤ R1L ← 0401h番地の値
ADD.B R1L,R0L ;⑥ R0L ← R0L + R1L
MOV.B R0L,0402h ;⑦ 0402h番地 ← R0Lの値
Stop: JMP Stop ;⑧ 実行停止
レジスタ
データ
プログラム
CPU メモリ
CPU
MOV.B 8bitレジスタ,8bitレジスタ
MOV.W 16bitレジスタ,16bitレジスタ
MOV.B 8bitレジスタ, アドレス
MOV.W 16bitレジスタ,アドレス
MOV.B アドレス,8bitレジスタ
MOV.W アドレス,16bitレジスタ
MOV.B #IMM,8bitレジスタ
MOV.W #IMM,16bitレジスタ
ラベルが用いられる
※上図は MOV 命令のソースとディスティネーションの組合せ
の一部である。図に示してない組合せも存在する。
MOV.B #IMM,アドレス
MOV.W #IMM,アドレス
3E マイクロコンピュータプリント 2017(第4章)
4-50
解説10
(1)プログラム上の 1Byte数値データをメモリに転送する(転送命令)
MOV.B #IMM,abs16
オペレーション(動作)
abs16で指定したアドレスのメモリ ← #IMM
例
1)MOV.B #45,Memory2 数値 45がラベル Memory2のメモリに入る
2)MOV.B #0ah,Memory1 数値 10がラベル Memory1のメモリに入る
(2)メモリの 1Byteデータをレジスタに転送する(転送命令)
MOV.B abs16, 8bitレジスタ
オペレーション(動作)
8bitレジスタ ← abs16で指定したアドレスのメモリの値
例
1)MOV.B Memory1, R1H Memory1番地のメモリ値が R1Hに入る
8bitデータを扱うので“B”を指定
16bitのアドレス値。 プログラム時にはラベルを使用する。
数値データ(”#”を先頭につける)
2 進数は数値の右に”b”を,16 進数は数値の
右に”h”を,10 進数は数値の右に何もつけな
い
8bitデータを扱うので“B”を指定
16bit のアドレス値。プログラム時にはラベルを使用する。
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-51
(3)8bitレジスタの値をメモリに転送する(転送命令)
MOV.B 8bitレジスタ, abs16
オペレーション(動作)
abs16で指定したアドレスのメモリ ← 8bitレジスタの値
例
1)MOV.B R1H, Memory1 R1Hの値が Memory1番地に入る
※ルネサステクノロジ R8C/28グループ,R8C/29グループハードウェアマニュアルより引用
8bitデータを扱うので“B”を指定
16bit のアドレス値。プログラム時にはラベルを使用する。
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-52
問30 次の動作をするアセンブラ命令を示しなさい
(1)値 25 をラベル suuchi で指定される 1Byte のメモリに格納するアセンブラ命令を示し
なさい。
(2)レジスタ R0L のデータをラベル Data1 で指される 1Byte のメモリに転送するアセンブ
ラ命令を示しなさい。
(3)ラベル suuchiで指されるメモリの 1Byteデータをレジスタ R0Hに転送するアセンブラ
命令を示しなさい。
(4)0410h 番地に 1Byte分,0411h 番地に 1Byte 分,0412h 番地に 1Byte 分,0413h 番地
に 1Byte分はメモリの確保をするだけのプログラムを示しなさい。(ヒント:例題 11の
⑨~⑬のように回答すればよい)
問31 まず,プログラム命令により内部 RAM の 0410h 番地に数値 200 を,0411h 番地に数
値 25 を,また 0412h 番地に数値 100 を入れておく。その後,この 0410h 番地と 0411h 番地
に入れた 1Byte データを加算して,結果を 0413h 番地に入れなさい。また,この 0410h 番地
の 1Byte データから 0412h 番地の 1Byte データを減算して結果を 0414h 番地に入れなさい。
ただし,0410h番地,0411h番地,0412h番地,0413h番地,0414h番地はメモリの確保を行
うこと
3E マイクロコンピュータプリント 2017(第4章)
4-53
参 考(試験範囲外)【アドレスレジスタ間接指定】メモリのデータ位置をラベル(アドレス値)
で直接指定するのではなく,アドレスレジスタ(A0,A1)の中にある値をメモリのアドレスと
してメモリのデータ位置を間接的に指定する方法。
(1)アドレスレジスタで指定されるメモリの 1Byteデータをレジスタに転送(転送命令)
MOV.B [アドレスレジスタ],8bitレジスタ
オペレーション(動作)
8bitレジスタ ← アドレスレジスタが示すアドレスのメモリのデータ
例
1)MOV.B [A0], R0L 仮に A0=0400hだったとすると,0400h番地のデ―タが R0Lに入る
2)MOV.B [A1], R1L 仮に A1=0500hだったとすると,0500h番地のデ―タが R1Lに入る
(2)レジスタの 1Byteデータをアドレスレジスタで指定されるメモリに転送(転送命令)
MOV.B 8bitレジスタ, [アドレスレジスタ]
オペレーション(動作)
アドレスレジスタが示すアドレスのメモリのデータ ← 8bitレジスタ
例
1)MOV.B R0L, [A0] 仮に A0=0400hだったとすると,R0Lが 0400h番地のメモリに入る
2)MOV.B R1L, [A1] 仮に A1=0500hだったとすると,R1Lが 0500h番地のメモリに入る
8bitデータを扱うので“B”を指定
A0,A1 []で囲まれている意味:A0または A1のアドレスレジスタの値をアドレスと解釈し,そのアドレスのメモリ内のデータが転送対象となる。 これを「アドレスレジスタ間接指定」という
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
A0,A1 []で囲まれている意味:A0または A1のアドレスレジスタの値をアドレスと解釈し,そのアドレスのメモリ内のデータが転送対象となる。 これを「アドレスレジスタ間接指定」という
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-54
例題11 【アドレスレジスタ間接指定】
まず,内部 ROM(データフラッシュ)の 2400h 番地から 2404h 番地に 1Byte の数値
23,10,59,8,150をデータとして置いておく。そして,この 1byte×5個の数値データにそれぞ
れ 10を加えて内部 RAMの 0400h番地から 0404h番地に格納しなさい
.ORG 0D000h ;① 次のプログラムを格納する先頭アドレスを 0D000hとする
MOV.W #Data1,A0 ;② A0←データが格納されたメモリの先頭である Data1のアドレス
MOV.W #Answer,A1 ;③ A1←結果を格納するメモリの先頭である Answerのアドレス
MOV.B #5,R0L ;④ R0L ← 数値 5(ループカウンタ初期値,5回)
Loop: MOV.B [A0],R1L(1) ;⑤ R1L ← A0が示すアドレスのメモリのデータ
ADD.B #10,R1L ;⑥ R1L ← 10 + R1L
MOV.B R1L,[A1](2) ;⑦ A1が示すアドレスのメモリ ← R1L(+10加算した結果)
ADD.W #1,A0 ;⑧ A0 ← A0 + 1 (アドレスのカウントアップ)
ADD.W #1,A1 ;⑨ A1 ← A1 + 1 (アドレスのカウントアップ)
SUB.B #1,R0L ;⑩ R0L ← R0L - 1 (ループカウンタを 1減らす)
JNZ Loop ;⑪ Zフラグ=0ならば Loopへジャンプ。(直前の演算結果が非 0でジャンプ)
Stop: JMP Stop ;⑫ 実行停止
.SECTION VALUE,ROMDATA ;⑬ 擬似命令 内部 ROM領域を VALUEとして使用する
.ORG 2400h ;⑭ 擬似命令 ここからのプログラムを 2400hに格納する
Data1: .BYTE 23 ;⑮ ここのメモリにデータ 23をアセンブル時に格納
Data2: .BYTE 10 ;⑯ ここのメモリにデータ 10をアセンブル時に格納
Data3: .BYTE 59 ;⑰ ここのメモリにデータ 59をアセンブル時に格納
Data4: .BYTE 8 ;⑱ ここのメモリにデータ 8をアセンブル時に格納
Data5: .BYTE 150 ;⑲ ここのメモリにデータ 150をアセンブル時に格納
.SECTION WORK,DATA ;⑳ 擬似命令 内部 RAM領域を WORKとして使用する
.ORG 0400h ;21 擬似命令 ここからのプログラムを 0400hに格納する
Answer: .BLKB 5 ;22 ここのメモリ 1Byte×5個を確保する。先頭のアドレスは Answer
.END
.BYTE擬似命令 (データを内部 ROM領域へ格納) アセンブル時にデータを内部 ROMに格納する擬似命令で,アセンブル時(機械語生成
時)に,.BYTE 擬似命令が書かれた位置のアドレスにオペランドにある1Byte 分のデータが格納される。
例 Data1: .BYTE 14 ・・・データ 14を Data1番地に格納 Data2: .BYTE FFh ・・・データ FFhを Data2番地に格納 Data3: .BYTE 11110000B・・・データ 11110000Bを Data3番地に格納
#が先頭に付くとラベルのアドレス値そのものを意味する
3E マイクロコンピュータプリント 2017(第4章)
4-55
解説11
(1)アドレスレジスタで指定されるメモリの 1Byteデータをレジスタに転送(転送命令)
MOV.B [アドレスレジスタ],8bitレジスタ
オペレーション(動作)
8bitレジスタ ← アドレスレジスタが示すアドレスのメモリのデータ
例
1)MOV.B [A0], R0L 仮に A0=0400hだったとすると,
0400h番地のデ―タが R0Lに入る
2)MOV.B [A1], R1L 仮に A1=0500hだったとすると,
0500h番地のデ―タが R1Lに入る
(2)レジスタの 1Byteデータをアドレスレジスタで指定されるメモリに転送(転送命令)
MOV.B 8bitレジスタ, [アドレスレジスタ]
オペレーション(動作)
アドレスレジスタが示すアドレスのメモリのデータ ← 8bitレジスタ
例
1)MOV.B R0L, [A0] 仮に A0=0400hだったとすると,
R0Lが 0400h番地のメモリに入る
2)MOV.B R1L, [A1] 仮に A1=0500hだったとすると,
R1Lが 0500h番地のメモリに入る
8bitデータを扱うので“B”を指定
A0,A1 []で囲まれている意味:A0または A1のアドレスレジスタの値をアドレスと解釈し,そのアドレスのメモリ内のデータが転送対象となる。 これを「アドレスレジスタ間接指定」という
R0L,R0H,R1L,R1H
8bitデータを扱うので“B”を指定
A0,A1 []で囲まれている意味:A0または A1のアドレスレジスタの値をアドレスと解釈し,そのアドレスのメモリ内のデータが転送対象となる。 これを「アドレスレジスタ間接指定」という
R0L,R0H,R1L,R1H
3E マイクロコンピュータプリント 2017(第4章)
4-56
問32まず,内部 ROM(データフラッシュ )の 2400h 番地から 2406h 番地に数値
2,4,6,8,10,12,14をデータとして置いておく。この 1byte×7個の数値データの合計を求めて
内部 RAMの 0400h番地に格納しなさい
問33まず,内部 ROM(データフラッシュ )の 2400h 番地から 2406h 番地に数値
20,40,60,80,100,120,140をデータとして置いておく。この 1byte×7個の数値データからそ
れぞれ 20を減算して内部 RAMの 0400h番地から 0406h番地に格納しなさい。この問いでは減
算をするときに,2406h番地のデータから順番に番地が減る方向に減算してみなさい。
問34内部 ROM(データフラッシュ)の 2400h 番地から 25FFh 番地に 1Bytex512 個のデータ
がすでに入っているものとする。これらの数値データを内部 RAM の 0400h 番地から 05FFh 番
地にコピーしなさい。2400h番地から 25FFh番地にはすでにデータが入っていて,このプログ
ラムではデータを入れなくて良いものとする。2400h番地のラベルは MData1とする。(ループ
カウンタに 16bitレジスタを使うと良い)
問35内部 ROM (データフラッシュ)の 2400h 番地から 241Fh 番地に 1Bytex32 人分の国語
の得点データがすでに入っている。また,2500h 番地から 251Fh 番地に 1Bytex32 人分の数
学の得点データがすでに入っている。ただしデータの順番はアドレス順に名簿順で入っている
ものとする。2500h番地から 251Fh番地に国語と数学の個人ごとの合計点を求めなさい(数学
の得点に上書きしてよい)。国語と数学の得点データがすでに入っていて,このプログラムで
はこれらのデータを入れなくて良いものとする。2400h 番地のラベルは Kokugo,2500h 番地
のラベルは Sugaku_Gokeiとする。