題目:将下面的程式編譯連接配接,用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去掉後,編譯器便會順序執行程式。換句話說:當未給編譯器預先的通知,要求其從哪開始執行程式時,編譯器就自動以'至上向下'的順序進行編譯執行源程式。