實驗報告:實驗五
實驗內容:
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中的數據,發現存放正確。
實驗感想:
對於分段代碼的順序即部分的操作要點有了更深的理解,逐漸開始可以自己編寫或者補全部分簡單的代碼,實驗過程中遇到了許多的疑問,但是通過上網查閱,對於數據的存儲,棧的定義有了更深的理解。
實驗報告:實驗五