-----
.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:」の表記がありますので、そこを指します。結果としては無限ループになります。
ただ、なんのために存在するのかはよくわからないなぁ!?
.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:」の表記がありますので、そこを指します。結果としては無限ループになります。
ただ、なんのために存在するのかはよくわからないなぁ!?