Debug彙編初步(Window10使用Debug)

Debug彙編初步(Window10使用Debug)

有關debug彙編的一些基礎和一個基本的例子分析!!!!
中間還介紹了一下在Window10下如何使用debug,僅供參考!

熟悉debug工具的使用及DOS系統功能調用。

在debug下執行以下操作:

  1. 彙編(-a100)
  2. 運行(-g)
  3. 反彙編(-u100 106)
  4. 查看寄存器的值(-r)
  5. 用N命令對該程序命名(-n)
  6. 用W命令將該程序寫入(Write)磁盤中(-r bx)
  7. 用DOS的dir命令查看當前目錄下的文件

啓動debug程序

(以Windows 10爲例)
  1. 下載好DOSBox和debug
  2. 安裝好DOSBox,運行DOSBox
  3. 運行界面如下
    在這裏插入圖片描述
  4. 然後將debug程序放到D盤
  5. 輸入 mount c d:\ 把物理D盤掛載到c盤符
  6. 輸入c:\進入磁盤
  7. 執行debug命令按回車,然後輸入R回車,進入debug命令操作界面
    在這裏插入圖片描述

這裏是一個簡單的栗子

二、彙編程序

-a100
0AE9:0100 mov dl,1
0AE9:0102 mov ah,2
0AE9:0104 int 21
0AE9:0106 int 20
0AE9:0108

三、運行該程序

-g=0100 0106

在這裏插入圖片描述

四、反彙編列出該程序

-u0100 0106
0AE9:0100 B201 MOV DL,01
0AE9:0102 B402 MOV AH,02
0AE9:0104 CD21 INT 21
0AE9:0106 CD20 INT 20

五、查看寄存器的值(-r)

AX=0201 BX=0000 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=0100 NV UP EI PL NZ NA PO NC
0AE9:0100 B201 MOV DL,01
在這裏插入圖片描述

六、用N命令對該程序命名(-n)

-n smile.com

七、用W命令將該程序寫入(Write)磁盤中(-rbx)

-rcx
CX 0000
:8
-w
Writing 00008 bytes

八、退出debug

-q
D:>
在這裏插入圖片描述

九、用DOS的dir命令查看當前目錄下的文件

D:>dir
Volume in drive D has no label.
Volume Serial Number is 190A-4238

Directory of D:\

2007-02-27 11:02

WINNT
2007-02-27 11:25 Documents and Settings
2007-02-27 11:34 Program Files
2007-02-27 14:28 KAV2003
2007-09-23 21:05 8 SMILE.COM
1 File(s) 8 bytes
4 Dir(s) 378,183,680 bytes free

十、在DOS下直接運行該程序,輸入smile並回車

D:>smile

D:>
在這裏插入圖片描述

任務一

課堂上曾書寫一個求12+22+……+102的示例程序(見後面附錄),請改寫該程序,實現求一些毫無規律的任意數的平方和。將這些數定義在內存中,假設這些數據都是字節型的非零無符號數(即1~255),請選用合適的Debug命令定義它們,約定數據值0作爲結束標記。
1、 將結果放在數據寄存器中,請編寫程序,並設計實驗過程(用合適的debug命令),驗證程序執行的正確性;
2、 若結果要求存放在內存中,請編寫程序,並設計實驗過程(用合適的debug命令),驗證程序執行的正確性;
注:編寫程序和定義初始數據、查看程序運行結果都在Debug下直接進行。每次運行程序時請改變這些平方和數據的值以及數據元素個數,以多方驗證程序正確性。
提示:程序中需要用到寄存器間接尋址方式,示例語句: MOV SI, 0200
MOV BL, [SI]
附:示例程序
在這裏插入圖片描述

任務二

1、 在任務一中,你對結果的字長做過考慮嗎?請重新審視你程序的正確性,闡述你的程序將在什麼情況下出錯。
2、 假設有如下約束條件:一旦平方和結果超過16位字長,則報出錯信息,在屏幕上顯示字符串“Overflow Error!”,並停止計算終止程序。請在Debug下重新編寫程序並調試,驗證程序的正確性。
提示:判斷結果超長可在加法指令之後,判斷進位標誌位CF的值,80X86指令集中條件轉移指令JC或JB均可做到這點。

實驗結果及分析:

一、任務一

1.1結果放在數據寄存器中改寫代碼及註釋

寄存器DX用來存儲平方和
SI爲指向內存地址的指針
寄存器AX和BX用來求平方和

彙編程序

  MOV DX,0           //初始化dx
  MOV SI,0200        //將si指向0200內存單元
  MOV BL,[SI]        //將si指向0200內存單元的值給寄存器bl
  CMP BL,0          //比較bl和0,如果bl=0,停止求和
  JZ 0116           //跳轉到地址0116處繼續執行命令
  MOV AL,BL         //bl的值給al
  MUL BL            //bl自乘求平方送入ax
  ADD DX,AX         //dx和ax求和,結果送入dx
  INC SI            //si地址自加一
  JMP 0106          //跳轉到地址0106
  INT 20            //程序結束並返回dos

