Debug彙編初步(Window10使用Debug)
有關debug彙編的一些基礎和一個基本的例子分析!!!!
中間還介紹了一下在Window10下如何使用debug,僅供參考!
熟悉debug工具的使用及DOS系統功能調用。
在debug下執行以下操作:
- 彙編(-a100)
- 運行(-g)
- 反彙編(-u100 106)
- 查看寄存器的值(-r)
- 用N命令對該程序命名(-n)
- 用W命令將該程序寫入(Write)磁盤中(-r bx)
- 用DOS的dir命令查看當前目錄下的文件
啓動debug程序
(以Windows 10爲例)
- 下載好DOSBox和debug
- 安裝好DOSBox,運行DOSBox
- 運行界面如下
- 然後將debug程序放到D盤
- 輸入 mount c d:\ 把物理D盤掛載到c盤符
- 輸入c:\進入磁盤
- 執行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
2007-02-27 11:25
2007-02-27 11:34
2007-02-27 14:28
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!”,並停止計算終止程序,經過驗證,程序正常運行,完成實驗要求。