匯編實驗五


實驗結論:

(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

執行前還是向上一題那樣,就不截圖了。

執行后如下:

發現成功逆序存儲。

總結與體會

通過這次實驗我理解和掌握將數據、代碼、棧放入不同段的程序的編寫和調試,也理解具有多個段的匯編源程序對應的目標程序執行時,內存分配方式。

不過在實驗中我也遇到很多問題,希望在接下來的學習中能改進吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM