SRCのレジスタ16bitのデータをDSTのレジスタに転送(MOVW)
RL78シリーズのアセンブラ言語で使用されるMOVW命令は、「Move Word」の略で、16ビットのデータを移動するための命令です。通常のMOV命令が8ビットデータの移動に使用されるのに対し、MOVWは2バイト(ワードサイズ)のデータをソースレジスタからデスティネーションレジスタに転送します。
主な特徴:
- レジスタ間の16ビットデータ転送 MOVW命令は、指定されたソースレジスタからデスティネーションレジスタへ16ビットデータを一度に転送します。
- 使用例
MOVW AX, BX ; AXレジスタにBXレジスタの16ビット値を転送
- 効率的なデータ操作 この命令を使うことで、2バイトのデータを一度に処理でき、プログラムの実行効率が向上します。
MOVW命令は、ワード単位のデータ処理を行う場面で頻繁に使われるため、データのサイズが16ビットの場面で非常に有用です。
16bit幅のデータ同士を減算する(SUBW)
SUBW
命令は、アセンブリ言語において16ビット幅のデータ同士を減算するための命令です。RL78シリーズのマイコンでは、2つの16ビットレジスタの値を引き算する際に使用されます。
主な特徴
- 減算の処理:
- *
SUBW
*は「Subtract Word」の略で、16ビット(ワードサイズ)の値を扱います。 - 2つの16ビットレジスタ間の引き算が行われ、その結果が最初のレジスタに保存されます。
- *
- フラグの設定:
- 演算結果によって、**キャリーフラグ(CY)やゼロフラグ(Z)**などが設定されます。これにより、演算の結果がゼロであるか、借り(キャリー)が発生したかを確認できます。
- 命令の形式:
SUBW AX, BX ; AX = AX - BX
- 上記の例では、レジスタAXからBXを引き算し、その結果をAXに格納します。
使用例
MOVW AX, #0x1234 ; AXに0x1234をロード
MOVW BX, #0x0020 ; BXに0x0020をロード
SUBW AX, BX ; AXからBXを減算し、結果をAXに格納
この例では、AXの値が 0x1234 – 0x0020 によって更新されます。
データやコードを配置するメモリ領域を指定する(.SECTION命令)
アセンブリ言語における.SECTION
は、特定のメモリセグメントにデータを配置するための命令です。今回のコードにおける.SECTION .dataR, DATA
および.SECTION .sdataR, DATA
の解説は以下の通りです。
.SECTION .dataR, DATA
:- *
.dataR
*は、読み取り専用のデータを格納するセクションです。典型的には定数やプログラム中で変更されないデータが配置されます。このデータはプログラムが実行される際に変更されないため、セキュリティや最適化の観点からも重要です。
- *
.SECTION .sdataR, DATA
:- *
.sdataR
*は、通常、小さいデータを扱うセクションとして使われます。この場合も、読み取り専用のデータが格納されますが、特にサイズの小さい定数などが格納されることが多いです。
- *
これらのセクションは、メモリを効率的に管理するために役立ちます。読み取り専用データを分離することで、プログラムの実行中にデータの不必要な変更を防ぎ、セキュリティやパフォーマンスを向上させることができます[3]。
アセンブラ言語の**.SECTION
疑似命令**は、プログラム内でデータやコードを配置するメモリセグメントを指定する命令です。プログラムを効率的に実行するために、メモリの異なる領域にデータやコードを整理して配置することができます。一般的な使い方をいくつか紹介します。
主な使い方
.SECTION .text
:- 実行される命令コード(プログラムの本体)が配置されます。通常、プログラムはここから始まります。
.SECTION .data
:- 変更可能なデータが配置されるセクションです。変数や配列など、実行時に値が変更されるデータがここに置かれます。
.SECTION .rodata
:- 読み取り専用のデータ(定数など)が配置されるセクションです。実行中に変更されない文字列や定数がここに格納されます。
.SECTION .bss
:- 初期値が指定されていない変数のための領域です。このセクションでは、メモリが初期化されずに確保されます。
効果
- メモリ管理を効率化し、セキュリティとパフォーマンスを向上させるために使用されます。
- *
.SECTION
*命令は、プログラムの可読性を高めると同時に、各データやコードの配置を制御するため、アセンブラプログラムにおいて重要な役割を果たします。
オペランドに指定したシンボルを外部モジュールから参照できるようにする(.public)
スタック領域のスタート位置と終了位置を示す(_stackend: _stacktop)
_stackend:
と stacktop:
_stackend:
はスタックの終了位置を示します。- *
.DS 0x200
*は、スタックに512バイト(0x200)の領域を確保することを意味します。 _stacktop:
はスタックの開始位置(トップ)を示します。
割り込みベクタテーブルを生成する(.VECTOR)
C言語のルーチン(関数)を呼び出す(CALL)
RL78シリーズのアセンブラ言語におけるCALL命令は、サブルーチン(関数や処理のブロック)を呼び出すために使用される命令です。以下は、RL78におけるCALL命令の重要なポイントです。
1. 基本動作
- CALL命令は、プログラムの実行中に特定のアドレスにあるサブルーチン(別のプログラムコード)にジャンプし、そのサブルーチンが終わった後に元の場所に戻る機能を提供します。
- サブルーチンが終了すると、元のコードの次の命令が実行されます(RET命令で戻る)。
2. スタックの使用
- CALL命令が実行されると、現在のプログラムカウンタ(PC)の値がスタックに保存されます。この保存により、サブルーチン終了後に元の実行位置に戻ることが可能です。
- スタックが正しく設定されていないと、戻りアドレスが壊れ、正常に戻れなくなることがあります。
3. 例
CALL _myFunction ; _myFunction というサブルーチンを呼び出す
NOP ; 次の命令はサブルーチンから戻った後に実行される
4. CALLT命令との違い
- CALLT命令は特定のテーブルに格納されたアドレスを参照してサブルーチンを呼び出します。一方、通常のCALL命令は直接的なアドレス指定でサブルーチンを呼び出します。
このように、CALL命令はプログラムの構造化と再利用性を高めるために非常に重要な命令です。
開始するセクションを定義する(CSEG)
直前の第1オペランドが第2オペランドの値より大きくない場合ジャンプする(BNH)

