---恢複内容開始---
任務一 将下面的程式編譯連接配接,用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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauIjMxETN0YjM20iM0cTNzkDM3EDMzETM4EDMy0SOwIDO5QTMvwVMxgTMwIzLclDMygTO0EzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
如圖:編輯連結過後可以看到(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