講義に登場する命令と疑似命令のまとめ

擬似命令 (directive)

.org

プログラムの開始位置となるメモリアドレスを設定する命令である.

.org    0x0000   /* 68000 のベクタテーブルの先頭に設定 */
.org    0x400    /* 0x400 に設定 */

dc

指定されたデータを実メモリ領域内に直接配置する命令である.

dc.l    0x3000   /* 0x00003000を格納 (.l は4バイト) */
dc.l    START    /* ラベル START が指し示すメモリアドレスの値そのものをメモリ中に格納 */
dc.b    'a','b','c',0 /* カンマで区切られて4つ並んでいるので,4バイト分格納される */

ds

指定されたサイズのデータ領域をメモリ上に確保する命令である.

ds.b    500     /* 500 バイト確保 */

.equ

シンボルを定義する命令である.ラベルとシンボルは異なる概念であり,ラベルはプログラムやデータが配置される「メモリアドレス」と関連付けられた文字列である一方,シンボルは.equによって定義された特定の値に関連付けられた文字列である.

.equ    BUFFER_SIZE,256    /* シンボル BUFFER_SIZE の値を 256 と定義 */    

命令 (instruction)

move

データを転送する基本的な命令である.

move.w    #200,%d2  /* #200 は10進数. d2 の上位バイトは変化しない */
move.l    #0x01,%d1 /* #0x01 は16進数. d0 に 0x00000000 がセットされる */
move.w    #0x2700,%sr        /* 割り込み禁止 */
move.w    #BUFFER_SIZE,%d2    /* 「.equ BUFFER_SIZE 100」のような文とペアで使う */
move.l    %d0,%d1
move.l    %d0,(%a0)    /* アドレスレジスタ a0 がポイントするメモリに転送(a0は変化しない) */
move.b    #0x00,(%a0)    /* アドレスレジスタ a0 がポイントするメモリに 0 をセット(.b なので1バイト) */
move.l    (%a2),%d3    /* アドレスレジスタ a0 がポイントするメモリの中身が d3 に転送される */
move.w    %sr,-(%sp)    /* システムスタックエリアに sr の中身をプッシュ */
move.w    (%sp)+,%sr    /* システムスタックエリアから sr の中身をポップ */
move.b    (%a0),(%a1)    /* メモリからメモリへのデータ転送 */

movea

メモリアドレスを転送する特殊な命令である.

movea.l %a0,%a1
movea.l    (%a2),%a3        /* a2 がポイントするメモリの中身(4バイト)が a3 にセットされる */

movem

複数のレジスタデータを一括で転送する命令である.

movem.l    %d0-%d7/%a0-%a6,-(%sp)     /* システムスタックエリアにプッシュ */
movem.l    (%sp)+,%d0-%d7/%a0-%a6    /* システムスタックエリアからポップ */

lea

指定されたメモリアドレスの実効アドレスをレジスタにロードする命令である.

lea DATA1,%a0    /* ラベル DATA1 が指し示すメモリアドレスを a0 にセット */

addq

15以下の小さな値を加算する高速な命令である.

addq.l #1,%a1    /* 1加算. a1 が1増える */
addq.1 #0x01,(%a2)    /* 1加算. アドレスレジスタ a2 がポイントするメモリの中身(4バイト)が1増える */

adda

アドレスレジスタに対して加算を行う専用の命令である.

adda.l %d0,%a0    /* a0 の値が変化する */
adda.l #0xff,%a0

muls

符号付き整数の乗算を行う命令である.

muls    %d0,%d1
muls    #0x04,%d1    /* 4倍 */

cmp

レジスタまたはメモリの内容を比較する命令である.

cmp.l    (%a4),%d3    /* アドレスレジスタ a4 がポイントするメモリの中身(4バイト)を,d3 と比較 */

cmpi

即値との比較を行う専用の命令である.

cmpi.b #0,(%a0)    /* アドレスレジスタ a0 がポイントするメモリの中身(1バイト)を,数値0と比較 */
cmpi.b #0,%d0    /* データレジスタ d0 の中身のうち下位1バイトを,数値 0 と比較 */

beq

比較結果が等しい場合に指定されたアドレスへ分岐する条件分岐命令である.

beq START    /* ラベル START が指し示すメモリアドレスへ条件付きで分岐 */

bra

指定されたアドレスへ無条件に分岐する命令である.

bra inputQue    /* ラベル inputQue が指し示すメモリアドレスへ無条件で分岐 */

dbra

カウンタを減算しながらループを実行する命令である.

dbra %d0,START

jsr

サブルーチンを呼び出すための分岐命令である.

jsr initQue     /* ラベル initQue が指し示すメモリアドレスについて,サブルーチン呼び出し */