アセンブラで間違いやすいところ
アセンブラのプログラムは、ちょっとした間違いがあってもうまく動作しないことがあります。表示がおかしいというような場合ならばまだしも、ハングアップや暴走になってしまうと、原因の追求も難しくなります。
ハングアップ(キー入力を何も受け付けず、コンピュータが停止したようになってしまう現象)は多くの場合、プログラムが無限ループに陥っていることが原因です。このような場合は、オプション/ZIでデバッグ用にアセンブルし、デバッグオプション/Aを付けてLID上で実行してみると、プログラムのどの部分でループしているのか知ることができます。
もっと悪い場合は、プログラムが暴走することもあります。これは、本当はコードでない部分をCPUが実行している状態で、何が起こるかまったくわかりません。画面が突然おかしな文字で一杯になったりするのは、暴走している証拠です。また、まず起こらないことではありますが、原理的にはディスクドライブなどのハードウエアを壊してしまう可能性もあります。
以下は、アセンブラのプログラムで間違いが起きやすいと思われる部分です。
- .386/.486/.586文を使用しているときは、通常SEGMENT文にUSE16が必要です。
- BPやEBPをインデクスレジスタに使用すると、デフォルトのセグメントレジスタは(DSではなく)SSになります。
- グループを使用している場合、OFFSET演算子に「<グループ名>:」というオーバーライドが必要なことがあります。
- INT命令で分岐したルーチンからは(RETではなく)IRETで帰還します。
- PUSHとPOPがきちんと対応していないと、暴走の原因になります。
- プロシージャの最後にリターン命令を忘れていませんか。
- CALL命令とRET命令のタイプ(NEAR or FAR)は合致していますか。
- 8086系のプロセッサはリトルエンディアンです。すなわち、複数バイトに渡る数値は小さい桁ほど低位のバイトに入ります。
- 32ビット間接ジャンプなどでは、メモリの値はオフセットが下位(先)、セグメントが上位(後)になります。
- ASSUME文の宣言と実際のセグメントレジスタの値に矛盾がないか確認してください。
[目次]