Keywords:MASM,TASM,ソース・プログラム,アセンブリ言語,インクルード・ファイル,オブジェクト,リンク,ライブラリ,拡張子,コーディング,MAPファイル
< copyright 1994 相沢一石 >トップに戻る
クロス・リファレンス
プログラム中で利用されている変数名やラベル名,サブルーチン名などの名前の一覧表に,それぞれが定義されている場所のアドレスおよびそれらが参照されている場所を示す表のことです.プログラムのデバッグや修正時に利用されます.トップに戻るORMASM トップに戻る拡張子(エクステント)
MS-DOSなどのパソコンのOSでは,ファイル名は最大8バイトのファイル名本体と3バイトの拡張子(またはエクステントと呼ばれる)により構成されています. この拡張子によってCOM,EXEは実行可能なプログラム・ファイルに,またASMはアセンブラのソース・プログラム・ファイルといったようにファイルの種別が区分されます.トップに戻るORMASM トップに戻るCOM型式
8086CPUにおいて,コード,データ,スタックの各セグメントが同一の物理セグメントに配置されたコンパクトなプログラムをCOM型といいます.プログラムを実行するためメモリにプログラムが展開されるときに,DOSによってリロケータブルな変数にするというアドレス変換の必要がありません.したがって,デバイス・ドライバや高級言語からアセンブラのサブルーチンを記述する型式として利用されています.トップに戻るORMASM トップに戻るEXE型式
MS-DOSの一般的な実行型式のプログラム・ファイル型式です.データ,コード,スタックの各セグメントが独立に設定でき,8086系プログラムの本来のプログラム型式です.トップに戻るORMASM トップに戻るTASM
ボーランド社の8086系CPUのためのアセンブラをTASMといいます.MASMと違って,各種のメモリ・モデルの設定はTASMが行うコンパイラ感覚で利用することができる独自のモードをもっています.なお,MASMとの互換モードももっています.TASMは,ボーランド社のTurbo Pascal,C++などの製品に付属しています.トップに戻るORMASM トップに戻るソース・プログラム
プログラミング言語の文法に沿って記述されたものをソース・プログラムといいます.アセンブラが処理の対象とするのはアセンブリ言語で書かれたソース・プログラムです. 一般にソース・プログラムは1本だけでなく,別ファイルとしておくこともあり,それをインクルード・ファイルとして読み込む方法があります.トップに戻るORMASM トップに戻るオブジェクト
MASMでいうオブジェクトは,ソース・プログラムをアセンブルして得られるプログラム・ファイルです.デフォルトで .OBJの拡張子をもちます.このオブジェクト・ファイルをリンカのLINKなどでリンクして実行可能なEXEファイルを作成します.トップに戻るORMASM トップに戻るデフォルト
プログラムあるいはシステムの処理の条件をオペレータやプログラマなどに要求されている場合,それらの要求に応えない場合に暗黙の処理の条件または選択肢のことをデフォルトといいます.常に,プログラミングの中でデフォルト値がどのようなものか検討しておく必要があります. 微笑んで応えてくれない場合どうなるのでしょうか,ときには思いがけない結果を招くことがあります.トップに戻るORMASM トップに戻るMAPファイル
リンカが各モジュールの結合を行って実行ファイルを作成したとき,各変数,ラベルのアドレスが決まります.これらのシンボルの一覧のファイルがMAPファイルで,MAPという拡張子をもちます. MAPファイルは,リンク時にLINKというコマンドに /Mというオプションを指定することによって作成されます.トップに戻るORMASM トップに戻るライブラリ
ある目的の機能を実現するためのプログラムを集めたファイルをライブラリといいます.コンパイラなどでは,入出力処理,ファイル処理などの通常必要な処理ルーチンは標準ライブラリとしてあらかじめ用意されています.MASMのシステムでプログラミングする場合は,自由に独自のライブラリを作ることができます.このライブラリの管理のためのライブラリ・マネージャLIBが用意されています.トップに戻るORMASM トップに戻るコーディング
ソース・プログラムを作成することをコーディングといいます.もとはプログラムを作ることを指していましたが,最近ではプログラム仕様書にしたがって,処理の内容をプログラムの命令に置き換える作業を示すことが多いようです.すなわち,プログラミングより単純な作業を意味します.トップに戻るORMASM トップに戻るアセンブリ言語
アセンブラで具体的なプログラムを記述するための言語をアセンブリ言語と呼びます.正確にいうとアセンブラでソース・プログラムを書くのではなく,アセンブリ言語を用いてアセンブラが処理するソース・プログラムを書くということになります.トップに戻るORMASM トップに戻るインクルード・ファイル
MASMは,ソース・プログラムの中でほかのソース・プログラムを読み込み,その読み込まれたソース・プログラムも合わせてアセンブルすることができます.このようにほかから読み込まれるソース・プログラムのことをインクルード・ファイルと呼びます. マクロ命令を定義したソース・プログラムをライブラリとしてあらかじめ作成しておき,インクルード・ファイルとして処理するといったようなさまざまな使い方ができます.トップに戻るORMASM トップに戻るリンカ
MASMでアセンブルされたオブジェクトを,実行型式のオブジェクトにする処理をリンクまたはリンケージと呼びます.MASMのシステムではLINKというプログラムが使用されます.リンカは複数のオブジェクト・モジュールからなるライブラリから必要なオブジェクトを選択して結合し,実行型式のファイルを作る機能が本来の機能です. LINKが行うリンク処理はプログラム作成時に行う処理ですが,最近はWindows,OS/2などのように,実行時に必要なオブジェクト・モジュールの結合を行うシステムもありますトップに戻るORMASM トップに戻るKeywords:MASM,整数,実数,配列,文字列,レコード,浮動小数点,2進化10進データ,BYTE,DB,ダブル・ワード・データ,BCD
< copyright 1994 相沢一石 >
ダブル・ワード・データ
二つのワード・データで構成されるデータの型をダブル・ワード・データといいます.これは,連続した4バイトとはなりません.セグメントとオフセットの二つのワード・データを必要とするセグメント間の参照や分岐命令などで利用されます.0から4,294,967,295の整数データとしての取り扱いも行われます.トップに戻るORデータの型 トップに戻る文字列
文字列は,バイト・データが一かたまりとなった配列とみなすことができます.パソコンのシステムでは文字列の終端コードを示す方法や文字列の長さを示す方法などを採用することによって,可変長の文字列が利用されます.それに対し,汎用コンピュータの場合,多くは文字列を固定長のデータとして取り扱うため,ダウン・ロード/アップ・ロードのときには注意が必要です. 終端コードとしてはNULLと $ がよく使われます.トップに戻るORデータの型 トップに戻る数値データ
パソコンでは数値データとして整数,整数定数,整数変数,符号付き整数,浮動小数点データのほかに2進化10進データなどが処理の対象になります.そのほかに汎用コンピュータで一般的に利用されているパック形式のデータがありますが,データの配置および符号の付け方が異なっていて直接処理できません.そのため,個別に変換の処理プログラムを作る必要があります.ダウン・サイジングの時代になって,汎用システムとの間でのデータ変換が重要な問題となっています.トップに戻るORデータの型 トップに戻るバイト・データ,ワード・データ
型の名BYTEで定義される1バイト(8ビット)の大きさをもつものをバイト・データといいます.また,WORDで定義される1ワード(16ビット)の大きさをもつものをワード・データといいます.MASM 6.0以前では,BYTEは型名の指定としてDBのディレクティブでデータの定義を行っており,BYTE,DBは異なったディレクティブとして機能していました.MASMではこの区別がなくなり,DBの代わりにBYTEのディレクティブでバイト・データの定義も行えるようになりました.トップに戻るORデータの型 トップに戻る配列
MASMのアセンブリ言語でいう配列とは,固定長の変数が連続して存在するものを指しています.配列の要素はさまざまな整数となり,任意の要素にアクセスすることができます.これらの配列の要素へのアクセスには,間接アドレッシングの各種モードが用意されています.トップに戻るORデータの型 トップに戻る2進化10進データ
10進数を2進数で表現するデータ形式で,BCD(Binary Code Decimal)とも呼び,丸めの誤差が生じないで大きな数値の計算が可能な数値データです.8086系の数値演算用のコプロセッサX87シリーズもBCDデータの処理ができます. BCDデータは,4ビットで0から9までのデータを表します.したがって,9+1で10になるとき,桁の繰り上げの処理が必要になります.そのために,アスキ補正命令と演算後の補正を行う命令が用意されています.BCDにはパックBCD,アンパックBCDがあります.トップに戻るORデータの型 トップに戻るKeywords:マクロ定義,マクロトレーラ,マクロ展開,シンボル
< copyright 1994 相沢一石 >
マクロ定義
マクロ定義とは,マクロ命令をソース・プログラムの中で定義することで,ここで定義されたマクロ命令はソース・プログラムのコーディング時に新たな命令として利用できます.マクロ定義は,次のように「マクロ名 マクロヘッダ 仮引数」で構成される先頭行,次に続くマクロ本体,マクロ定義の終わりを示すマクロトレーラ部(ENDM)よりなります. 仮引数は,マクロ本体の一部を変更するためのパラメータとして利用されます.パラメータは変数,ラベルなどのシンボルのほかにレジスタ名,命令のニモニックなども利用できます.具体的にはマクロ展開時にマクロ名の後の実引数に仮引数を置き換えて展開されます. マクロ名はソース・プログラム中で使用される以前に定義されている必要があります.通常は,ソース・プログラムの先頭,またはマクロ定義だけのソース・プログラムをマクロライブラリ・ファイルとして作成し,アセンブルに先立って読み取って利用します.マクロ展開
ソース・プログラムの中のマクロ名がアセンブル時にアセンブラによって定義された命令群に展開されることをマクロ展開といいます.このとき,パラメータが付加されていると,マクロ命令の定義の中のパラメータに相当する部分の文字列は,具体的にパラメータとして設定された文字列と置き換わります.ローカル・シンボルの設定も行えるので,ラベルの処理でラベル名の付け方に苦労することも少なくなります.トップに戻るORマクロ命令 トップに戻るシンボル
アセンブラのソース・プログラムの中でメモリの位置,データの値を示すために利用される名前をシンボルといいます.シンボル定数,変数,ラベルなどがあります.命名法が決められていて,MASMではシンボルに日本語の表記が使えません.◎シンボル名は,次に示す英字,数字,特殊キャラクタを使用できる. |
A〜Z,a〜z,0〜9 ? @ _$ : .[ ]( )<>{ }+ − * / & % ! '- | ¥ = # ^ ; , ' " |
◎組み合わせるうえでの制約 |
|
Keywords:セグメント,コード,スタック,インデックス,ベース,オフセット,ディスプレイスメント,直接アドレッシング,間接アドレッシング
< copyright 1994 相沢一石 >
直接アドレッシング
対象とするレジスタやメモリのアドレスを直接命令のオペランドで指定するアドレスの指定方法です.オペランドで示されたレジスタやメモリの内容が命令の処理の対象になります.直接アドレッシングの場合,オペランドで示されるメモリまたはレジスタが処理の対象ですので,プログラムが何を対象としているのかがわかりやすいプログラムになります.しかし,処理の対象がコーディング時に決定してしまうため,実行時に状況に応じて処理対象を変えるような処理はできません.トップに戻るORアドレッシング トップに戻る間接アドレッシング
間接アドレッシングは,レジスタなどに実際に処理の対象となるメモリのアドレスを設定しておいて,そのレジスタを指示することで間接的に処理の対象を示すアドレッシングの方法です.この方法は,プログラムの実行時に処理の対象を変えることができるので,テーブルの検索,レコードの処理などのデータ処理に必須な機能です. また,8086系CPUはベース・レジスタを使うベース・モード,インデックス・レジスタを使うインデックス・モード,ベース・インデックス・モードなど多様なモードのアドレッシングのモードをもっています.これらは,レジスタで示される値以外にディスプレイスメントによって修飾され多様な広がりをもっています.アドレッシング方法 | 表記 | 操作 | デフォルト時 のセグメント |
---|---|---|---|
ベース・インデックス ・アドレッシング |
[BX][SI] [BX][DI] |
[BX]+[SI]+D8(OR D16) [BX]+[DI]+D8(OR D16) |
DS |
[BP][SI] | [BP]+[SI]+D8(OR D16) | SS | |
[BP][DI] | [BP]+[DI]+D8(OR D16) | ||
インデックス ・アドレッシング |
[SI] [DI] |
[SI]+D8(OR D16) [DI]+D8(OR D16) |
DS |
ベース・アドレッシング | [BX] | [BX]+D8(OR D16) | |
[BP] | [BP]+D8(OR D16) | SS |
セグメント
8086系CPUで利用されているメモリを指定する方法の一つにセグメントというものがあります.メモリ空間を,16ビットで64Kバイトの範囲を一つのセグメントとしてデータや命令コードを格納するエリアとして設定します.このセグメントの指定はセグメント・レジスタによって行います.また,セグメント内のアドレスはIP(インストラクション・ポインタ),インデックス,オフセット・アドレスなどによるアドレス指定により定められます.トップに戻るORアドレッシング トップに戻るセグメント・アドレッシング
セグメント・レジスタで示される16ビットのアドレスを4ビット左にシフトして20ビットのセグメント・アドレスを作成し,このセグメントの開始アドレスに16ビットのオフセット・アドレスを加算して20ビットの物理アドレス(実効アドレス)が作られ,このアドレスが物理アドレスとして実際のメモリへのアクセスが行われます.各セグメントに対応した専用のセグメント・レジスタが用意されています.具体的には,CSレジスタ,SSレジスタ,DSレジスタ,ESレジスタです.トップに戻るORアドレッシング トップに戻るエクストラ・セグメント・レジスタ(ESレジスタ)
データ・セグメント以外にデータを扱うためにエクストラ・セグメントが用意されています.このエクストラ・セグメントの開始アドレスをセットするセグメント・レジスタのことです.トップに戻るORアドレッシング トップに戻るべース・レジスタ
BX,BPのレジスタのことをベース・レジスタといい,ベース・モードの間接アドレッシングでメモリ中のデータ構造の先頭をこのレジスタで示し,ディスプレイスメントでデータ構造中のデータをアクセスするときなどに利用されます.デフォルト時にはBXはデータ・セグメント,BPはスタック・セグメントのデータが対象となります.トップに戻るORアドレッシング トップに戻るインデックス・レジスタ
インデックス・レジスタは,文字列処理などで元データのアドレスをSI(ソース・インデックス・レジスタ)で指定し,相手先のデータのアドレスをDI(デスティネーション・インデックス・レジスタ)で示す機能が付加されています.このほかに,16ビット汎用レジスタとして演算,間接アドレッシングなどに利用されます.トップに戻るORアドレッシング トップに戻るディスプレイスメント
実効アドレスに加算される定数値,8ビット,16ビットの値で正負の値をもち,実効アドレスの前後のメモリ・エリアを指定することができます.テーブル,配列,多次元配列の開始アドレスの指定などに利用されます.トップに戻るORアドレッシング トップに戻るオフセット
実際のメモリ上のデータは,セグメントの開始アドレスとそのセグメントの先頭からの距離を示すオフセットの値の二つで示されます.そして,このセグメント・アドレスとオフセットを加算して得られた物理アドレスでメモリ上のデータにアクセスします.このオフセットを示す方法として,直接アドレッシング,間接アドレッシングなどの多様なアドレス指定の方法が用意されています. 実際にアセンブラのプログラムを書くときには,ラベルを使えるので,コーディングするプログラマは先頭からの距離を意識する必要はありません.トップに戻るORアドレッシング トップに戻るラベル
MASMでは,ラベルはプログラムの分岐先や処理の入口などのコード・セグメント内の実行可能な命令の場所を示します.ラベルにはほかの異なったセグメントから参照されるFAR属性と同一のセグメント内から参照されるNEAR属性の二種類あります.FARでセグメントとオフセット,NEARではオフセットの値が参照の対照になります. そのほかに,コンピュータに関連する用法としては,ディスクやテープのなどの媒体の名前を示すなど,識別するための「表示」または「名札」という意味もあります.トップに戻るORアドレッシング トップに戻るコード・セグメント・レジスタ(CSレジスタ)
命令コードを取り扱うコード・セグメントの開始アドレスを設定するレジスタです.このレジスタの取り扱いはジャンプ,コール命令など分岐命令によって変更されます.トップに戻るORアドレッシング トップに戻るスタック・セグメント・レジスタ(SSレジスタ)
スタック・セグメントの開始アドレスが設定されるレジスタです.スタックはこのスタック・セグメントでしか機能しません.スタック・セグメントは,コール命令の戻り番地を保存したり,サブルーチン処理時のレジスタの退避などに利用されます.このスタックの指定はSP(スタック・ポインタ)レジスタによって行われます.トップに戻るORアドレッシング トップに戻るデータ・セグメント・レジスタ(DSレジスタ)
コンピュータで扱うデータというのは,このデータ・セグメント・レジスタによって示されるデータ・セグメント内に保存されており,逐次処理されます.データ・セグメントは最大64Kバイトのエリアなので,64Kバイト以上のデータを取り扱う場合は複数のデータ・セグメントを設定し,対象となるデータ・セグメントの開始アドレスを順次このデータ・セグメント・レジスタに設定して対象となるデータの処理を行います.トップに戻るORアドレッシング トップに戻るKeywords:機械語,ストリング命令,リピート・プリフィックス,カウンタ,ディレクティブ,ASSUME,SEGMENT,END,DB
< copyright 1994 相沢一石 >トップに戻るORニモニック トップに戻る
機械語
0と1の2進数で表現されていて,コンピュータが理解できる言語を機械語(マシン語ともいう)といいます.ただし,機械語を表す際は人間にもわかりやすいように16進数で表現します.アセンブリ言語や高級言語を実行形式にした最終結果で,この機械語に変換されて初めてCPUはプログラムを読み取り解釈可能になります.トップに戻るORニモニック トップに戻るストリング命令
リピート・プリフィックスのすぐ後ろに書いてストリングを操作します.ストリングは,一般的な文字列の定義だけでなく,バイト,ワード,386のダブル・ワードなどの単なるバイト列の意味でも使用します.ストリング操作としては転送,比較,検索などがあります.このときカウンタと共に使います.トップに戻るORニモニック トップに戻るカウンタ
ストリング命令,所定の回数命令を繰り返すREPプリフィックス命令で,繰り返す回数を指定するのにCXレジスタがカウンタとして利用されます.トップに戻るORニモニック トップに戻るリピート・プリフィックス
ストリング命令と組み合わせて使用します.CXレジスタを調べて0のときはループから抜け,ストリング命令を1回実行するとCXレジスタの値が−1されます.比較,検索のときは比較,検索結果によってループを抜け出す機能が付加された命令も利用できます.トップに戻るORニモニック トップに戻るディレクティブ(疑似命令)
ソース・プログラムに記述しますがCPUが実行する命令ではなく,アセンブラに対する指令です.例えば,アセンブルの条件などをアセンブラに指示するもので,CPUに対する命令とは異なりオブジェクトには変換されません.セグメントの指定,変数の定義,手続きの定義などを分担します.ASSUME,SEGMENT,END,DBなどのディレクティブがその例ですトップに戻るORニモニック トップに戻るASSUME
ASSUMEでセグメント名を各セグメント・レジスタに対応付けます.この対応付けにより,ソース・プログラムの命令やデータはそれぞれ所定のセグメントに割り当てられます.トップに戻るORニモニック トップに戻るEND
ソース・プログラムの終了を示すディレクティブです.ENDの後にラベル名のオプションを設定してプログラムの実行開始位置を指定することもできます.トップに戻るORニモニック トップに戻るSEGMENT
プログラム・リストの中で,SEGMENTからENDSまでの間がセグメントとして定義されます.SEGMENTに続くオプションを指定することで,セグメントの結合のための属性などを知らせる情報がアセンブラやリンカに伝えられます.各セグメントの指定は,このSEGMENT,ASSUMEなどのディレクティブを使用します.その他に,簡略化セグメントを用いてあらかじめ設定されたメモリ・モデルで各セグメントの用法を指定することもできます.トップに戻るORニモニック トップに戻るKeywords:デバッガ,トレース,シンボリック・デバッガ,逆アセンブル
< copyright 1994 相沢一石 >トップに戻るORデバッグ トップに戻る
シンボリック・デバッガ
デバッグ時にラベル,変数名が使用できるデバッガをシンボリック・デバッガ(SYMDEB.EXE)といいます. デバッグ時にソース・プログラム中でグローバル宣言をした変数やラベル名が利用できるため,実行途中の変数の確認,ブレーク・ポイントの設定などが容易に行えるほか,DEBUG.EXE機能が強化されているので,デバッグが効率よく行えます. シンボルを利用するためにはシンボル・ファイルが必要となります.このシンボル・ファイルは .SYMの拡張子をもち .MAPファイルから作成されます.デバッガ
デバッガは,プログラム作成の支援をするためのユーティリティ・プログラムで,プログラムが意図通りの処理となっているかを確認するための機能が用意されています.特にMS-DOSに付属しているデバッガ(DEBUG.EXE)やシンボリック・デバッガ(SYMDEB.EXE)は,アセンブラのプログラムのデバッグを対象としていますので,具体的な対象のCPUの機械語の命令を1ステップずつ実行し,その結果を確認する機能(トレース)も用意されています. また,メモリ中のデータの変更,レジスタの内容の確認,変更,逆アセンブルなどが行えます.トップに戻るORデバッグ トップに戻るトレース
プログラムのバグのある範囲が絞られてくると,ブレーク・ポイントを設定してそれからあとの命令を1命令ずつ実行して確認します.この命令は,1命令を実行するごとに各レジスタの実行結果の値を表示して停止します.それぞれの実行結果を表示しながら指定した命令の数だけ実行し,一時停止したり逆アセンブルしたりすることができます.トップに戻るORデバッグ トップに戻る逆アセンブル
メモリ中の命令コードをアセンブラのニモニックにもどすことを逆アセンブルするといいます.プログラム・トレース時などにメモリ中のプログラム・コードを命令のニモニックとして確認するために必要です. トップに戻るORデバッグ トップに戻る