二、目標檔偵錯及工具
在使用 debug時,因為名稱簡短,用法也簡單。若使用「標題偵錯」symdeb.exe則不然,因為首先要生成.map檔,測試時,輸入文字也較多。對不斷使用的人來說,難免嫌煩。簡化的方法,是先制作執行檔:s.bat 及 sm.bat
s.bat 是專供指定程式偵錯用,內容為:
1:symdeb %1.sym %1.exe
這是指已經有了原檔的 .map 時,如果程式剛聯接完畢,且在聯接檔中,沒有生成 .map 的語句,則應制作 sm.bat 如下:
1:mapsym %1.map
使用「標題偵錯」工具有很多優點,其功能較 DEBUG強得多。但是使用者必須注意,需要測試的標題,應該在程式中宣告PUBLIC,否則無法直接跳到該處。
尚有些特殊效果的程式,也應備妥測試的工具,甚至以利用「監視器」的方式,用另外一台電腦來控制。有一些通訊軟件,如 xtalk加上symdeb.exe,通過串行埠(serial port )可以聯機調試,其手續如次:
1,先在待調程式的主機上輸入通訊指令:
C:\>MODE COM1:9600,N,8,1
c:\>symdeb myfile.exe
2,再於已與主機經串行埠聯接的副機上輸入:
C:\>XTALK
進入指令輸入狀態,再輸入:
C:\>SP
表示設定傳輸速度,一般多采用9600,但視主機而定。
C:\>9600
最後,輸入操作指令:
C:\>GO LO
表示用區域網絡,即串行埠口。
這時等待聯機成功的訊號,見到螢幕上出現“-”,即可 開始偵錯。
3,在主機方面,尚要輸入:
C:\>=COM1 ( 或COM2,端視雙方的通訊口而定 )
4,至於偵錯方式,與利用一台電腦時相同,只是此時在主機上出現的是執行後的結果,而由副機控制偵錯步驟。
第三節 分類定義
一、段名(Segment Name)定義
對段名多於一個的程式,最好先有一個定義段的程式,以DRAW為例,假定程式為兩段,一為控制程式段,一為繪圖程式段。資料分為三段,一為應用資料,一為參考資料,以及制作資料。此外還有一資料索引段,合計有六個段。
茲建議,在通用的基礎上,簡化段名,將段分類如下:
程式段 (CODE SEGMENT) 定名為 CG
資料段 (DATA SEGMENT) 定名為 DG
索引段 (INDEX SEGMENT)定名為 IG
記憶段 (MEMORY SEGMENT) 名為 MG
特設段 (EXTRA SEGMENT)定名為 EG
堆棧段 (STACK SEGMENT)定名為 SG
當各段超過一組時,則再加數字以區分之。
如在 dr-seg.asm 中,可設為:
1: TITLE SEGMENT DEFINITION OF PROGRAM ‘DRAW’
2: CG1 SEGMENT PUBLIC
3: CG1 ENDS
4: CG2 SEGMENT PUBLIC
5: CG2 ENDS
6: DG1 SEGMENT PUBLIC
7: DG1 ENDS
8: DG2 SEGMENT PUBLIC
9: DG2 ENDS
10: DG3 SEGMENT PUBLIC
11: DG3 ENDS
12: IG SEGMENT PUBLIC
13: IG ENDS
14: END
在 SEGMENT PUBLIC 之後,有多種表示方式:
SEGMENT PUBLIC XXXX
XXXX=CODE 表示為程式段,在聯接時,屬程式的段與段前後銜接。兩段程式之間,以 000H 填充至「節」( 每十六個字元為一「節」 )之首位。
XXXX=DATA 表示資料段,在聯接時同上。
如果程式師為了某種原因,必須嚴格控制程式之位置及長度時,不宜使用上述兩種方式。
最簡單之陳述方式,即在 SEGMENT PUBLIC之後,保持空白。
XXXX=BYTE 表示程式聯接後,各程式之間緊密接合,不留空位。這種方法,有利於程式精簡。
XXXX=WORD 表示程式聯接後,各程式之間緊密接合,但在後面的程式必然由雙數位起。
又如在 XXXX 前後加以引號如:
SEGMENT PUBLIC 'XXXX'
此一宣告,用以通知匯編程式各段的順序及定義。因此在編寫程式時,只要使用的段名及定義與本檔相符,不管將各段安排在程式任一位置,都不致發生錯誤。
‘XXXX’與本段程式的排列順序有關,在聯接時,先將引號中的字串排序妥當,各程式即依此順序排列之。
也就是說,凡是使用了引號,則程式聯接的順序,即以在引號中字串,於聯接時出現先後為順序。
單一程式檔的錯誤不難測知,但若各段之間發生錯誤,對經驗不足的程式師,將有無從下手之虞,不得不慎!
一般說來,在聯接時,最令人頭痛的錯誤訊息為:
'fixup overflow at nnnn..'
不論其錯誤提示內容如何,此種錯誤的發生,多半是因為段與段之間的標題、緩沖器或是暫存器的使用發生了混淆,聯接程式得不到正確的信息所致。
解決方法是在第一個錯誤訊息出現時,立刻以‘Ctrl_C’停止匯編,記下第一個訊息,再在原程式中,找到該位置,(多半為一標題位置)在此標題之前,一定會發現與「段」有關的錯誤。