ch3_1アセンブリ言語プログラムのソースプログラム

マークさん、私は2023年8月15日に湖北省から帰国し、学会に参加しました。学者にはコミュニケーションが必要なようです、特にこの分野の多くの交流では、やはり少なくとも年に1回は学会に出席する必要があります. それはあなたを失望させません

. 私はあまりにも無知で自分の狭い分野に限定されています. 現在の学術の進歩をもっと見てみたいです.

1. アセンブリ言語で書かれたソースプログラム

1.1 アセンブリ言語でプログラムを書く作業手順

アセンブラ: アセンブリ命令とディレクティブを含むテキスト

  • 機械語コードの命令に対応するアセンブリ命令は、機械語命令にコンパイルされ、最終的に
    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 の制御はその実行を可能にしたプログラム (通常は DOS システム) に戻ります。

1.2 プログラム内の 3 つの疑似命令

  • 仮定する

; 意味は、レジスタの特定のセグメントが、
segment... で定義されたプログラム内のセグメントに関連付けられていると仮定することです...終了 - cs:codesg は、CS レジスタが codeg に関連付けられ、定義された
codeg が次のように使用されることを意味すると仮定します。プログラムのコードセグメント。

  • セグメント定義

; アセンブラは複数のセグメントで構成されており、コード、データ、またはスタック領域を格納するために使用されます。
; 意味のあるアセンブラには、コードを格納するために使用されるセクションが少なくとも 1 つ必要です。
; プログラム内でセグメントを定義します: 各セグメントにはセグメント名が必要です

セグメント名 セグメント - セグメントの始まり
...
セグメント名の終了 - セグメントの終わり

  • 終わり(終わりではない)

アセンブラの終了マーカー。プログラムの最後に end が追加されていない場合、コンパイラはプログラムをコンパイルするときにプログラムがどこで終了するかを認識できません。

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

1.3 ソースプログラムはコンパイルと接続を経てマシンコードになります。

ここに画像の説明を挿入します

1.4 アセンブラの構造

  • デバッグで命令を直接記述するアセンブリプログラム
    ; 単純な機能を備えた短く簡潔なプログラムに適しています
    ; アセンブリ命令のみを含める必要があります

ここに画像の説明を挿入します

  • ソース ファイルに個別に書き込まれ、その後実行可能ファイルにコンパイルされるプログラム
    。大規模なプログラムの作成に適してい
    ます。コンパイラの動作をガイドするアセンブリ命令と疑似命令を含める必要があります
    。ソース プログラムはいくつかのセグメントで構成されます。コードとデータ
    データを保存するか、セグメントをスタック スペースとして使用します
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
mov ax,stack
mov ss,ax
mov sp,20h ;设置栈段
mov ax,data
mov ds,ax ;设置数据段
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
....
code ends
end

; セミコロン、-- コメントを表すために使用されます。

1.5 プログラムはどのように書くのですか?

例: 2^3 を求めるプログラミング。
① セグメントを定義する
② 処理タスクを実装する
③ プログラムの終了位置を指定する
④ セグメントをセグメントレジスタに関連付ける
⑤ プログラムから返されるコードを追加する

ここに画像の説明を挿入します

1.6 プログラムで考えられるエラー

構文エラー
; プログラムのコンパイル時にコンパイラによって検出されるエラー;
; 次のプログラムのエラーは簡単に見つかります

aume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,sx
end

ロジック エラー
; プログラムのコンパイル時には表示できない実行時に発生するエラー
;
次のプログラムのエラーは見つけるのが容易ではありません

assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,bx
mov ax,4c10H
int 21H
abc ends
end
求 2^

2. ソースプログラムからプログラム実行まで

2.1 ソースプログラムの作成から実行ファイルの実行までの流れ

ここに画像の説明を挿入します

2.2 ソースプログラムの編集

ここに画像の説明を挿入します

2.3 コンパイル

ここに画像の説明を挿入します

  • オブジェクト ファイル (*.OBJ) は、ソース プログラムをコンパイルするときに取得したい最終結果です

  • リスト ファイル (*.LST) は、コンパイラがソース プログラムをオブジェクト ファイルにコンパイルするときに生成される中間結果です。

  • 相互参照ファイル (*.CRF) は、リスト ファイルと同様、ソース プログラムをターゲット ファイルにコンパイルするときにコンパイラによって生成される中間結果です。

  • ソース プログラムのコンパイルが完了し、コンパイラ出力の最後の 2 行は、ソース プログラムに警告エラーや修正が必要なエラーがないことを示しています。

