1. 程式人生 > >組合語言作業之實驗五

組合語言作業之實驗五

---恢復內容開始---

任務一  將下面的程式編譯連線,用debug載入,跟蹤然後回答問題

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends stack segment
  dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
       
        mov ax, data
        mov ds, ax
       
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
       
        mov ax,4c00h
        int 21h code ends
end start  
如圖:編輯連結過後可以看到(1)cpu執行程式,程式返回前,data段中的資料是 23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09; (2)cpu執行程式,程式返回前,cs=076c,ss=076b,ds=076a; (3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。   任務二 將下面的程式編譯連線,用debug載入,跟蹤然後回答問題 (1)cpu執行程式,程式返回前,data段中的資料為23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00; (2)cs=076c,ss=076b,ds=076a; (3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。 (4)對於如下定義的段: name segment 。。。 name ends 如果段中的資料佔n個位元組,則程式載入後,該段實際佔有的空間為(N/16+1)*16, 因為,對比實驗(1)(2)可以發現,(1)中data段資料有16個位元組,佔用了16個位元組空間,而(2)中data段資料只有4個位元組,但實際上(2)也佔用了16位元組的空間,其中不足的部分都用0補全了。因此,推測出若段中資料為N個位元組,則該段實際佔用的空間為(N/16+1)*16個位元組 。   任務三 將下面的程式編譯連線,用debug載入,跟蹤然後回答問題

(1)CPU執行程式,程式返回前,data段的資料為23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00;

(2)CPU執行程式,程式返回前,cs=076A、ss= 076E、ds=076D;

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

 

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

回答:只有(3)可以,因為1、2開始的都是資料段,將end start改為end後,相當於沒有指明程式入口,此時程式就會從載入程序序的第一個單元開始執行。

如果不指明入口位置,則程式從所分配的空間開始執行,前2個前面是資料段,只有從第3條開始是指令程式碼。那麼在1、2中資料先載入進記憶體。cpu會把資料誤當作指令因此不能正確執行,而三中沒事。

 

任務五 程式如下,編寫code段中的程式碼,將a、b段中的資料依次相加,將結果存入c段中。

編輯程式碼如下:

結果正確。

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

如圖:

在執行push操作前:

執行push操作後

 

             

---恢復內容結束---