實驗五 編寫 除錯具有多個段的程式

2022-08-22 19:09:11 字數 1783 閱讀 7984

**一:

用r命令檢視可知stack的段位址為076b,由源**可知stack內有8字,即16位元組。

通過ds=075a可知程式從076a開始存放,所以data區短位址是076a,剛好資料區也是16個位元組。

(1)用d命令檢視data段中的資料為:

(2)用g命令執行該**:

可知cs=076c,ss=076b,ds=076a。

(3)設程式載入後,code段的段位址為x,則data段的段位址為x-2,stack段的段位址為x-1。

**二:

(1)data段中資料區域為076a:0    3,資料如上圖。

(2)用g命令執行後,可知cs=076c,ss=076b,ds=076a,如下圖:

(3)設程式載入後,code段的段位址為x,則data段的段位址為x-2,stack段的段位址為x-1.

(4)此處data的資料區間沒有達到16個位元組,但分配了16個位元組。所以程式載入後分配空間是以16個位元組為單位的,也就是說如果不足16個位元組的也分配16個位元組。那麼段中資料佔n個位元組,則程式載入後,該段實際占有的空間為(n/16+1)*16 。

當n被16整除時: 占有的空間為(n/16)*16。

**三:

(1)由上圖,data段中資料為23 01 56 04。

(2)g命令執行**3.exe,cs=076a,ss=076e,ds=076d。

(3)設程式載入後,code段的段位址為x,則data段的段位址為x+3,stack段的段位址為x+4。

四:將1、2、3中最後最後一條偽指令「end start」改為「end」(也就是說,不指明程式的入口),會怎麼樣?

經過編譯連線後發現,1和2不能正確執行,只有三可以正確執行。

這是因為當沒有指明程式入口時,end指令從當前的cs:ip值開始進入程式。而在**3以**段開始,不會將其他資料段當成**段執行,用r命令檢視ip=0,所以能正確執行。

由實驗可知如果不指明入口位置,則程式從所分配的空間開始執行。

**五:

**六:

實驗總結:

本章內容較少,但實驗中涉及到的內容較多,發現自己在棧的這方面還是欠缺很多。

實驗五 編寫除錯具有多個段的程式

實驗一 將下面的程式編譯,連線,用debug載入,跟蹤,然後回答問題 執行程式截圖如下 總結 cpu執行程式,程式返回前,data段中的資料不變 cpu執行程式,程式返回前,cs 076c,ss 076b,ds 076a 設程式載入後,code段的段位址為x,則data段的段位址為x 2,stack...

實驗5 編寫 除錯具有多個段的程式

assume cs code,ds data,ss stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends ...

實驗 5 編寫 除錯具有多個段的程式

一 實驗任務 完成教材133實驗5 1 將下面的程式編譯 連線,用debug載入 跟蹤,然後回答問題。用u指令反彙編,g指令執行到001d前,得到程式返回前。1 cpu執行程式,程式返回前,data段中的資料為多少?2 cpu執行程式,程式返回前,cs 076c ss 076b ds 076a。3 ...