組譯工具在對來源程式的彙編過程中,若檢查出某語句有語法錯誤,隨時在螢幕上給出出錯資訊.如操作人員指定的列表檔案名稱(即.LST),組譯工具亦將在列表檔案中出錯的下面給出出錯資訊,以便操作人員即時尋找錯誤,給予更正.
MASM5.0出錯資訊格式如下:
來源程式檔案行:WARNING/ERROR錯誤資訊碼:錯誤描述資訊其中,錯誤描述資訊碼由五個字元組成,第一個是字母A
,表示組合語言程式出錯;接著有一個數字指明出錯類別:'2'為嚴重錯誤,'4'為嚴肅警告,'5'為建議性警告,最後三位為錯誤編號.
錯誤編號 錯誤描述
0 Block nesting error 嵌套出錯.嵌套的過程,段,結構,巨集指令或重複塊等非正常結束.例如在嵌套語句中有外層的結束語句,而無內層的結束語局
1 Extra characters on line 一語句行有多餘字元,可能是語句中給出的參數太多
2 Internal error-Register already defined 這是一個內部錯誤.如出現該錯誤,請記下發生錯誤的條件,並使用product Assistance Request 表與Microsoft公司聯絡
3 Unkown type specifer 未知的類型說明符.例如類型字元拼錯,把BYTE寫成BIT,NEAR寫成NAER等
4 Redefinition of symbol 符號重定義.同一標識符在兩個位置上定義.在彙編第一遍掃描時,在這個標識符的第二個定義位置上給出這個錯誤
5 Symbol is multidefined 符號多重定義.同一標識符在兩個位置上定義.在彙編第二遍掃描時,每當遇到這個標識符都給出這個錯誤
6 Phase error between passes 兩次掃描間的遍錯.一個標號在二次掃描時得到不同的地址值,就會給出這種錯誤.若在啟動MASM時使用/D任選項,產生第一遍掃描的列表檔案,它可協助你尋找這種錯誤
7 Already had ELSE clause 已有ELSE語句.在一個條件塊裡使用多於一個的ELSE語句
8 Must be in conditional block 沒有在條件塊裡.通常是有ENDIF或ELSE語句,而無IF 語句
9 Symbol not defined 符號未定義,在程式中引用了未定義的標識符
10 Syntax error 語法錯誤.不是組譯工具所能識別的一個語句
11 Type illegal in context 指定非法類型.例如對一個過程指定BYTE類型,而不是NEAR或FAR
12 Group name must be unique 組名應是唯一的.作為組名的符號作為其他符號使用
13 Must be declared during pass 1必須在第一遍掃描期間定義.在第一遍掃描期間,如一個符號在未定義前就引用,就會出現這種錯誤.
14 Illegal public declaration 一個標識符被非法的指定為PUBLIC類型
15 Symbol already defferent kind 重新定義一個符號為不同種類符號.例如一個段名重新被當作變數名定義使用
16 Reserved word used as symbol 把組合語言規定的保留字作標識符使用
17 Forward reference illegal 非法的向前引用.在第一遍掃描期間,引用一個未定義符號.
18 Operand must be register 運算元位置上應是寄存器,但出現了標識符
19 Wrong type of register 使用寄存器出錯
20 Operand must be segment or group 應該給出一個段名或組名.例如ASSUME語句中應為某段寄存器和指定一個段名或組名,而不應是別的標號或變數名等
21 Symbol has no segment 不知道標識符的段屬性
22 Operand must be type specifier 運算元應給出類型說明,如NEAR,FAR,BYTE等
23 Symbol alread defined locally 以被指定為內部的標識符,企圖在EXTRN語句中又定義外部標識
24 Segment paraneters are changed 段參數被改變.如同一標識符定義在不同段內
25 Improper align/combin type 段定義時的定位類型/組合類別型使用出錯
26 Reference to multidefined symbol 指令引用了多重定義的標識符
27 Operand expected 需要一個運算元,只有操作符
28 Operator expected 需要一個操作符,但只有運算元
29 Divdsion by 0 or overflow 除以0或溢出
30 Negative shift count 運算子SHL或SHR的移位運算式值為負數
31 Operand type must match 運算元類型不符.雙運算元指令的兩個運算元長度不一致,一個是位元組,一個是字
32 Illegal use of external 外部符號使用出錯
33 Must be record field name 應為記錄欄位名.在記錄欄位名位置上出現另外的符號
34 Must be record name or field name 應為記錄名或記錄欄位名.在記錄名或記錄欄位名位置上出現另外的符號
35 Operand must be size 應指明運算元的長度(如BYTE,WORD等).通常使用PTR運算即可改正
36 Must be variable,label,or constant 應該是變數名,標號,或常數的位置上出現了其他資訊
37 Must be stucture field name 應該為結構欄位名.在結構欄位名位置上出現了另外的符號
38 Lefe operand must segment 運算元的左邊應該是段的資訊.如設DA1,DA2均是變數名,下列語句就是錯誤的:"MOV AX,DA1:DA2".DA1位置上應使用某段寄存器名
39 One operand must constant 運算元必須是常數.
40 Operand must be in same segment or one constant "—"運算子用錯.例如"MOV AL,—VAR",其中VAR是變數名,應有一常數參加運算.又如兩個不同段的變數名相減出錯
41 Normal type operand expected 要求給出一個正常的運算元.
42 Constant expected 要求給出一個常數.
43 Operand must have segment 運算子SEG用錯.
44 Must be associated with data 在必須與資料區段有關的位置上出現了程式碼片段有關的項
45 Must be associated with code 在必須與程式碼片段有關的位置上出現了資料區段有關的項
46 Multiple base registers 同時使用了多個基底位址暫存器.如"MOV AX ,[SI][BP]"
47 Multiple index registers 同時使用了多個變址寄存器.如"MOV AX ,[SI][DI]"
48 Must be index or base register 指令僅要求使用基底位址暫存器或變址寄存器,而不能使用其他寄存器.
49 Illegal use of register 非法使用寄存器出錯
50 Value is out of range 數值太大,超過允許值.例如:"MOV AL ,100H"
51 Operand not in current CS ASSUME segment 運算元不在當前程式碼片段內.通常指轉移指令的目標地址不在當前CS段內
52 Improper operand type 運算元類型使用不當.例如:"MOV VAR1,VAR2".兩個運算元均為儲存空間運算元,不能彙編出目標代碼
53 Jump out of range by %ld byte 條件轉移指令跳轉範圍超過-128~ 127個位元組.出錯廠,資訊同時給出超過的位元組數
54 Index displacement must be constant 變址定址的位移量必須是常數
55 Illegal register value 非法的寄存器值.目標代碼中表達寄存器的值超過7
56 Immediate mode illegal 不允許使用立即數定址.例如"MOV DS,CODE"其中CODE是段名,不能把段名作為立即數傳送給段寄存器DS
57 Illegal size for operand 使用運算元大小(位元組數)出錯.例如:使用雙字的儲存空間運算元
58 Byte register illegal 要求用字寄存器的指令使用了位元組寄存器.如PUSH,POP指令的運算元寄存器必須是字寄存器
59 Illegal uer of CS register 指令中錯誤使用了段寄存器CS.如:"MOV CS,AX"CS不能做目的運算元
60 Must be accumulator register 要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必須使用累加器AX或AL
61 Improper uer of segment register 不允許使用段寄存器的位置上使用了段寄存器.如"SHLDS,1"
62 Missing or unreachable CS 試圖跳轉去執行一個CS達不到的標號.通常是指缺少ASSUME語句中CS與程式碼片段相關聯
63 Operand combination illegal 雙運算元指令中兩個運算元組合出錯 64 Near JMP/CALL to different CS 試圖用NEAR屬性的轉移指令跳轉到不在當前段的一個地址
65 Label cannot have segment override 段首碼使用出錯 66 Must have instuction agter prefix 重複首碼REP,REPE,REPNE後面必須有指令
67 Cannot override ES for destination 串操作指令中目的運算元不能用其他段寄存器替代ES 68 Cannot address with srgment register 指令中尋找一個運算元,但ASSUME語句中未指明哪個段寄存器與該運算元所在段有關聯
69 Must be in segment block 指令語句沒有在段內
70 Cannot use EVEN or ALIGN with byte alignment 在段定義偽指令的定位類型中選用BYTE,這時不能使用EVEN或ALIGN偽指令
71 Forward needs override or FAR 轉移指令的目標沒有在來源程式中說明為FAR屬性,可用PTR指定
72 Illegal value for DUP count 操作符DUP前的重複次數是非法的或未定義
73 Symbol id already external 在模組內試圖定義的符號,它已在外部符號偽指令中說明
74 DUP nesting too deep 運算元DUP的嵌套太深
75 Illegak use of undefinde operand( ) 不定操作符" "使用不當.例如"DB 10H DUP( 2)" 76 Too many valer for struc or record initialization 在定義結構變數或記錄變數時,初始值太多
77 Angle brackets requored around initialized list 定義結構體變數時,初始值未用角括弧()括起來
78 Directive illegal structure 在結構體定義中的偽指令使用不當.結構定義中的偽指令語句僅二種:分號(;)開始的備註陳述式和用DB,DW等資料定義偽指令語句
79 Override with DUP illegal 在結構變數初始值表中使用DUP操作符出錯
80 Field cannot be overridden 在定義結構變數語句中試圖對一個不允許修改的欄位設定初值
81 Override id of wrong type 在定義結構變數語句中設定初值時類型出錯
82 Circular chain of EQU aliases 用等值語句定義的符號名,最後又返回指向它自己.如:A EQU B B EQU A
83 Cannot emulate cooprocessor opcode 模擬器不能支援的8087副處理器作業碼
84 End of file,not END directive 來源程式檔案無END檔案
85 Data emitted with no segment 語句資料沒有在段內