天天看點

彙編語言作業之實驗五

---恢複内容開始---

任務一  将下面的程式編譯連接配接,用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操作後

彙編語言作業之實驗五

---恢複内容結束---

轉載于:https://www.cnblogs.com/Jaden233/p/10045983.html