Keil的調試命令、在線匯編與斷點設置
明,僅舉若干實例,希望讀者可以舉一反三。
1) 在Experssion 中鍵入a==0xf7,再點擊Define 即定義了一個斷點, 注意,a 后有兩
個等號,意即相等。該表達式的含義是:如果a 的值到達0xf7 則停止程序運行。除

圖3 在線匯編窗口
使用相等符號之外,還可以使用>,>=,,=,!=(不等于),(兩值按位與),(兩值相與)等運算符號。
2) 在Experssion 后中鍵入Delay 再點擊Define,其含義是如果執行標號為Delay 的行則中斷。
3) 在Experssion 后中鍵入Delay,按Count后的微調按鈕,將值調到3,其意義是當第三次執行到Delay 時才停止程序運行。
4) 在Experssion 后鍵入Delay , 在
Command 后鍵入printf(“SubRoutine
‘Delay’ has been Calledn”)主程序每次
調用Delay 程序時并不停止運行,但會
在輸出窗口Command 頁輸出一行字
符,即SubRoutine ‘Delay’ has been
Called。其中“n”的用途是回車換行,
使窗口輸出的字符整齊。
5) 設置斷點前先在輸出窗口的Command
頁中鍵入DEFINE int I,然后在斷點設
置時同4),但是Command 后鍵入printf(“SubRoutine ‘Delay’ has been Called %d
timesn”,++I),則主程序每次調用Delay 時將會在Command 窗口輸出該字符及被調
用的次數,如SubRoutine ‘Delay’ has been Called 10 times。
對于使用C 源程序語言的調試,表達式中可以直接使用變量名,但必須要注意,設置
時只能使用全局變量名和調試箭頭所指模塊中的局部變量名。
四、實例調試
為進行程序的調試,我們首先給源程序制造一個錯誤,將延時子程序的第三行“DJNZ
R6,$”后的$改為D1,然后重新編譯,由于程序中并無語法錯誤,所以編譯時不會有任何出
錯提示,但由于轉移目的地出錯,所以子程序將陷入無限循環中。
進入調試狀態后,按F10 以過程單步的形式執行程序,當執行到LCALL DELAY 行時,
程序不能繼續往下執行,同時發現調試工具條上的Halt 按鈕變成了紅色,說明程序在此不
斷地執行著,而我們預期這一行程序執行完后將停止,這個結果與預期不同,可以看出所調
用的子程序出了差錯。為查明出錯原因,按Halt 按鈕使程序停止執行,然后按RST 按鈕使
程序復位,再次按下F10 單步執行,但在執行到LCALL DELAY 行時,改按F11 鍵跟蹤到
子程序內部(如果按下F11 鍵沒有反應,請在源程序窗口中用鼠標點一下),單步執行程序,
可以發現在執行到“DJNZ R6,D1”行時,程序不斷地從這一行轉移到上一行,同時觀察
左側的寄存器的值,會發現R6 的值始終在FFH 和FEH 之間變化,不會減小,而我們的預
期是R6 的值不斷減小,減到0 后往下執行,因此這個結果與預期不符,通過這樣的觀察,
不難發現問題是因為標號寫錯而產生的,發現問題即可以修改,為了驗證即將進行的修改是
否正確,可以先使用在線匯編功能測試一下。把光標定位于程序行“DJNZ R6,D1”,打開
在線匯編的對話框,將程序改為“DJNZ R7,0EH”,即轉回本條指令所在行繼續執行,其中
0EH 是本條指令在程序存儲器中的位置,這個值可以通過在線匯編窗口看到,如圖3 所示。
然后關閉窗口,再進行調試,發現程序能夠正確地執行了,這說明修改是正確的。注意,這
時候的源程序并沒有修改,此時應該退出調試程序,將源程序更改過來,并重新編譯連接,
以獲得正確的目標代碼。
圖4 斷點設置對話框
評論