アセンブリの最終レビュー
第1章 アセンブリ言語の基礎知識
機械命令: CPU が直接認識して従うことができる命令は、オペコードとオペランドで構成されるバイナリ コードで表現され、コードにはバイナリの 0 または 1 のみが含まれます。
機械語: バイナリコードで記述された機械語命令の集合と、機械語命令を使用するための一連の規則
アセンブリ言語:機械命令内のオペレーションコードは英単語の略語(ニーモニック)で記述され、オペランドは記号、変数、定数で記述されます。
アセンブリ言語は記号言語です。アセンブリ言語ソース プログラムは、コンピュータで実行する前に機械語プログラムに変換する必要があります。この翻訳作業を「アセンブリ」と呼び、アセンブリのソースプログラムをオブジェクトプログラムに翻訳する言語処理プログラムをアセンブラと呼びます。
主要なアセンブリ言語の構成
アセンブリ言語は以下の3種類の命令で構成されています
- アセンブリ命令: 機械コードのニーモニックと、対応する機械コード。アセンブリ言語の核心です
- 疑似命令: 対応するマシンコードはありません。コンパイラによって実行され、コンピュータは実行しません。
- その他の記号: +、-、*、/ など、コンパイラーによって認識されます。対応するマシンコードはありません。
l 異なる桁上げ数え方で数字を書く場合、その数字がどの種類の桁上げ数え方であるかを示す文字が最後に使用されることがよくあります。末尾に B (2 進数)、O (8 進数)、D (10 進数)、H (16 進数) を使用します。デフォルトは 10 進数です。
10 進数から 2 進数への変換:
10 進法の小数部については、累乗法のほかに、2 を連続的に掛けて整数をカウントダウンし、結果が になるまで小数部を 2 倍する乗算も使用できます。 0.
- l すべての 10 進数を 2 進数で完全に表現できるわけではなく、必要に応じて特定の精度を選択できます。
10 進数を 16 進数に変換します:,
10進数の小数部については、累乗法のほかに、16を連続して掛け算して整数をカウントダウンし、結果が得られるまで小数部を16倍する乗算も使用できます。 0
- すべての 10 進数を 16 進数で完全に表現できるわけではなく、必要に応じて特定の精度を選択できます。
16 進数での乗算の例:
数値の補数の具体的な演算は次のとおりです。
-
正の数値は変化せず、負の数値は絶対値 + 1 で反転されます。
文字表現:
基本的な論理演算:
- 論理演算 ビット単位の演算
- AND演算 AND
- また
- 排他的論理和演算 XOR
- いいえ
第2章 コンピュータの基本原理
16 ビット構成の CPU には次のような構造上の特徴があります。
- データバスは16ビットです
- 演算ユニットは一度に最大 16 ビットのデータを処理できます
- レジスタの最大幅は 16 ビットです
- レジスタと演算ユニット間のパスは 16 ビットです
CPU によるメモリへの読み取りおよび書き込み操作
汎用データレジスタ
- 8086 CPU のすべてのレジスタは 16 ビットで、2 バイトを保存できます。AX、BX、CX、DX の 4 つのレジスタは、通常は一般データを格納するために使用され、場合によってはアドレスを格納することもでき、汎用データレジスタと呼ばれます。
- AX: 累積レジスタ。このレジスタは演算でよく使用され、一部の命令では必ず使用することが規定されています。
- BX: ベース アドレス レジスタ。データの保存に加えて、メモリの開始オフセット アドレスを保存するためによく使用されます。
- CX: カウンティング レジスタ。データの保存に加えて、繰り返し操作の回数を保存するためによく使用されます。
- DX: データレジスタ。データを保存するだけでなく、32 ビットデータの上位 16 ビットを保存することもあります
アドレスレジスタ
- 16 ビット 8086 プロセッサには 4 つの 16 ビット汎用アドレス レジスタがあります。それらの主な機能はデータのオフセット アドレスを保存することであり、データを保存することもできます。これら 4 つのレジスタを分割して使用することはできなくなりました
- SP: スタック ポインタ。スタックの先頭のオフセット アドレスを格納する特殊なレジスタです。
- BP: ベース アドレス ポインタ。メモリ内のデータのオフセット アドレスを格納するために使用できます。
- SI: ソース インデックス レジスタ。メモリ内のソース データ領域のオフセット アドレスを保存するためによく使用されます。いわゆるインデックス レジスタとは、特定の命令の動作の下でレジスタ内の値を自動的に増減できることを意味します。
- DI: デスティネーション インデックス レジスタ。メモリ内のデスティネーション データ領域のオフセット アドレスを格納するためによく使用され、特定の命令の動作下でその値を自動的にインクリメントまたはデクリメントできます。
セグメントレジスタ、
- 16 ビット 8086 プロセッサには、CS、SS、DS、および ES という名前の 4 つの 16 ビット セグメント レジスタがあります。4 つのセグメントのセグメント ベース アドレスを格納するために使用されます。
- CS: コード セグメント レジスタ。現在実行中のプログラム セグメントのセグメント ベース アドレスを格納するために使用されます。
- SS: スタック セグメント レジスタ。スタック セグメントのセグメント ベース アドレスを格納するために使用されます。
- DS: データ セグメント レジスタ。データ セグメントのベース アドレスを格納するために使用されます。
- ES: 追加のセグメント レジスタ。別のデータ セグメントのセグメント ベース アドレスを格納するために使用されます。
命令ポインタレジスタ
- IP: 実行する命令のオフセットアドレスを格納する命令ポインタレジスタ
- FLAGS: CPUの2種類のフラグを格納
- ステータス フラグ: オーバーフローがあるかどうか、キャリーがあるかどうかなど、プロセッサの現在の状態を反映します。
- ステータスフラグは 6 つあります: CF、PF、AF、ZF、SF、OF
- 制御フラグ: マスカブル割り込みに応答するかどうかなど、プロセッサの動作モードを制御するために使用されます。
- 3 つの制御フラグがあります: TF、IF、DF
8086CPUの動作プロセス
- CS:IP が指すメモリユニットから命令を読み取り、読み取られた命令は命令バッファに入力されます。
- IP = IP + 読み取り命令の長さ、つまり次の命令を指します
- コマンドを実行し、手順 1 に戻ってプロセスを繰り返します。
CS と IP の内容は、CPU によって実行される命令のアドレスを提供します。
スタック
- スタック領域は特別な記憶領域であり、その最後の単位をスタックの最下位と呼び、スタックの最下位からデータが格納され、最後に格納されたデータが位置する単位をスタックの最上位と呼びます。スタック領域が空の場合、スタックの上部と下部は一致します。スタック領域にデータを格納する場合は、1ワードずつワード単位で格納する必要があり、後から格納されるデータはスタックの下位アドレス単位に順番に配置されます。スタックポインタSPは毎回2ずつデクリメントされ、スタックポインタSPは現在のスタックトップの位置を指し、データアクセスは後入れ先出し方式を採用します。
さまざまな目的に応じて、インターフェイスのレジスタ ポートは次の 3 つのカテゴリに分類されます。
- データポート
- 制御ポート
- ステータスポート
CPUとI/Oインターフェースのポート間の情報伝達もデータバスを介して行われます。
第3章 アセンブリ言語プログラム例とコンピュータの操作
システムの作業プロセス
- 編集プログラムを使用してソースプログラムファイルを編集する
- アセンブラ (MASM) を使用して、ソース プログラム ファイル (.asm) をオブジェクト ファイル (.obj) にアセンブルします。
- リンカー (LINK) を使用して、オブジェクト ファイル (.obj) を実行可能ファイル (.EXE) にリンクします。
- デバッガー (DEBUG) を使用して、実行可能ファイルをデバッグします。
よく使用される DOS コマンド
- ディスク:; ドライブ文字を選択してください
- CD; ディレクトリを選択
- DIR; ディレクトリとファイルを表示します
- REN; ファイル名を変更する
- CLS; クリアスクリーン
- DEL; ファイルを削除する
- MD; ディレクトリを作成
- RD; ディレクトリを削除
- COPY; ファイルをコピー
- TYPE; テキストファイルの内容を表示します
- "; 出力リダイレクト演算子
- SET PATH; 実行可能ファイルの検索パスを設定または表示します
- HELP; コマンドの形式と使用法を表示します
Win7システムでアセンブリを実行する
- DosBox は Windows 環境上の Dos エミュレータであり、この環境上に Dos プログラムを配置して実行することができます。プロセスはマウントするもので、マウント コマンドは mount です。
キーポイント 2: よく使用されるいくつかの Dos システム関数呼び出し
-
割り込み番号 21H は、システム機能を呼び出すために Dos がユーザーに提供する割り込みで、ユーザーが選択して使用できる機能が 100 近くあり、主にデバイス管理、ディレクトリ管理、ファイル管理の 3 つの側面があります。
-
アセンブリ言語プログラミングでは、システムのさまざまな関数プログラムを使用する必要があります。
関数呼び出しの形式は通常、次の 4 つの手順に従います。
- AHレジスタにシステム関数コール番号を設定します。
- 指定されたレジスタにエントリパラメータを設定します
- INT 21H命令を実行し、割り込みサービスプログラムの関数呼び出しを実現します。
- 終了パラメータに基づいて関数呼び出しの実行を分析する
第4章 オペランドアドレッシングモード
コンピュータの命令はオペコードとオペランドで構成されます
- オペランド フィールドには、1 つ、2 つ、または 3 つを含めることができます。これらは、1 アドレス命令、2 アドレス命令、または 3 アドレス命令と呼ばれます。
- 2 アドレス命令の 2 つのオペランドは、それぞれソース オペランドとデスティネーション オペランドと呼ばれます。
- いわゆるアドレッシング モードは、命令内のオペランドを見つける方法です。
8086 アセンブリ言語命令の一般的な形式は次のとおりです: [ラベル:] 命令ニーモニック [オペランド] [; コメント]
- 【】内の内容は任意です
- ラベル: メモリ内の命令の位置を示すシンボリック アドレス
- コマンドニーモニック:コマンド機能の英語の略称であるコマンド名。
- オペランド: 命令によって演算されるデータ、またはデータが配置されているアドレス。レジスタ、定数、変数、式
- 注: 各行はセミコロン「;」で始まりますが、これはアセンブラによって処理されません。
即時アドレッシング モード: オペランドは命令内のオペコードの直後にあり、オペランドは命令の一部としてコード セグメントに格納されます。
- 実行中にメモリにアクセスして数値を取得する必要がないため、即時データと呼ばれます。
- 主にレジスタに初期値を割り当てるために使用されます
- 即値はソース オペランドとしてのみ使用でき、長さはデスティネーション オペランドと同じです。
レジスタ アドレッシング モード: オペランドはレジスタ内の値であり、レジスタ名は命令で指定されます。
- オフセットアドレスは実効アドレス(EA)にもなります
ダイレクト アドレッシング モード: オペランドの実効アドレス EA は命令内にあり、マシンのデフォルト セグメント アドレスは DS 内にあります。
- メモリ読み取り動作
- メモリ書き込み操作
- CPU のメモリ書き込み操作を実装したい場合は、MOV 命令のデスティネーション オペランドをストレージ ユニットに変更するだけでよく、ソース オペランドは CPU のレジスタになります。
- シンボリックアドレス
- ダイレクトアドレッシングモードでは、実効アドレスとして数値を使用するほかに、シンボリックアドレスも使用できます。ストレージ ユニットの名前 (シンボリック アドレス) を定義します。記憶装置を変数とみなした場合、名前も変数名になります
- セグメントプレフィックス
- メモリ関連アドレッシング モードでは、オペランドのセグメント アドレスはデフォルトでデータ セグメントになります。8086 では、データ セグメントに加えて、他の 3 つのセグメントにもデータを格納できると規定されています。オペランドが他のセグメントに格納されている場合、それはセグメント オーバーライドは、命令内でセグメント オーバーライド プレフィックスを使用して指定する必要があります。つまり、セグメント レジスタ名とコロンがオペランドの前に追加されます。
レジスタ間接アドレス指定モード: オペランドの実効アドレスはレジスタ内にあり、BX、BP、SI、DI レジスタのみが許可されます。
レジスタ相対アドレス指定モード: オペランドの実効アドレスはレジスタとディスプレイスメントの合計です。
ベースインデックスアドレッシングモード: オペランドの実効アドレスは、ベースレジスタとインデックスレジスタの内容の合計です。
- ベースレジスタBXおよびBP、インデックスレジスタSIおよびDI
- デフォルトのセグメントレジスタのコロケーションは、レジスタ間接アドレッシングモードと同じです。
相対ベース インデックス アドレッシング モード: オペランドの実効アドレスは、ベース レジスタ、インデックス レジスタ、およびディスプレースメントの合計です。
- ベースレジスタBXおよびBP、インデックスレジスタSIおよびDI
- デフォルトのセグメントレジスタのコロケーションは、レジスタ間接アドレッシングモードと同じです。
第 5 章 よく使用される命令
8086 アセンブリ言語命令の一般的な形式は次のとおりです: [ラベル] 命令ニーモニック [オペランド] [; コメント]
8086 命令システムは 5 つのグループに分類できます。
- データ転送コマンド
- 算術命令
- 論理命令とシフト命令
- 文字列操作命令
- プログラム転送命令
データ転送コマンド
-
一般的なデータ転送手順
-
MOV転送
-
ダブルオペランド命令の規則
-
-
スタックにPUSHする
-
スタックからPOPアウトする
-
XCHG交換
-
-
アキュムレータ固有の転送命令
このうち、I/O ポートは CPU と周辺機器の間でデータを送信するためのインターフェイスです。メモリには属さず、別個にアドレス指定されます。ポート アドレスの範囲は 0000 ~ FFFFH です。この命令群は 0000 ~ FFFFH に限定されます。 AX および AL アキュムレータ
-
IN; I/O ポートからの入力
-
OUT; I/O ポートへの出力
-
XLAT; エスケープコード (ルックアップテーブル)
-
-
アドレス転送コマンド
-
LEA 実効アドレス送信レジスタ命令
-
LDSポインタ送信レジスタとDS命令
-
レジスタへの LES ポインタと ES 命令
-
-
フラグレジスタ転送命令
-
算術命令
- 加算、減算、乗算、除算は、コンピュータが頻繁に実行する基本演算です。算術演算命令は、主に 2 進数 (および 10 進数) データに対する四則演算を実行します。
-
型拡張ディレクティブ
-
加算命令
-
ADD加算命令
-
キャリー加算命令付きADC
-
INCプラス1命令
-
-
減算命令
-
SUB減算命令
-
ボロー付きSBB減算命令
-
DEC マイナス 1 命令
-
NEG補完命令
NEG 命令は、X=0、CF=0、および CF=1 の場合にのみ、実際には数値 X の逆、つまり 0-X であることがわかります。その他の場合
-
CMP比較命令
-
CMP指令虽作减法,但不回送结果,只是产生标志位,为程序员比较两个数的大小提供判断依据
![typoraImage](https://img-blog.csdnimg.cn/img_convert/6593f4f7e4d20915c95a393c4d0f453c.png)
-
乗算命令
-
MUL符号なし乗算命令
-
IMUL符号付き乗算命令
乗算される 2 つの数値は同じ長さでなければなりません
SRC を即値にすることはできません
-
-
分割命令
-
DIV 符号なし除算命令
-
IDIV 符号付き数除算命令
-
BCDコードの小数点調整命令
-
上で紹介した算術演算命令はすべて 2 進数の演算ですが、コンピュータでは 10 進数の演算を容易にするために、2 進数の計算に 10 進数変調を加えて 10 進数の結果を直接取得するための 10 進数調整命令が用意されています。
-
BCD (コード 8421): 10 進数をバイナリ コードで表現します。
-
10 進数を BCD コードに変換します。
-
圧縮 BCD コード調整命令は主に 2 つあります。
-
DAA; 加算のための小数調整命令
-
DAS; 減算小数点調整命令
-
論理命令
-
AND;AND命令
-
または; または指示
-
NOT;非指示
-
XOR; 排他的論理和命令
-
TEST; テストコマンド
シフト命令
-
SHL; 論理左シフト
-
SAL; 算術左シフト
-
SHR; 論理右シフト
-
SAR; 算術右シフト
-
ROL; 左に回転
-
ROR; 右回転
-
RCL; キャリーで左回転
-
RCR; キャリーで右回転
-
算術シフト命令は符号付き数値演算に適しており、SAL は 2 の乗算に使用され、SAR は 2 で除算に使用されます。論理シフト命令は符号なし数値演算に適しており、SHL は 2 の乗算に使用され、SHR は除算に使用されます。 2
文字列操作命令
-
MOVS; シリアル転送
-
CMPS; 文字列比較
-
SCAS; 文字列スキャン
-
STOS; 文字列を格納する
-
LODS; 文字列からフェッチ
-
文字列操作命令はバイトまたはワードを毎回処理するため、データ列を処理するには文字列操作命令を繰り返し実行する必要があります。
- REP の機能: シリアル演算命令を CX=0 になるまで繰り返し実行し、シリアル演算命令を実行するたびに CX が自動的に 1 減算されます。
- REPE/REPZの機能:CX≠0かつZF=1の場合、CX=0またはZF=0になるまでシリアル演算命令を繰り返し実行し、シリアル演算命令を実行するたびにCXが自動的に1減算されます。
- REPNE/REPNZの機能: CX≠0かつZF=0の場合、文字列演算命令をCX=0またはZF=1になるまで繰り返し実行し、文字列演算命令を実行するたびにCXが自動的に1減算されます。
プログラム転送命令
無条件分岐命令
-
JMPジャンプ命令:命令で指定されたアドレスに無条件に転送してプログラムを実行します、転送先アドレスとジャンプ命令が同一コードセグメント内にある場合はセグメント内転送、そうでない場合はインター転送です。 -セグメント転送。ジャンプ命令で転送先のアドレスが直接指定されている場合は直接転送、指定されていない場合は間接転送となります。
-
セグメント内直接異動
-
セグメント内間接異動
-
セグメント間直接振替
-
セグメント間の間接転送
条件分岐命令
-
条件付き転送命令は、前の命令で設定されたフラグビットに基づいてテスト条件を判断し、プログラムの方向を決定します。通常、条件付き転送命令を使用する前に、フラグビットを生成できる先頭の命令が必要です。 CMP 命令として。アセンブリ命令フォーマットでは、転送アドレスはラベルで表され、すべての条件付き転送命令はフラグビットに影響を与えません。
-
単一の条件フラグの設定に基づいて分岐します。
-
CX レジスタの値が 0 であるかどうかをテストして分岐する
-
2 つの符号なし数値を比較し、結果に基づいて分岐します
-
2 つの符号付き数値を比較し、結果に基づいて分岐します
ループ命令
第6章 ディレクティブとソースプログラムの形式
アセンブリ言語プログラムのステートメント: 命令、ディレクティブ、マクロ命令
命令はプログラムの実行中にコンピュータの CPU によって実行されます。
疑似命令: 主にデータ変数とプログラム構造を定義するために使用されます。ディレクティブは、アセンブラによるソース プログラムのアセンブリ中にアセンブラによって処理される操作です。
プロセッサ選択擬似命令: アセンブラにどの命令システムを選択するかを指示します。デフォルトでは 8086 命令システムが選択されます。
仮定疑似命令は、特定のセグメントをどのセグメント レジスタに割り当てるかを指定するだけであり、セグメント アドレスをセグメント レジスタにロードすることはできません。そのため、コード セグメントでは、セグメント アドレスも対応するセグメント レジスタにロードする必要があります (通常は 2 つ)。 MOV 命令はこれを行いますが、コードセグメントがこれを行う必要はありません。プログラムの初期化時に行われます。
簡略化されたセクション定義ディレクティブ
プログラムの開始および終了ディレクティブ
ラベルと変数の違い
- 変数: 定義は通常、非コード セグメントにあります。これは、データがメモリに保存されるシンボリック アドレスです。プログラムの実行中にいつでも値を変更できるデータ オブジェクトです。メモリ内のデータ領域の名前。後ろにコロンのない識別子で構成されます。
- ラベル: この定義は通常、コード セグメントに表示され、メモリに格納されている命令の記号アドレスを示します。対応する値は組み立て時に自動的に計算されます。識別子とその後に続くコロンで構成されます
プログラムのデフォルトのデータは 10 進数です。データの最初の桁が数字でない場合は、先頭に 0 を追加し、負の数は補数コード形式で格納されます。文字列は「」で囲みます。「?」'ストレージ ユニットのみが割り当てられ、値は格納されないことを示します
式代入ディレクティブ「EQU」および「=」
- 代入疑似演算子を使用して、式に定数または名前を割り当てることができます。形式は次のとおりです。
- 式内の変数またはラベルは、最初に定義してから参照する必要があります
- EQU 擬似演算の式名では繰り返し定義が許可されていませんが、「=」擬似演算では繰り返し定義が許可されています。
プロシージャ定義ディレクティブ
- プロシージャは高級言語プログラムのサブルーチンに相当し、特定の機能を実行できる独立したコード モジュールであり、モジュラー プログラミングの基礎となります。8086 では、プロシージャを呼び出す命令は CALL、プロシージャから戻る命令は RET です。
- プロセス定義には、PROC と ENDP という 2 つの疑似命令が含まれています。PROC はプロセスの開始を示し、ENDP はプロセスの終了を示します。
- プロシージャ名は識別子であり、ラベルとして機能し、サブルーチン エントリのシンボリック アドレスです。
- プロシージャの属性は、FAR または NEAR タイプにすることができます。NEAR が近く、セグメント内コールです。FAR タイプは far (セグメント間の呼び出し) であり、デフォルトは NEAR です。
式内に複数の演算子が同時に存在する場合、演算子の優先順位に従って実行され、ソースプログラムをアセンブルする際、アセンブラは次の規則に従って式の値を計算します。
- 優先度の高い操作を先に実行する
- 同じ優先度の操作は左から右の順に実行されます
- 括弧を使用して操作の順序を変更できます
アセンブリ言語のソース プログラムには次の 2 種類があります。
- 拡張子が .EXE の実行可能ファイル (EXE ファイルと呼ばれます)
- 拡張子が .COM の実行可能ファイル (コンパクト形式、COM ファイルと略されます)
- これら 2 つのファイルは優先順位が異なり、ソース プログラムの構造も大きく異なります。
プログラム自体に加えて、EXE ファイルにはファイル ヘッダーもあります。
COM ファイルは独自のバイナリ コードで構成されており、EXE ファイルのようなファイル情報を含むヘッダ領域はありません。
COM ファイルを含むソース プログラム形式ではありません。COM ファイルである必要があります。COM ファイルも LINK 接続プログラムを通じて生成され、接続コマンドの後に /T を追加する必要があります。
同じディレクトリに PROG.EXE と PROG.COM などの 2 つのファイルがある場合、PROG と入力してプログラムを実行すると COM ファイルが実行され、PROG.EXE と入力すると PROG.EXE を実行できます。
第 7 章 分岐およびループのプログラミング
単一ブランチプログラム
マルチブランチプログラム
- ブランチ構造内に 3 つ以上の代替ブランチがある場合、これはマルチブランチ構造です。
- 複数の分岐の条件を 1 つずつ問い合わせてどの分岐であるかを判断すると、コードと時間が増加するだけですが、できるだけ早く特定の分岐に入るには、分岐ベクトル テーブル方式を使用できます。
サイクリックプログラム構造
- ループプログラムには DO-WHILE 構造と DO-UNTIL 構造の 2 つの構造形式があります。ループ プログラムは、ループ初期状態、ループ制御、ループ本体の 3 つの部分で構成されます。ループ制御条件には、計数ループ、条件付きループ、条件付き計数ループの 3 種類があります。
カウントサイクルプログラム
- ループのカウント: ループカウンターの値による制御ループ
条件ループ
- ループプログラムでは、各ループで実行される処理が異なる場合があります。つまり、ループ本体に分岐がある場合、特定のフラグに基づいて何を行うかを決定する必要があります。フラグ ビット 1 は操作 A が実行されることを意味し、フラグ ビット 0 は操作 B が実行されることを意味します。このフラグ ワードを論理スケールと呼ぶことができます。