---恢復內容開始---
(1)將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題。
①可以發現,data段的數據在執行程序后,程序返回前並未改變,仍是原始數據。
②從圖中可以看出,CPU執行程序,程序返回前,CS=076C,SS=076B,DS=076A。
③進一步可以發現,若code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
(2)將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題。
①與(1)的結果一樣,data段的數據在執行程序后,程序返回前仍未改變,仍是原始數據。
②從圖中可以看出,CPU執行程序,程序返回前,CS=076C,SS=076B,DS=076A。
③與(1)的結果一致,若code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
④對比(1)(2)可以發現,(1)中data段數據有16個字節,占用了16個字節空間,而(2)中data段數據只有4個字節,但實際上(2)也占用了16字節的空間,其中不足的部分都用0補全了。所以推測,若段中數據為N個字節,則該段實際占用的空間為 ([N/16]+1)*16 個字節([]為取整符號)。
(3)將下面的程序編譯連接,用Debug加載、跟蹤,然后回答問題。
①可以發現,data段的數據在執行程序后,程序返回前並未改變,仍是原始數據。
②從圖中可以看出,CPU執行程序,程序返回前,CS=076A,SS=076E,DS=076D。
③進一步可以發現,若code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4。
(4)如果將(1)(2)(3)題中的最后一條偽指令“end start”改為“end”(也就是說,不指明程序的入口),則哪個程序仍然可以正確執行?請說明原因。
答:如果將最后一條偽指令“end start”改為“end”,相當於沒有指明程序入口,此時程序就會從加載進內存的第一個單元起開始執行。在(1)(2)題中,都是數據先加載進內存,CPU會誤把數據也當成指令執行,最終不能保證被正確執行;而(3)題則是代碼段先被加載進內存,因而可以被正確執行。
(5)程序如下,編寫code段中代碼,將a段和b段中的數據依次相加,將結果存到C段中。
(6)程序如下,編寫code段中代碼,用PUSH指令將A段中的前8個字型數據,逆序存儲到B段中。