アセンブリ言語(王シュアン)実験5

実験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である場合、データはバイトです

参照

公開された84元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43569916/article/details/104575241