天天看點

第六章實驗任務(3、4)

題目:将下面的程式編譯連接配接,用debug加載、跟蹤,然後回答問題。

源代碼:

assume cs:codesg,ds:datasg,ss:stacksg

codesg segment

start: mov ax,stacksg

mov ss,ax

mov sp,16

mov ax,datasg

mov ds,ax

push ds:[0]

push ds:[2]

pop ds:[2]

pop ds:[0]

mov ax,4c00h

int 21h

codesg ends

datasg segment

dw 0123h,0456h

datasg ends

stacksg segment

dw 0,0

stacksg ends

end start

調試過程:

-r

AX=0000 BX=0000 CX=0044 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=143C ES=143C SS=144C CS=144C IP=0000 NV UP EI PL NZ NA PO NC

144C:0000 B85014 MOV AX,1450

-u

144C:0000 B85014 MOV AX,1450

144C:0003 8ED0 MOV SS,AX

144C:0005 BC1000 MOP,0010

144C:0008 B84F14 MOV AX,144F

144C:000B 8ED8 MOV DS,AX

144C:000D FF360000 PUSH [0000]

144C:0011 FF360200 PUSH [0002]

144C:0015 8F060200 POP [0002]

144C:0019 8F060000 POP [0000]

144C:001D B8004C MOV AX,4C00

-t

AX=1450 BX=0000 CX=0044 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=143C ES=143C SS=144C CS=144C IP=0003 NV UP EI PL NZ NA PO NC

144C:0003 8ED0 MOV SS,AX

-t

AX=1450 BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000

DS=143C ES=143C SS=1450 CS=144C IP=0008 NV UP EI PL NZ NA PO NC

144C:0008 B84F14 MOV AX,144F

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000

DS=143C ES=143C SS=1450 CS=144C IP=000B NV UP EI PL NZ NA PO NC

144C:000B 8ED8 MOV DS,AX

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=000D NV UP EI PL NZ NA PO NC

144C:000D FF360000 PUSH [0000] DS:0000=0123

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=000E BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=0011 NV UP EI PL NZ NA PO NC

144C:0011 FF360200 PUSH [0002] DS:0002=0456

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=000C BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=0015 NV UP EI PL NZ NA PO NC

144C:0015 8F060200 POP [0002] DS:0002=0456

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=000E BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=0019 NV UP EI PL NZ NA PO NC

144C:0019 8F060000 POP [0000] DS:0000=0123

-t

AX=144F BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=001D NV UP EI PL NZ NA PO NC

144C:001D B8004C MOV AX,4C00

-d ds:0 f

144F:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00 #.V.............

-t

AX=4C00 BX=0000 CX=0044 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000

DS=144F ES=143C SS=1450 CS=144C IP=0020 NV UP EI PL NZ NA PO NC

144C:0020 CD21 INT 21

-p

Program terminated normally

-p  

問題1:CPU執行程式,程式傳回前,data斷的資料為多少?

解答:data段的資料是:144F:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00 ,結果保持變。

問題2:CPU執行程式,程式傳回前,cs=144ch、ss=1450h、ds=144fh。

問題3:設程式加載後,codesg段的段位址為X,則datasg段的段位址為多少?stacksg段的段位址為多少?

解答:我們可以用指令u檢視程式的代碼占用了多少記憶體單元。

-u

144C:0000 B85014 MOV AX,1450

144C:0003 8ED0 MOV SS,AX

144C:0005 BC1000 MOP,0010

144C:0008 B84F14 MOV AX,144F

144C:000B 8ED8 MOV DS,AX

144C:000D FF360000 PUSH [0000]

144C:0011 FF360200 PUSH [0002]

144C:0015 8F060200 POP [0002]

144C:0019 8F060000 POP [0000]

144C:001D B8004C MOV AX,4C00

從上面的資訊可以看出他占用了1Dh的記憶體空間,但是我們也知道段的使用時不足N/16取整後加1.是以這裡的代碼段占用了20h的空間。而datasg資料段的大小為16KB。是以可以得出:如果codesg段的段位址為X,則datasg資料段的段位址為X+3h,stacksg段的段位址為X+4h.

問題4:如果将第六章實驗(1)、(2)、(3)題中的最後一條僞指令“end start”改為“end”.即不指出程式的入口,則則哪個程式仍然可以正确執行?請說明原因?

解答:就是本片文章能執行。因為如果把end指令後的标号start去掉後,編譯器便會順序執行程式。換句話說:當未給編譯器預先的通知,要求其從哪開始執行程式時,編譯器就自動以'至上向下'的順序進行編譯執行源程式。