実験5
1は、次のプログラムは、トラッキング、デバッグをロードし、リンクをコンパイルし、その後の質問に答えます
assume cs:code, ds:data, ss:stack
data segment
dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00H
int 21H
code ends
end start
CPUは、プログラムが戻る前に、データセグメント内のデータがどのくらいある、プログラムを実行しますか?変わりません
CPUは、プログラムを実行するプログラム戻り、CS = 076C、SS = 076B、DS = 076A前
場合プログラムは単にロード、DS = 075A、なぜならPSP、データ段落アドレス076A、DS = 076A、076Aバイト16を表すデータセグメント後の割り当て:10 = 076B:0、CSセグメント同様に、物理アドレスもののこれら三つのセグメントは連続しているが、3つのセグメントに分割され、セグメントアドレスが異なっていなければなりません
リセットプロセスがロードされた後、コードセクションアドレスセグメントはX、データセグメントアドレスセグメントはX-2であり、スタックセグメントのセグメントアドレスがX-1であります
2、次の手順では、コンパイル、リンク、デバッグをロードし、追跡して、回答の質問になります
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
code ends
end start
我々はデータセグメント、スタックセグメントが16バイト未満である観察し、アセンブラが自動的に少なく0との完全な相補体よりも、スペースの16のバイトを割り当てます
CPUは、プログラムが戻る前に、データセグメント内のデータがどのくらいある、プログラムを実行しますか?変わりません
CPUは、プログラムを実行するプログラム戻り、CS = 076C、SS = 076B、DS = 076A前
リセットプロセスがロードされた後、コードセクションアドレスセグメントはX、データセグメントアドレスセグメントはX-2であり、スタックセグメントのセグメントアドレスがX-1であります
要約:XXと呼ばれるセグメントを定義した後、ここで、nを表すデータのバイト、割り当てられたスペースのために16より複数大きいデータセグメントのバイト数(N / 16 + 1)×16(に等しいです/それが空間の32バイトが割り当てられ、整数除算)、仮定XX、データの17バイトであります
3、次の手順では、コンパイル、リンク、デバッグをロードし、追跡して、回答の質問になります
assume cs:code, ds:data, ss:stack
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax, 4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start
CPUは、プログラムが戻る前に、データセグメント内のデータがどのくらいある、プログラムを実行しますか?変わりません
CPUは、プログラム、プログラムリターン、CS = 076A、SS = 076Eを実行する前に、DS = 076D
リセットプロセスがロードされた後、コードセクションアドレスセグメントはXであり、データセグメントアドレスセグメントはX + 3であり、セグメント・アドレス・スタック・セグメントはX + 4であります
実際20Hを表す2つのセグメントが、実行可能なセグメントCSのバイト数をバイトので、Rコマンド、データ及びスタック・セグメントの16バイト未満の期間、0でCX値44H(ブロック長)が見つかりました。である(44H-20H = 24H)、唱え10Hが整数ではないので、0(0はプログラム補体スタックとデータセグメントが0カウントの長さは、これらの手順ためであってもよい理由として、番組の長さではない補完利用可能なデータとスタック領域の実際の実装、およびそれらの00及びマシンコードで実行することができない)、CSセグメントは30Hバイトの合計を占め
スタック・セグメントのコード長+長+データ長(二つが16の倍数の整数である)のプログラムコードセグメントの長さ=
(1)、(2)、(3)最後の指令「エンド開始」のタイトルが(プログラムメモリに指定されていない)「終了」に変更された場合4、その後、プログラムは正常に実行することができますか?理由を説明してください。
実行するには、プログラムは、正しい3で実装することができます
エントリ・プロシージャを指定しない場合、第一の記憶手段から出発してロードされ、最初の二つの問題が、実行されるコードセグメントが最初に配置されているが、(すべての後に、最終的に、マシンコード)も、アセンブラ命令に翻訳することができますではなく私たちが本当にしたい、と3番目の質問は、ちょうど最初のブロックの上にある、割り込み復帰後に発生した実際のマシンコード命令を実行する際のCPU、ブロックが最前線に立っていない場合ので、あなたがプログラムのエントリを指定する必要があります。
図5に示すように、コードのライトコードセクション、段落のデータ、及び段落B順次結果がパラグラフCに配置されます
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start: mov ax,a
mov ds,ax ;ds指向a段
mov ax,b
mov es,ax ;es指向b段
mov bx,0
mov cx,8 ;计算8次
s:mov dl, [bx] ;将ds:[bx]内存单元按字节送入dl
add dl, es:[bx] ;将ds:[bx]与es:[bx]内存单元值相加
push ds ;保护ds值,因为下面用到ds了
mov ax,c
mov ds,ax ;将ds指向c段
mov [bx],dl ;将dl(a和b相对应内存单元内容之和)写入c中
pop ds ;将ds恢复
inc bx ;bx递增
loop s
mov ax,4c00h
int 21h
code ends
end start
値DSの一時的な割り当てにシステムスタックの使用の合理化
図6に示すように、セグメントBにセグメントに逆順に格納された最初の8つのプッシュ命令フォントデータと、コードセグメントを符号化します
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
e ends
code sgement
start: mov ax,a
mov ds,ax
mov ax,b ;将b段设置为栈段
mov ss,ax
mov sp,16
mov bx,0
mov cx,8
s:push ds:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
実際には期間1,2,3,4,5フォントデータ、すなわち、0001H、0002H、0003H、プッシュ、ポップ操作はまた、単語であることを起こることに注意してください
それはデシベル1,2,3,4,5,6,7,8である場合、データはバイトです