實驗五 編寫、除錯具有多個段的程式
(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段中。