68000アセンブラ
大学で使用した自作の資料を整理し,教育目的で公開しています. クリエイティブ・コモンズ BY NC SA ライセンスの下で提供しています.
** BSVC (68k エミュレータ) BSVC 以前のエミュレータがどのような動きをするか知らないので、 以下問題になると思われる部分を列挙する。 ・ サポートしていない命令 CHK, NBCD, SBCD ・ SP が0の時にスタックに値を積み込む命令 (SPの値を減らす命令) を行うと、 「CPU Halted」となり、失敗する。 ex1.) MOVEM.L %D0,-(%SP) ex2.) JSR SUB_ROUTIN ・ 忠実にエミュレートするので、例外が発生しても、 ベクタテーブルを参照して、実行を続けようとする。 アドレスエラーやバスエラーが起こっても、ハンドラを用意して いないと気付かない。 ・ stop #0 ではうまく止まらない BSVC では、OP CODE 4848 という命令を持っていて、 BSVC のブレークポインタ設定相当になっている。 .dc.w 0x4848 /* BSVC の break 相当 */ のように書くと、その場所で止まってくれる。 * 開発において注意べき点 ** リンカによる再配置と 擬似命令 .org について m68k-as は、デフォルトでは、リンカによって text セクション は 0x0000 data セクション は text の後ろ bss セクション は data の後ろ に配置されるように、ldscript で調整されている。これを変更するには、 m68k-as -t 400 file.s で、リンカの text セクション開始位置を変更する。 ただし、-t 400 としたのと、アセンブラソース中で .org 0x400 としたのでは、意味が違う。 前者は、リンカが 0x400 から text を配置するが、 後者は、リンカが 0x000 から text を配置して、 0x400 までの間を 0 で埋める。したがって、後者は、 .abs のサイズが大きくなる上にベクトル領域を全部 0 で埋めてしまうことになる。 また、-t 400 と .org 0x400 で、アセンブラとリンカの両方に指定すると、 リンカが 0x400 から text を配置し、0x800 までの間を 0 で埋めることになる。 つまり、.org は、リンカが配置した場所からの相対位置までを 0 パディング するという命令である。 従って、 1. アセンブラで .org 0x400 を書いて、m68k-as file.s とする。 2. アセンブラで .org は書かないで、m68k-as -t 400 file.s とする。 のいずれかにしないと混乱する。モニタの作成等は、.abs サイズとベクトル領域の 問題を考えて、2. を使う方が望ましい。 ** .bss vs .section .bss セクションを指定する擬似命令 .bss, .data, .text というのがあって、 .section .text と書く代わりに、.text とだけ書いてもよい。 しかし .section .text の方を推奨する。 なぜなら、coff バイナリ形式では、text, data, bss 以外にも自由に セクションを追加できる。マルチタスクカーネルの作成時には、 .vector セクションを使って、vector 領域にコードを置けるように なっている。この際、同じ調子で .vector と書くとエラーになるので、 .section 形式に統一した方が混乱が起こりにくいからである。