-----
.h8300h
.section .text
.global _start
# .type _start,@function
_start:
mov.l #_stack,sp
jsr @_main

1:
bra 1b

-----

①スタック準備してmain呼び出す

_startはラベルで、アセンブラ内でラベルが利用されると、そのラベルが定義されている位置のアドレスに置換。

スタート・アップではまずスタック・ポインタの初期値の設定を実施。

C言語で関数呼び出しを行うと、スタックを利用するような実行コードをコンパイラが生成します。

このためスタック・ポインタを適切に設定してからでないと、C言語の関数呼び出しを正常に行うことができません。

jsr命令でmain関数呼び出ししていますから、その前に「mov.1」という命令で、スタック・ポインタの設定をしています。

ここでは「_stack」というシンボルが配置されているアドレスの値を「sp」というレジスタに代入しているのですが、spは実はER7と同義で、スタック・ポインタのことです。

ER7はスタック・ポインタとしての役割を持ちますが、スタック・ポインタの操作の際にER7と書いてはスタック・ポインタであることがわかりにくいため、spと記述することもできるようになっています。

「_stack」はリンカ・スクリプト中で、リンカ・スクリプトの内部で定義したスタック領域に配置されています。

このためスタック・ポインタは、スタック領域が配置された位置に初期化されることになります。


②無限ループ

「bra」は戻り先アドレスのスタックへの保存などを行わない、単純なジャンプです。

ここで問題なのはジャンプ先なのですが、「1b」というラベルはどこにもありません。アセンブラのソースコードを見ていると、「1f」「1b」「2f」などといった記述があります。

「1b」はそれは書かれた位置よりも前で「1:」という記述がある箇所で、最も近いものを指します。今回記述した例ならば、「1:」の表記がありますので、そこを指します。結果としては無限ループになります。

ただ、なんのために存在するのかはよくわからないなぁ!?