1. 程式人生 > >實驗報告:實驗五

實驗報告:實驗五

assume ima brush 補全 這也 .com 都是 n+1 debug

實驗內容:

1.將老師給的程序框架編譯、連接後利用反匯編u查看代碼長度,利用g命令將程序運行至在mov ax,4c00h結束語句前。

技術分享圖片

技術分享圖片

(1)發現data中的數據被改為代碼中指定的數據。

(2)程序返回前,cs=076C、ss=076B、ds=076A。

(3)程序運行後,設code段地址為X,則data段地址為X-2,stack段的段地址為X-1。

2.將ex5-2編譯連接用debug調試後

技術分享圖片

(1)發現data中的數據為改為了指定的數據。

(2)程序返回前,cs=076C,ss=076B,ds=076A。

(3)設程序加載後,code段的段地址為X,則data段的段地址為X-2,stack的段地址為X-1。

(4)若段中數據占N個字節,程序加載後,該段實際占有的空間為。。

這題其實一開始我還挺沒頭緒的,因為我只看出了三個段地址間的差為1,且存入16,4個字節後的段地址並沒有改變,但是我經過上網的查閱發現:因為每個段都是以16字節來對齊的,但是最大不能超過64KB 。這也就是說,如果你的段數據在16字節內,一樣會被當做一個字節段來算,就是16字節。 要是大於16字節呢,那麽如果多出就算是1個字節,因為已經超過一個16字節,多出來的1個字節 也得有一個字節段的容量來存儲它,所以這時得占兩個字節段,就是32字節,以此類推。

所以答案為((N+15)/16)*16(該式意思是滿十六後多出的部分都按16計算)

3.編譯連接運行後

技術分享圖片

(1)data中的數據與設定的數據一致。

(2)cs=076A,ss=076E,ds=076D。

(3)設code段的段地址為X,則data段的段地址為X+3,stack段地址為X+4。

這裏有一個疑問,代碼段的長度如圖為32個字節,在我看來,應該只要+2就夠了啊,可能是系統多預留了16字節的空間嗎?

4.

將三個代碼中的start分別刪去,再編譯連接運行。

技術分享圖片

實驗一無法運行

技術分享圖片

實驗二也無法運行

技術分享圖片

實驗三反匯編的代碼一致,且結果也一致。

因為將start去掉後,程序會從ip=0的位置開始執行,而三個程序中只有第三個程序代碼段的位置是ip=0時的位置,所以第三個程序可以被執行。

5.

代碼如下:

 1 assume cs:code
 2 a segment
 3   db 1,2,3,4,5,6,7,8
 4 a ends
 5 
 6 b segment
 7   db 1,2,3,4,5,6,7,8
 8 b ends
 9 
10 c1 segment   ; 在集成軟件環境中,請將此處的段名稱由c→改為c1或其它名稱
11   db 8 dup(0)
12 c1 ends        ; 改的時候要成對一起修改
13 code segment
14 start:
15   mov ax,a
16   mov ds,ax
17   mov cx,8
18   mov bx,0
19 
20 s: mov ax,[bx]
21    add ax,[bx+10h]
22    mov [bx+20h],ax
23    add bx,2
24    loop s
25 
26    mov ax,4c00h
27    int 21h
28 code ends
29 end start

技術分享圖片

技術分享圖片

如上圖,相加前邏輯段c的值為0.

技術分享圖片

如圖,實現數據相加後的邏輯段c的8個字節的值為前16個字節數據對應的和。

6.

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
  mov ax,a
  mov ds,ax
  mov bx,0
  mov cx,8
  mov ax,b
  mov ss,ax
  mov sp,10h
  
s: push [bx]
   add bx,2
   loop s

   mov ax,4c00h
   int 21h
code ends
end start

  

技術分享圖片

技術分享圖片

如上圖,對比前後邏輯段c中的數據,發現存放正確。

實驗感想:

對於分段代碼的順序即部分的操作要點有了更深的理解,逐漸開始可以自己編寫或者補全部分簡單的代碼,實驗過程中遇到了許多的疑問,但是通過上網查閱,對於數據的存儲,棧的定義有了更深的理解。

實驗報告:實驗五