1. 程式人生 > >實驗五 編寫、除錯具有多個段的程式

實驗五 編寫、除錯具有多個段的程式

(1)將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

①CPU執行程式,程式返回前,data段的資料為多少?

見下圖d 0770:0000 000f結果。

②CPU執行程式,程式返回前,cs= 0772h 、ss=  0771h  、ds= 0770 h  

③設程式載入後,code段的段地址為X,則data段的段地址為 X-2  、stack段的段地址為     X-1 

code段是程式碼段,段地址存放在暫存器cs中,data段是資料段,段地址存放在ds中,stack是棧段,段地址存在ss中。

(2)將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

①CPU執行程式,程式返回前,data段的資料為多少?

見下圖中0770:0000 0003結果。

②CPU執行程式,程式返回前,cs=  0772h    、ss=  0771h   、ds=  0770h   

③設程式載入後,code段的段地址為X,則data段的段地址為  X-2    、stack段的段地址為  X-1   

④對於如下定義的段:

name  segment

.........

name ends

如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為  (N/16+1)*16    。

(3)將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

①CPU執行程式,程式返回前,data段的資料為多少?

見下圖中的d 0773:0000 0003執行結果。

②CPU執行程式,程式返回前,cs=0770h、ss= 0774h  、ds=0773h 

③設程式載入後,code段的段地址為X,則data段的段地址為 X+3  、stack段的段地址為  X+4 

 

(4)如果將(1)、(2)、(3)題中的最後一條偽指令“end start”改為“end”(也就是說,不指明程式的入口),則哪個程式仍然可以正確執行?說出原因。

(為了方便驗證結果,我將pop ds:[2]和pop ds:[0]語句刪去首先,(1)未改之前:

程式(1)改後:

 

用r和t命令找到現在的SS,然後用g命令使程式執行結束,發現改變前後SS發生變化。

 

程式能夠執行,但不能正確執行。

程式(2)改變前:

程式(2)改變後:

 

能執行,但不能正確執行。SS的值變成了20CD。

程式(3)改變前:

 

 程式(3)改變後:

 

 

 能夠執行且執行正確。

(1)和(2)都改變了原來SS的值。

(5)程式如下,編寫code段中的程式碼,將a段和b段中的資料依次相加,將結果存放到c段中。

 

 

結果正確相加。

這道題編寫了好一會,一直是執行g命令後無響應,還以為是編的太複雜了改了好幾遍,最後發現是AX賦值成了004C。。。。

(6)程式如下,編寫code段中的程式碼,用push指令將a段中的前8個字型資料,逆序儲存到b段中。