BNH命令は、アセンブリ言語における条件付き分岐命令の一種です。この命令は、特定の条件が成立していない場合に分岐(ジャンプ)するために使われます。
BNH命令の構造
- BNHは、「Branch if Not Higher」の略です。つまり、比較結果が「Higher(より大きい)」という条件を満たしていない場合に分岐します。
- 条件分岐に関連する命令の中で、特定のフラグ(キャリーフラグやゼロフラグなど)がセットされていない場合に実行されます。
使用例
CMP AX, BX ; AXとBXを比較
BNH Label ; AXがBXより大きくない場合、Labelへジャンプ
- この例では、AXがBXより大きくない(”not higher”)場合に、指定されたLabelにジャンプします。
注意点
- BNH命令は比較後に使われ、特定の条件(ここでは、AXがBXより小さいか等しい)が満たされた場合に分岐します。
- この命令は、フラグレジスタの状態を基に動作するため、CMP(比較命令)などとセットで使用されることが一般的です。
16bitのデータに対し右方向の論理シフト(SHRW)

指定したワードアドレスを0x0クリア(CLRW)

ワードデータ同士を比較する(CMPW)

ゼロフラグが1の時にジャンプする(BZ)

SRCとDSTの16bitデータを交換する(XCHW)

16bitのデータを加算する(ADDW)

指定した16bitアドレスのデータをデクリメントする(DECW)

指定した16bitアドレスのデータをインクリメントする(INCW)

無条件に分岐を行う(BR)
