こんにちは、アセンブラ

ものすごくシンプルですが、一応開発環境を作ったつもりなので、動作確認を兼ねて、
アセンブラによるプログラムの基本を復習してみます。

こういうときは、昔から「Hello, world.を表示する」というのが定番です。

テイストエディタでソースコードを書く

いまどきの開発環境というと、ワークスペースを起動し、新規プロジェクトを作ると
プログラムの雛形が自動的に用意されるのが主流ですが、ここでは、そんな高度なものは使いません。

まず、先ほど作った作業フォルダ(develop)がカレントディレクトリになっていることを確認し、
テキストエディタ ED.X を使ってソースコードを書きます。

a>ed hello.s
-- ここから --
    .include doscall.mac
    .text
    .even
    pea     hello(pc)
    DOS     _PRINT
    addq.l  #4,sp
    DOS     _EXIT
hello:     .dc.b   'Hello, world.',$d,$a,0
-- ここまで --
ESC, Xで保存

これで、ソースファイルがフォルダに作成され、コマンドプロンプトに戻りました。
アセンブラ用プログラムのソースファイル(以下、ソースと略します)は、拡張子を'.s'にします。

アセンブル、リンク、実行

では、早速実行してみたいと思います。

まず、今書いたソースを拡張子が'.x'の実行ファイルにします。
そのためのプログラムが、環境構築の際にコピーしてきた、AS.XとLK.Xです。

AS.Xは、「アセンブラ」というツールで、ソースを解析し、
オブジェクトファイル(*.o)というものを生成します。
ソースに文法的な間違いがあれば、アセンブラが指摘してくれますので、
行番号をヒントにエディタを使って見直しをします。

LK.Xは、「リンカ」というツールで、オブジェクトファイルから実行可能ファイル(*.x)を合成します。
なぜ、このように2段階になっているかというのは、規模が大きいプログラムを書き始めるとわかりますが、
今の段階では、エディタで作った単一ソースをアセンブル、リンクして実行ファイルができれば満足です。

リンカが正常に処理できると、実行ファイル(helo.x)が作成されますので、
コマンドプロンプトから hello.x を実行してみますと、期待通りの表示が出ると思います。

これら一連の処理は開発中頻繁に行いますので、環境のところでバッチファイルを作りました。

A>asm hello
このように、拡張子を付けないで使います。

ソースの詳細

動作確認ができましたので、改めてソースコードの解釈をしてみます。

    .include doscall.mac
    .text
    .even

まず1行目ですが、これは、環境をつくるときにいっしょに保存しておいたマクロ定義ファイルです。
エディタでdoscall.macを開いてみるとわかりますが、Human68kというDOSが提供してくれるルーチンの
呼び出し手順が定義されています。

つづいて、.text, .even については、テキストセクションの宣言とロケーションカウンタの偶数化
ということをやっているのですが、これは決まり文句みたいなものです。

    pea     hello(pc)
    DOS     _PRINT
    addq.l  #4,sp

ソースの最後にhello:というラベルがありますが、pea hello(pc)は、
'hello'というラベルが指し示すアドレスをスタックにプッシュという動作命令です。
「スタックってなに?」という疑問もあろうかと思いますが、それはまた改めて説明しようと思います。

また、「(pc)ってなに?」という疑問も(ry。

DOS _PRINT は、DOSコールの呼び出しです。これは、スタックで渡した文字列を表示するルーチンです。

addq.l #4,sp は、さきほど pea命令でプッシュ操作を行った分、スタックを補正する処理です。
peaで積んだ文字列のアドレスは、68000CPUの場合32bitつまり4バイトですので、DOSコールが終わった時点で
速やかに(忘れないうちに)戻しておきます。

    DOS     _EXIT

これもDOSコールです。自分のプログラムを終了し、呼び出し元(今回はcommand.x)に制御を戻すために使います。

hello:     .dc.b   'Hello, world.',$d,$a,0

DOS _PRINTで渡した文字列を実際に定義しているところです。
文字列は、最後がNULL文字(文字コード 0)で終わるメモリ上で連続したアドレスに格納されている
任意の長さのバイトデータです。

このサンプルのように、文字の並びはシングルクォーテーションで囲い、
復帰(0x0D)、改行(0x0A)は、カンマで区切って数値を並べます。

なお、 .dc.b というのは、バイトサイズデータの並びであることを示す疑似命令です。
いろいろバリエーションはありますが、こういうときには、こう使います。

ライブラリアンとコンバータ

さて、これで実行ファイルを作る段取りは整ったのですが、ここまでの説明で使っていないツールが
2つあります。 LIB.XとCV.Xです。

LIB.Xは、ライブラリアンと呼ばれるプログラムで、プログラムが大規模になってきたときや、
以前作ったプログラムの一部を再利用するような開発をするときに重宝します。

CV.Xは、コンバータと言い、つまりは変換プログラムなのですが、試しに、

A> cv hello.x
としてみますと、同じフォルダに、「hello.r」というファイルが作成されます。

この、拡張子.Rのファイルも.Xと同様に、Human68kで実行可能なプログラムの一種です。
何が違うかというとファイルサイズが小さくなっていると思いますが、
.Rのファイルには、.Xファイルに入っているシンボルテーブルや再配置情報などが含まれません。
中身は真に自分が書いたアセンブリコードの変換結果のみとなっています。

余談ですが、この.Rファイルというのは、原則としてフルアセンブラで書かないと作れません。
また、アセンブラで書く上でアドレッシングに神経を使わないといけない、という制約があります。
つまり、68000プログラミングの上級者向けの課題になります。

管理人はX68000現役のころから、別にファイルサイズをケチりたいとかいう理由ではなく、
無駄のないコーディングを突き詰めていくと.Rファイルの境地に達するという、
何とも説明の難しい理由でアセンブラと付き合ってきました。
今でも反射的に(pc)とか書いてしまうあたりに、何やら因縁めいたものを感じるときがあります。


トップページへ

Copyright©2014 甘亀庵管理人

inserted by FC2 system