在网上看到的~可以收藏!
汇编程序在对源程序的汇编过程中 ,若检查出某语句有语法错误 ,随时在屏幕上给出出错信息 .如操作人员指 定的列表文件名 (即.LST), 汇编程序亦将在列表文件中出错的下面给出出错信息 ,以便操作人员即时查找错 误,给予更正 .MASM5.0 出错信息格式如下 :
源程序文件行 :WARNING/ERROR 错误信息码 :错误描述信息
错误编号 错误描述
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
不允许使用段寄存器的位置上使用了段寄存器.如”SHL DS,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
语句数据没有在段内
1. 在 MASM 编译时产生警告错误 “Operand types must match能够忽略吗? ”
答:不能,如语句: MOV AL, BX 就会产生上述错误信息,原因是 AL 和 BX 两个操作数的字长不匹配。
2. 在 MASM 编译时为什么产生警告错误 “Operand must have size? ”
答:如果有类似: MOV [SI+1], 10H 的语句会产生此类错误,应改为: MOV BYTE PTR[SI+1],10H 。因为目 标操作数为存储器, 源操作数 ——— 立即数应指明字长是 8 位还是 16 位,若目标操作数为寄存器则不需要。
3. 在编译时为什么产生警告错误 “Reserved word as symbol:XXXXXX ?”
答:指的定义数据或定义符号的名字时使用了保留字。如在数据段中出现了: LENGTH DW 256 这样的定义时就会产生警告,因 LENGTH 是取值运算符,作为保留字不应标识名字。
4. 在程序中定义了数据段, 并且以 VAR 命名的表中设有 0…..9 十个数据,为什么开始的语句: MOV AL, VAR 执行结果不正确?
答:如果代码段起始没有将数据段基址赋给 DS 寄存器,将会产生此类运行错误,因段基址不是所设定的 数据段的基址。
5. 有数据段定义: DATA SEGMENT / ……… . / DATA ENDS / ,语句 MOV AX , DATA 和 MOV AX, SEG DATA 含义相同吗?
答:不,前者是取得 DATA 段的基地址,后者是指取 DATA 变量所在段的基地址。 如果 DATA 已定义为 数据段的名字,再定义为变量或表的名字会产生编译错误
6. 在数据段中设定名为 BUF1 的表中存有字符串 ’Hello ctec!,后设名为 ’ BUF2 的表长度为 11 个字符, 初始值设 0,在代码段中使用串传送指令实现 BUF1—— BUF2 的传送,没有发现语法和控制结构的错误, 为什么结果不对?
答:如果控制结构和指令形式都没有错,就要检查是否定义 ES 段, MOVS 指令要求源指针为 DS : [SI] , 目的指针为 ES : [DI] ,因此应定义 ES 段;当然, DS 段和 ES 段可为同一个段。
7. 在编译中指出某行产生 “Immediate mode illegal错误是什么原因? ”
答:指立即数出现在非法的指令形式中,举例来说,如果在数据段定义有: LENG EQU 1000H; 在代码段 中有:LEA BX, LENG 这样的语句即会出现这类错误, 因为 EQU 伪指令使得编译时将代码中所有的 LENG 符号用立即数 1000H 替代,而指令: LEA BX, 1000H 是非法的。
8. 实验程序中设有宏定义: DOSF MACRO FUNNO / MOV AH, FUNNO INT 21H / ENDM / ,其中的参 数 FUN_NO 代表什么含义?
答: FUN_NO 是宏定义中的形式参数,宏应用时用实际参数替代,此例中实际参数可以是立即数。
9. 在程序中有这样的语句: MOV AX, 8000H / MOV BL,4 / DIV BL / 运行时报告算术溢出,为什么?怎样解决?
答:除法指令 DIV 规定,如果除数字长为 8 位,商的字长超过了 8 位二进制数的表示范围则为溢出。上文 中被除数为 8000H,除数为 4,结果: 2000H 超过了 8 位二进制数,即产生溢出错误。为避免这种情况, 可采用移位或减法指令替代除法指令。
10. 在程序中有语句: JC NEXT, 引起编译错误 “Jump out of range by 18 byte(s),如何解决? ”
答:指条件转移语句超出范围, 8088 汇编规定条件转移语句的转移范围在: -128 ~ +127 个字节以内,若转 移距离超过这一范围, 应配合使用无条件转移语句。 原代码可改为: JNC L1 / JMP NEXT / L1: …………… ./ 。
11. 为什么语句: LEA AX, ADDR 是正确的,而 MOV BL, [AX] 是错误的?
答:前者是取值语句,功能是将 ADDR 的偏移地址值送到寄存器 AX ;后者将 AX 寄存器作为间接寻址寄 存器使用,这在 8086/8088 指令中是不允许的。
12. 利用 9 号 DOS 功能调用显示一个字符串,为什么会显示乱码?
答:常见的情况是定义字符串缺少结尾标志 “$”,功能子程序执行时找不到结尾,更正办法是在定义的字符 串后面加 “$”或 ASCII 码形式的 24H。
13. 在 Windows2000 中, TD 窗口过小,如何把窗口设置的大一些?
答:按 Alt-O 键,在下拉菜单中选择 Display options 项,在弹出的对话框中,用 Tab 键选 Screen lines 选项, 用←、→键选中 “43/50,按回车。然后按 ” F5 键,使 CPU 窗口充满 TD 窗口。
14. 在 Windows2000 和 WIN_XP 的运行程序窗口中不出现数字结果怎么办?
答: 1. 首先保证显示数字为标准 ASCII 码; 2. 设置运行程序的属性为:全屏幕显示,退出时不关闭窗口。
15. 实现两个 BCD 码表示的十进制数如 34 和 56 相加,要求输出 BCD 码结果;为什么输入数据应为 34H 和 56H?
答:BCD 码是由四位二进制数码表示一个十进制数字,十进制数 34 用 BCD 码表示为 00110100B ,写为十 六进制数即 34H; 而加法计算的实际结果为十六进制数 34H 与 56H 相加的结果,故需要调整指令 DAA 将 其调整为预期结果的 BCD 码: 90H。
16. 使用 DOS 功能调用 2 号功能显示数字,有语句: / MOV DL, CL /MOV AH, 2 /INT 21H / 为什么显 示不出结果?
答:参数 DL 应放置数字的 ASCII 码,而不是数字本身,以上程序中,若 CL 内是 0 ~ 9 的数值,应添加语 句: ADD DL, 30H 。
17. 使用算术右移指令 SAR 移位一次,会影响 OF 吗?
答:在 MASM 宏汇编环境中不会,因为算术右移不改变符号位,符号位被复制到下一位,故最高位和次高 位相等,而判断是否溢出的条件是双高位不相等, OF 不会被置 1。
18. 如何编程实现一块内存储区的奇偶校验?
答:先使用如下程序段: MOV AL, [SI] / AND AL, AL / JP NEXT / OR AL, 80H / NEXT :MOV [SI], AL / . 将存储区写为偶校验码,再使用: MOV AL, [SI] / AND AL, AL / JPO ERROR / 做校验。