Debug運行

① 編寫彙編程序

在這裏插入圖片描述

② 將要計算的數寫入內存(0200),並查看內存中的數據

在這裏插入圖片描述

③ 運行程序,觀察存入數據寄存器中的結果

在這裏插入圖片描述

分析結果:

觀察運行後的數據寄存器中的值,可以看到DX=4E,同時對比內存中的數據:22+72+52=78,而78=4E(h)=4*16+14,故彙編程序正常運行,完成實驗要求。

1.2結果放在內存中改寫代碼及註釋

寄存器DX用來存儲平方和
SI爲指向內存地址的指針
寄存器AX和BX用來求平方和

彙編程序

  MOV DX,0           //初始化dx
  MOV SI,0200        //將si指向0200內存單元
  MOV BL,[SI]        //將si指向0200內存單元的值給寄存器bl
  CMP BL,0          //比較bl和0,如果bl=0,停止求和
  JZ 0116           //跳轉到地址0116處繼續執行命令
  MOV AL,BL         //bl的值給al
  MUL BL            //bl自乘求平方送入ax
  ADD DX,AX         //dx和ax求和,結果送入dx
  INC SI            //si地址自加一
  JMP 0106          //跳轉到地址0106
  MOV SI,0300       //將si指向0300內存單元
  MOV [SI],DX       //將dx的值寫入所指內存
  INT 20            //程序結束並返回dos

Debug運行

① 編寫彙編程序

在這裏插入圖片描述

② 將要計算的數寫入內存(0200),並查看內存中的數據

在這裏插入圖片描述

③ 運行程序,觀察存入內存中的結果

在這裏插入圖片描述

分析結果:

觀察運行後的數據寄存器中的值,可以看到DX=6D,同時觀察內存地址0300中數據同樣也是6D,即將運算結果存入了內存,對比內存地址0200的數據:32+62+82=109,而109=4E(h)=6*16+13,故彙編程序正常運行,完成實驗要求。

二、任務二

2.1問題一

在任務一中,你對結果的字長做過考慮嗎?請重新審視你程序的正確性,闡述你的程序將在什麼情況下出錯?
該彙編程序的乘法操作藉助於寄存器bl和al(均爲8位),以及dx和ax(均爲16位),當al和bl所對應的數超過28,或者結果超過216-1就會發生溢出,從而導致結果錯誤。

2.2實現報錯的改寫代碼及註釋

寄存器DX用來存儲平方和
SI爲指向內存地址的指針
寄存器AX和BX用來求平方和

彙編程序

  MOV DX,0           //初始化dx
  MOV SI,0200        //將si指向0200內存單元
  MOV BL,[SI]        //將si指向0200內存單元的值給寄存器bl
  CMP BL,0          //比較bl和0,如果bl=0,停止求和
  JZ 0116           //跳轉到地址0116處繼續執行命令
  MOV AL,BL         //bl的值給al
  MUL BL            //bl自乘求平方送入ax
  ADD DX,AX         //dx和ax求和,結果送入dx
  JC 011F           //判斷是否溢出,溢出跳轉到011f處繼續執行
  INC SI            //si地址自加一
  JMP 0106          //跳轉到地址0106
  MOV SI,0300       //將si指向0200內存單元
  MOV [SI],DX       //將dx的值寫入所指內存
  INT 20            //程序結束並返回dos
  MOV DX,0128       //將0128內存單元中內容複製到寄存器dx
  MOV AH,9          //DOS的09h功能調用
  INT 21            //輸出寄存器dx內的字符串
  INT 20            //程序結束並返回dos
  DB ’Overflow Error!$’//定義輸出字符串

Debug運行

① 編寫彙編程序

在這裏插入圖片描述

② 將要計算的數寫入內存(0200),並查看內存中的數據(無溢出)

在這裏插入圖片描述

③ 運行程序,觀察存入數據寄存器中的結果

在這裏插入圖片描述

④ 修改要計算的數寫入內存(0200),並查看內存中的數據(有溢出)

在這裏插入圖片描述

⑤ 運行到0116(-g=0100 0116)計算出第一個數2的平方

在這裏插入圖片描述

⑥ 運行全部代碼,查看運行情況

在這裏插入圖片描述

分析結果:

當數據沒有溢出時,觀察運行後的數據寄存器中的值,可以看到DX=7E,同時觀察內存地址0300中數據同樣也是7E,即將運算結果存入了內存,對比內存地址0200的數據:32+62+92=126,而126=7E(h)=7*16+14,故彙編程序正常運行,無報錯。當數據會溢出時,即平方和最終結果會超過16位字長,對0200內存單元第一個2運算時,程序正常運行,當運行全部程序,則報出錯信息,在屏幕上顯示字符串“Overflow Error!”,並停止計算終止程序,經過驗證,程序正常運行,完成實驗要求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章