實驗五:編寫、除錯具有多個段的程式
任務一:
(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的值是否有邏輯關係。