宏彙編程式錯誤碼

宏彙編程式錯誤碼

宏彙編程式是一種能實現具有宏加工功能的彙編程式。彙編程式在對源程式的彙編過程中,若檢查出某語句有語法錯誤,會隨時在螢幕上給出出錯信息,錯誤碼便是給出的錯誤信息中的其中一項。

宏彙編程式

宏彙編程式是具有宏加工功能的彙編程式。可以用它定義含參數的程式段,在使用的位置上調用它們,彙編時將進行宏(指令)展開,把宏定義所預先定義的指令目標代碼插在該位置上。

宏彙編程式的主要特點是在彙編程式中增加宏加工功能。它允許用戶方便地定義和使用宏指令,適用於程式中多處出現、具有一定格式、可以通過少數參數調節改變的程式段落的場合。採用這種方法不僅減少程式的長度,增加可讀性,而且程式段落的格式需要改變時,只須改動定義處,而不必改動每一使用處。

宏指令與宏定義

按其最簡單的形式,宏指令(通常簡稱宏)是單個計算機指令,它表示一個給定的指令序列。要實現宏,就需要一段稱為宏處理程式的軟體,它本身往往是彙編語言軟體系統的一部分。幾乎在所有的計算機上都有宏處理程式,但是它們的設計還未標準化。一個宏處理程式的作業很簡單。程式設計師提供一些宏定義,它們定義宏和代替宏的指令,宏處理程式則在該宏的每次出現時進行代替。

例如,假設一個程式設計師要在程式中幾個地方使一個名字為COUNT的變數增1。又假設運用如下三個彙編語言指令:

圖1 圖1

LOAD COUNT ADD 1

STORE COUNT

若繼續全部寫出這三個指令將浪費程式設計師的時間。最好選用單個名字(例如BUMPCOUNT)來代表這些指令,然後每當需要指定這三個指令時寫這個名字。於是源程式按圖1所示進行處理。

宏定義定義BUMPCOUNT和取代它的指令。在實際中,也許還有其他幾個宏定義。然後宏處理程式掃描該程式,把BUMPCOUNT的每次出現都用其擴展形式代替。其他已定義的宏也同樣處理。由此,該程式則處於純彙編語言表示,它可被傳送到彙編程式,彙編程式以常規的方式對它進行處理。

錯誤碼

彙編程式在對源程式的彙編過程中,若檢查出某語句有語法錯誤,隨時在螢幕上給出出錯信息,。操作人員指定的列表檔案名稱(即.LST),彙編程式亦將在列表檔案中出錯的下面給出出錯信息,以便操作人員即時查找錯誤,給予更正。

MASM5.0齣錯信息格式如下:

源程式檔案行:WARNING/ERROR錯誤信息碼:錯誤描述信息

錯誤碼組成

錯誤描述信息碼由五個字元組成:

(1)第一個是字母A:表示彙編語言程式出錯;

(2)接著有一個數字指明出錯類別:'2'為嚴重錯誤,'4'為嚴肅警告,'5'為建議性警告;

(3)最後三位為錯誤編號。

錯誤編號及其對應的錯誤描述

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:語句數據沒有在段內。

相關詞條

熱門詞條

聯絡我們