1. 程式人生 > >實驗五:編寫、除錯具有多個段的程式

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

任務一:

(1)將任務一程式碼寫入記事本並保存於masm檔案並在masm環境下生成可執行檔案t1.exe,截圖如下:

(2)在debug環境下除錯t1.exe,用r命令檢視各暫存器的值,截圖如下:

(3)可知cs值為15f5,用u命令反彙編實驗程式碼,可知在程式執行前,用g命令執行,再用d命令檢視data段中的值,截圖如下:

①CPU執行程式前,程式返回前,可知data段中的值不變。

②CPU執行程式前,程式返回前,cs=15f5,ss=15f4,ds=15f3

③設程式載入後,code段的段地址為X,則data段的段地址為:X-2,stack的段地址為:X-1

任務二:

(1)將程式程式碼寫入記事本截圖如下:

(2)在debug環境下除錯t1.exe,並用r檢視各暫存器的值,u命令進行反彙編,g命令執行截圖如下:

①CPU執行程式,程式返回前,data段中的資料不變。

②CPU執行程式,程式返回前,cs=15F5,ss=15F4,ds=15F3。

③設程式載入後,code段的段地址為X,則data段的段地址為:X-2,stack的段地址為:X-1

④對於定義的段,如果段中的資料佔N個位元組,則程式載入後,這段實際佔有的空間為:若N不滿16個或為16位元組則為一段,N滿16但不滿32也分配32位元組

即 a=Nmod16,若a=0,則空間為 (N\16)*16,若a≠0,則空間為 (N\16+1)*16

任務三:

(1)將程式程式碼寫入記事本截圖如下:

(2)在debug環境下除錯t1.exe,用r命令檢視各暫存器的值,u命令反彙編,g命令執行截圖如下:

①CPU執行程式,程式返回前,data段中的資料不變。

②CPU執行程式,程式返回前,cs=15F3,ss=15F7,ds=15F6。

③設程式載入後,code段的段地址為X,則data段的段地址為:X+3,stack的段地址為:X+4

任務四:

(1)分別執行三個程式看結果截圖如下:

第一個程式反彙編截圖:

可知u命令反彙編程式碼之後發現不是我們輸入的程式碼,可知執行失敗

第二個程式反彙編截圖:

反彙編之後可以看到也不是我們輸入的程式碼段,執行失敗。

第三個程式碼反彙編截圖:

可知反彙編後使我們輸入的程式碼段,執行成功

將偽指令“end start”改為“end”後只有第三個程式可以正確執行,因為沒有指明程式段入口,CPU預設從頭執行,只有最後一個程式碼從頭

執行可以不需要指明程式段入口。

任務五:

將程式碼補全並寫入記事本截圖如下:

(2)在debug環境下除錯t1.exe,分別檢視段c執行程式前後的值截圖如下:

實現了資料依次相加

任務六:

(1)將程式碼補全寫入記事本截圖如下:

(2)在debug環境下除錯t1.exe,分別檢視程式執行前後段b中的值截圖如下:

實現了將a段中的前八個字型資料逆序儲存到b段中

總結:這一次的實驗  讓我瞭解了彙編程式中的巢狀使用,也就是多個段的結合使用,一個程式中可以放多個不同的段

也學會了  “end 標號”表示的是要讓CPU從標號處開始執行,如果不加標號,程式段直接以“end”結尾則預設CPU從頭開始執行

而在有些擁有多個段的程式中,不加標號,程式不能正確執行。

在CPU 程式執行前,也可以檢視暫存器cs,ss,ds的值是否有邏輯關係。