實驗結論:
(1)將下面的程序編譯、連接,用Debug加載、跟蹤,然后回答問題。

1.用d命令查看后發現data段中的數據不變。
2.CPU執行程序,程序返回前,cs=076C,ss=076B,ds=076A。
3.設程序加載后,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
(2)將下面的程序編譯、連接,用Debug加載,跟蹤,然后回答問題。

1.用d命令查看后發現data段中的數據不變。
2.CPU執行程序,程序返回前,cs=076C,ss=076B,ds=076A。
3.設程序加載后,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
4.對如下定義的段:
name segment
...
name ends
如果段中數據占N個字節,則程序加載后,該段實際占有的空間為 [(N+15)/16]*16。(結合實驗1,2可知數據段都是以16個字節對齊,不足16字節按16字節算)
(3)將下面的程序編譯、連接,用Debug加載,跟蹤,然后回答問題。

1.用d命令查看后發現data段中的數據不變。
2.CPU執行程序,程序返回前,cs=076A,ss=076E,ds=076D。
3.設程序加載后,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4。
(4)如果將(1),(2),(3)題中的最后一條偽指令“end start”改為“end”(也就是說,不指明程序的入口個),則哪個程序仍然可以正確執行?請說明原因。
 
        (1)和(2)不能正確執行,因為如果不是end start就會默認以ip=0執行,而不是從start開始執行。而(3)的data和stack都在code之后,所以ip本來就為0,可以正確執行。
(5)程序如下,編寫code段中的代碼,將a段和b段中的數據依次相加,將結果存到c段中。
1 assume cs:code 2 a1 segment 3 db 1,2,3,4,5,6,7,8 4 a1 ends 5 b1 segment 6 db 1,2,3,4,5,6,7,8 7 b1 ends 8 c1 segment 9 db 8 dup(0) 10 c1 ends 11 code segment 12 start: 13 mov ax,a1 14 mov ds,ax 15 mov bx,0 16 mov cx,8 17 s:mov ax,[bx] 18 add ax,[bx+10h] 19 mov [bx+20h],ax 20 add bx,2 21 loop s 22 mov ax,4c00h 23 int 21h 24 code ends 25 end star

執行前我查看了很多次,一直是這樣,我也不知道問題出在哪!!

執行后可以看出存入正確。
(6)程序如下,編寫code段中的代碼,用push指令將a段中的前8個字型數據,逆序存儲到b段中。
1 assume cs:code 2 a1 segment 3 dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 4 a1 ends 5 b1 segment 6 dw 8 dup(0) 7 b1 ends 8 code segment 9 start: 10 mov ax,a1 11 mov ds,ax 12 mov ax,b1 13 mov ss,ax 14 mov sp,16 15 mov cx,8 16 mov bx,0 17 s:push [bx] 18 add bx,2 19 loop s 20 mov ax,4c00h 21 int 21h 22 code ends 23 end start
執行前還是向上一題那樣,就不截圖了。
執行后如下:

發現成功逆序存儲。
總結與體會
通過這次實驗我理解和掌握將數據、代碼、棧放入不同段的程序的編寫和調試,也理解具有多個段的匯編源程序對應的目標程序執行時,內存分配方式。
不過在實驗中我也遇到很多問題,希望在接下來的學習中能改進吧。
