1. 程式人生 > >實驗五 編寫、調試具有多個段的程序

實驗五 編寫、調試具有多個段的程序

highlight 實現 c中 eight mage clas end http 實驗

四.實驗結論

1

(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-2h,stack段的段地址為x-1h

因為data一共占16個字節,stack一共占16個字節。

2

(1)cpu執行程序,程序返回前,data段中的數據為:23 01 56 04

如下圖所示:

技術分享圖片

(2)cpu執行程序,程序返回前,cs=076c,ss=076b,ds=076a

如下圖所示:

技術分享圖片

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

(4)對於如下定義的段:

name segment
...

name ends

如果段中的數據占n個字節,則程序加載後,該段實際占有的空間為:((n+15)/16)*16。

??因為每個段都是以16字節來對齊的,但是最大不能超過64KB 。這也就是說,如果你的段數據在16字節內,一樣會被當做一個字節段來算,就是16字節。 要是大於16字節,多出來的1個字節也得有一個字節段的容量來存儲它,所以這時得占兩個字節段,就是32字節。 分為兩種情況,如果n為16的倍數,則占空間為(n/16)*16。如果n不為16的倍數,則占空間為(n/16+1)*16。綜上可以寫成((n+15)/16)*16。

3.

(1)cpu執行程序,程序返回前,data段中的數據為:23 01 56 04

技術分享圖片

(2)cpu執行程序,程序返回前,cs=076a,ss=076e,ds=076d

技術分享圖片

(3)設程序加載後,code段的段地址為x,則data段的段地址為x+3h,stack段的段地址為x+4h

通過反匯編可看出。

技術分享圖片

4.

如果將(1)(2)(3)題中的最後一條偽指令“end start”改為“end”,則哪個程序仍可以正確執行?請說明原因。

只有第三個可以正常運行。因為前兩個找不到程序入口無法執行第一條語句。(1)(2)開始是數據段,只有(3)是指令代碼。

5.

源代碼如下:

assume cs:code

a segment

db 1,2,3,4,5,6,7,8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c segment

db 0,0,0,0,0,0,0,0

c ends

code segment

start:mov bx,0
      mov dx,0
      mov cx,8
s:mov dx,0
  mov ax,a
  mov ds,ax
  add dx,[bx]
  mov ax,b
  mov ds,ax
  add dx,[bx]
  mov ax,c
  mov ds,ax
  mov [bx],dx
  inc bx
  loop s
  mov ax,4c00h
  int 21h

code ends

end start

單步調試到mov [bx],dx之前,用d命令查看c中數據:

技術分享圖片

再用g命令調到程序返回前,用d命令查看c中數據

技術分享圖片

經驗證,數據實現了相加。

6.

源代碼如下:

assume cs:code

a segment

db 1,2,3,4,5,6,7,8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c segment

db 0,0,0,0,0,0,0,0

c ends

code segment

start:mov bx,0
      mov dx,0
      mov cx,8
s:mov dx,0
  mov ax,a
  mov ds,ax
  add dx,[bx]
  mov ax,b
  mov ds,ax
  add dx,[bx]
  mov ax,c
  mov ds,ax
  mov [bx],dx
  inc bx
  loop s
  mov ax,4c00h
  int 21h

code ends

end start

用t命令調試到push操作之前,用d命令查看b中內容

技術分享圖片

用g命令調試到程序返回前,再用d命令查看b中內容

技術分享圖片

經驗證,數據實現了逆置。

五.總結與體會

通過學習編寫多個段的程序,使我們編寫的程序更加地清晰,更有條理。知道了段中的數據占n個字節,則程序加載後,該段實際占有的空間為((n+15)/16)*16。

在自己操作實踐的過程中有些步驟不太熟練,以後仍要多操作,多練習。

實驗五 編寫、調試具有多個段的程序