ここに画像の説明を挿入します

2 種類のエラー
- 重大なエラー
- 指定された
ソース プログラム ファイルが見つかりません。
プロセスを簡略化するためにコマンドの後に ; を追加します

2.4 接続

  • 実行可能ファイル (.EXE) は、プログラムの接続から得られる最終結果です。

  • イメージ ファイル (.MAP) は、ターゲット ファイルを実行可能ファイルにリンクするときにリンカーによって生成される中間結果です。

  • ライブラリ ファイル (.LIB) には、呼び出し可能なサブプログラムがいくつか含まれています。プログラムが特定のライブラリ ファイル内のサブプログラムを呼び出す場合、接続時にこのライブラリ ファイルをターゲット ファイルに接続する必要があります。一緒に実行可能ファイルが生成されます。

  • スタック セグメントがありません。「スタック セグメントがありません」という警告エラーが表示されます。このエラーは無視してかまいません。

: 接続中にエラーが発生する可能性があります
: 例: オブジェクトも見つかりません - オブジェクトが見つかりません

ここに画像の説明を挿入します

2.5 実行可能プログラムの実行

ここに画像の説明を挿入します

私たちのプログラムはモニターに情報を出力しません。プログラムはデータをレジスタに送信したり加算したりするだけの操作を行うだけで、
これらのことはディスプレイ上では見ることができません。

:プログラムの実行が完了したら、戻ると、オペレーティング システムのプロンプトが再び画面に表示されます。

2.6 概要

ソース ファイル
.asm
オブジェクト ファイル
.obj
オブジェクト ファイル
.obj
実行可能ファイル
.exe

ここに画像の説明を挿入します

3. デバッグを使用してプログラムの実行を追跡します。

ここに画像の説明を挿入します

3.1 デバッグでプログラムをロードする

ここに画像の説明を挿入します

まとめ

プログラムがロードされた後、DS にはプログラムが配置されているメモリ領域のセグメント アドレスが格納されます。このメモリ領域のオフセット アドレスは 0 であるため、プログラムが配置されているメモリ領域のアドレスは DS:0 となります。

这个内存区的前256 个字节存PSP,DOS用来和程序进行通信。

後方256バイトからの空間にはプログラムが格納されており、CSの値はDS+10Hとなります。
; プログラムがロードされた後、コードの長さ (バイト) が CX に格納されます。

プログラムはメモリのどこにロードされますか?

ここに画像の説明を挿入します

3.2 デバッグを使用してプログラムをシングルステップ実行する

ここに画像の説明を挿入します

3.3 他の実行方法

ここに画像の説明を挿入します

  • 継続コマンド P (Proceed):
    T コマンドと同様に、命令を 1 つずつ実行し、結果を表示します。ただし、サブルーチンや割り込みなどが発生した場合は、直接実行され、結果が表示されます。

  • 実行コマンド G (Go): ブレークポイントに到達するか、プログラムが正常に終了するまで、指定されたアドレスからプログラムの実行を開始します。

3.4 プログラムのさまざまな実行方法

  • DOSで実行する

プログラム実行の「通常の」状態

  1. DOS が起動すると、コンピュータは「コマンド インタープリタ」 (command.com プログラム) によって制御されます。
  1. 実行可能プログラムを実行する場合、コマンドはプログラムをメモリにロードし、プログラムが実行できるように、CPU の CS:IP がプログラムの最初の命令 (つまり、プログラムのエントリ ポイント) を指すように設定します。
  1. プログラムの実行が終了すると、「コマンド インタプリタ」に戻り、CPU はコマンドの実行を続けます。
  • デバッグで実行

プログラムの実行は開発サイクルで実行されます。
ここに画像の説明を挿入します

デバッグを実行すると、コマンド プログラムは Debug.exe をロードし、デバッグはプログラムをメモリにロードします。プログラムの実行が終了したら、デバッグに戻る必要があります。Q コマンドを使用してデバッグを終了すると、コマンドに戻ります

ここに画像の説明を挿入します

書籍章対応

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/chumingqian/article/details/132515807