変数

C言語においての変数はメモリ上に予約された領域と、そこに付けられた名前で扱われます。(※メモリも参照のこと) アセンブラで変数を考えるときは、C言語でそれがグローバル変数にあたるかローカル変数にあたるかを考える必要があります。

グローバル変数

考え方: C言語と同じように、メモリ上に領域を予約します。

int cursor_x;

これをアセンブラで表現すると、以下のようになります(BSSセクションに書くこと。)

    .section bss
    .grobal cursor_x        ;; 全ファイルで cursor_x というラベルを使えるようにする
cursor_x:   .long   0       ;; ここで指定した初期値は無意味。

ローカル変数(簡単)

C言語でのローカル変数の実現方式にあたるものは用意されていないので、レジスタを使います。

void sample_function(void) {
  int x;

}

サブルーチンの中でレジスタを使うとき、そのレジスタの元の値は失われるので、push-pop命令を用いて退避します。

sample_subroutine:
    push.l  er0             ;; er0の元の値をスタックに退避

    ;; ここで er0 を変数 x として用いる。

    pop.l   er0             ;; er0の元の値をスタックから復元
    rts

ローカル変数(複雑)

自分で適当なレジスタをスタックポインタとして用いて、スタックマシンとしてローカル変数を作ります。

int i = 1;
char c = '\n';
    push.w  r6
    mov.w   r7,r6
    subs    #2,r7
    subs    #2,r7
    mov.w   #1,r2
    mov.w   r2,@(-4,r6)
    mov.b   #10,r2l
    mov.b   r2l,@(-1,r6)
    mov.w   r6,r7
    pop.w   r6
    rts

(h8300-hms-gcc に -S オプションを渡してコードを吐かせてみたもの。)