書き込みから1,8086アセンブラソースプロセスが実行されます
デバッグモードによる書き込みとデバッグアセンブリプログラムに、以前紹介しました。しかし、綿密な調査で、書かれたアセンブラはより複雑になり、デバッグコマンドによるAアセンブリ命令は非常に非効率的で書き込むように一つずつ。
したがって、我々はテキストの方法により、アセンブラを書くことができる、との一連の措置を通じて、最終的なバイナリ実行可能プログラムに変換されるように、ソースコードのコンパイル8086の概念を導入することが起こっています。
実行するための書き込みからソースコードのコンパイルにはいくつかの段階に分けることができます。
アセンブラソースの形で書き込みテキストに1.開発
2.アセンブラソースコードがコンパイルおよびターゲット・ファイルは、ターゲット・ファイル・リンクを生成し、実行可能ファイルを生成します
3.実行可能ファイルを実行します
ここでは簡単な例は、(masm5ウィンドウは、実施例において、システムの動作環境)について詳細に説明します。
アセンブラ・ソースの調製
次のようにシステムを介してテキスト形式でメモ帳が付属していたり、より高度なテキストエディタ、アセンブラソースは、demo.asmという名前になります書かれ、プログラムが読み取ります。
引き受けるCS:codesg codesgセグメント のMOV AX、0123Hの MOV BX、0456H 追加 AX、BX 追加 AX、AXの 楽章AX、4c00H INT 21H;割り込み出口プログラム codesgの端部 終了
コンパイルするソースコード、リンクの2コンパイル
コンパイルします。
実行MASM.EXEへのコマンドラインを通じて、ローカルファイルアドレスアセンブラソースファイルは、ユーザー入力の必要がコンパイルされるようにしましょう(ソース・ファイル名を :)。ファイルには、そうでなければ、絶対ロケーションパスを入力する必要があり、現在の作業ディレクトリでのみ(例えばdemo.asm用)ファイル名を入力することができた場合(例:c:\ MASM \ ASM \ demo.asm) 。また、もし.txtファイルのクラスは、あなたが完全な名前を入力する必要がある場合は、[.ASM]と呼ばれるデフォルトのソースファイルのサフィックスの拡張(例えば、C:\ MASM \ ASM \ demo.txt) 。
次は、格納されたパスの名前(.OBJオブジェクトファイルを生成したオブジェクトファイル名のユーザ入力される 。)、例えば、C:\ MASM \ ASM \ demo.obj 。クロスリファレンスMASMは、コンパイラはあなたが入力した直接スキップすることができ、結果のコンパイル時に中間ファイルを生成することができますソースは後ろにリストアップして、コンパイラが生成することはできません。
エラーログ(0エラー)が表示されない場合は、オブジェクトのファイル名を指定したパスで生成された目的のファイルを見つけることができます。
リンク:
LINK.EXEは、ユーザーのニーズが(オブジェクトモジュールリンクされたオブジェクトファイルを入力するようにしましょう、コマンドラインから実行:例えばC:\ MASM \ ASM \ demo.obj) 。絶対パス/相対パスとファイルルール一貫して使用し、完全な名前をMASM.EXEをコンパイル。
次に入力するストレージ・パス名とユーザーのニーズに生成.exe実行ファイル(実行ファイル :)、たとえば、c:\ MASM \ ASM \ demo.exe 。戻るリストファイルとライブラリを指定し、OBJファイルとリンクがライブラリプログラムをサブルーチンに使用し、ここでプログラムは、スキップしてEnterを選択し、使用する必要はありません非常に簡単ですので、。
不測の事態がなければ、demo.exe実行可能ファイルが指定した場所に表示されます。(NOスタックセグメントの警告(エラーではなく)プログラムは、セグメントを積み重ねていない、これは悪い習慣ですが、ここでは一時的に無視されます)
3.実行可能ファイルを実行します
コマンドラインウィンドウには何の効果も見つけません、demo.exeを実行します。私たちのプログラムは、CPUレジスタの唯一の簡単な操作であるため、これは、すぐに実行後のプログラムが終わり、そして永続的ではありません。
この実行はすぐに終了し、アセンブラから出るためには、中央に実装プロセスを理解するためにDEBUG.EXEでデバッグすることができます。
あなたが(:デバッグC:\ MASM \ ASM \ DEMO.EXEなど)の実行可能ファイルをデバッグすることができ、パラメータとして、実行可能ファイルのパスを実行するためにdebugコマンドを使用します。スクリーンショットから分かるUの逆コンパイル命令、ソーステキストは、バイナリ実行可能プログラムへの正確な変換です。
2,8086アセンブラソース構文の説明
アセンブラ・ソース・プログラム・コンテンツは、大きく二つのタイプに分けることができ、一つの命令に対応する機械実行可能な命令である(例えば:MOV AX、0123Hの追加AX、 BX 、等)、他方はディレクティブは(例えば:codesgセグメント)。
伪指令和可执行指令的区别在于,可执行指令是和CPU的硬件挂钩的,会被汇编器转换为对应的机器指令;而伪指令的作用是为了控制编译过程而存在的,其仅由汇编器处理,没有对应的机器指令,不会被CPU执行。
assume cs:codesg codesg segment mov ax,0123H mov bx,0456H add ax,bx add ax,ax mov ax,4c00H int 21H ;中断退出程序
codesg ends
end
以前面的源程序举例分析:一个好的源程序需要具备基础的层次结构,而汇编源程序通过源程序层面上的段来进行层次划分的。可以在一个段中存放代码,数据或者将某一个段当作栈来使用,这也和前面介绍的CPU的几种类型的段寄存器对应。
因为程序是结构化的,所以要理解上面这段程序不能完全从上到下的进行理解,而是要进行有机的拆解:
首先,我们定义了一个段,名为codesg,段的程序界限由segment和ends这对关键字控制,也就是 codesg segment 。。。 codesg ends,在这两行语句中间的所有内容都属于这个段。codesg段是作为代码段来使用的,所以内容都是程序指令。
接着明确的告诉汇编器,将codesg作为程序段(cs)来使用,也就是第一行assume cs:codesg的意义,关键字为assume cs:。
最后指明程序的结束,也就是最后一行end关键字的作用。
这里segment 、ends、end等关键字构成的指令都是伪指令。
其它需要注意的点:
1. 8086汇编的注释是通过分号 ;来识别的,汇编器会将每一行分号后面的内容当作注释,自动忽略后面一整行的内容。
2. 在codesg的段内容中出现了一个前面没有出现过的指令int。int指令代表着中断(interrupt),由于当前程序是由DOS调用执行的,而mov ax,4c00H int 21H这两句指令就是通过中断结束当前程序并返回到DOS中。关于中断的内容会在后续的博客里做详细介绍。