汇编语言常见错误信息解释.docx
- 文档编号:27086591
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:17
- 大小:23.75KB
汇编语言常见错误信息解释.docx
《汇编语言常见错误信息解释.docx》由会员分享,可在线阅读,更多相关《汇编语言常见错误信息解释.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言常见错误信息解释
汇编语言常见错误信息解释
2010-05-1822:
53
汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息.如操作人员指定的列表文件名(即.LST),汇编程序亦将在列表文件中出错的下面给出出错信息,以便操作人员即时查找错
误,给予更正.MASM5.0出错信息格式如下:
源程序文件行:
WARNING/ERROR错误信息码:
错误描述信息
其中,错误描述信息码由五个字符组成,第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出
错类别:
'2'为严重错误,'4'为严肃警告,'5'为建议性警告,最后三位为错误编号.
错误编号
错误描述
0
Blocknestingerror
嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局
1
Extracharactersonline一语句行有多余字符,可能是语句中给出的参数太多
2
Internalerror-Registeralreadydefined
这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用ProductAssistanceRequest表与Microsoft公司联系
3
Unkowntypespecifer
未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等
4
Redefinitionofsymbol
符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误
5
Symbolismultidefined
符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误6
Phaseerrorbetweenpasses
两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D
任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误
7
AlreadyhadELSEclause
已有ELSE语句.在一个条件块里使用多于一个的ELSE语句
8
Mustbeinconditionalblock
没有在条件块里.通常是有ENDIF或ELSE语句,而无IF语句
9
Symbolnotdefined
符号未定义,在程序中引用了未定义的标识符
10
Syntaxerror
语法错误.不是汇编程序所能识别的一个语句
11
Typeillegalincontext指定非法类型.例如对一个过程指定BYTE类型,而不是NEAR或FAR
12
Groupnamemustbeunique
组名应是唯一的.作为组名的符号作为其他符号使用
13
Mustbedeclaredduringpass1必须在第一遍扫描期间定义.在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误.
14
Illegalpublicdeclaration一个标识符被非法的指定为PUBLIC类型
15
Symbolalreadydefferentkind重新定义一个符号为不同种类符号.例如一个段名重新被当作变量名定义使用
16
Reservedwordusedassymbol把汇编语言规定的保留字作标识符使用
17
Forwardreferenceillegal非法的向前引用.在第一遍扫描期间,引用一个未定义符号.
18
Operandmustberegister操作数位置上应是寄存器,但出现了标识符
19
Wrongtypeofregister使用寄存器出错
20
Operandmustbesegmentorgroup
应该给出一个段名或组名.例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号
或变量名等
21
Symbolhasnosegment不知道标识符的段属性
22
Operandmustbetypespecifier操作数应给出类型说明,如NEAR,FAR,BYTE等
23
Symbolalreaddefinedlocally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识
24
Segmentparanetersarechanged段参数被改变.如同一标识符定义在不同段内
25
Improperalign/combintype段定义时的定位类型/组合类型使用出错
26
Referencetomultidefinedsymbol指令引用了多重定义的标识符
27
Operandexpected需要一个操作数,只有操作符
28
Operatorexpected需要一个操作符,但只有操作数
29
Divdsionby0oroverflow
除以0或溢出
30
Negativeshiftcount运算符SHL或SHR的移位表达式值为负数
31
Operandtypemustmatch
操作数类型不匹配.双操作数指令的两个操作数长度不一致,一个是字节,一个是字32
Illegaluseofexternal外部符号使用出错
33
Mustberecordfieldname应为记录字段名.在记录字段名位置上出现另外的符号
34
Mustberecordnameorfieldname应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号
35
Operandmustbesize
应指明操作数的长度(如BYTE,WORD等).通常使用PTR运算即可改正
Mustbevariable,label,orconstant
应该是变量名,标号,或常数的位置上出现了其他信息
37
Mustbestucturefieldname
应该为结构字段名.在结构字段名位置上出现了另外的符号
38
Lefeoperandmustsegment操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:
\"MOV
AX,DA1:
DA2\".DA1位置上应使用某段寄存器名
39
Oneoperandmustconstant操作数必须是常数.
40
Operandmustbeinsamesegmentoroneconstant
\"—\"运算符用错.例如\"MOVAL,—VAR\",其中VAR是变量名,应有一常数参加运算.又如两个不同段的变量名相减出错
41
Normaltypeoperandexpected要求给出一个正常的操作数.
42
Constantexpected要求给出一个常数.
43
Operandmusthavesegment
运算符SEG用错.
44
Mustbeassociatedwithdata在必须与数据段有关的位置上出现了代码段有关的项
45
Mustbeassociatedwithcode在必须与代码段有关的位置上出现了数据段有关的项
46
Multiplebaseregisters同时使用了多个基址寄存器.如\"MOVAX,[SI][BP]\"
47
Multipleindexregisters同时使用了多个变址寄存器.如\"MOVAX,[SI][DI]\"
48
Mustbeindexorbaseregister指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器.
49
Illegaluseofregister
非法使用寄存器出错
Valueisoutofrange
数值太大,超过允许值.例如:
\"MOVAL,100H\"
51
OperandnotincurrentCSASSUMEsegment
操作数不在当前代码段内.通常指转移指令的目标地址不在当前CS段内
52
Improperoperandtype
操作数类型使用不当.例如:
\"MOVVAR1,VAR2\".两个操作数均为存储器操作数,不能汇编出目标代码
53
Jumpoutofrangeby%ldbyte
条件转移指令跳转范围超过-128~127个字节.出错厂,信息同时给出超过的字节数
54
Indexdisplacementmustbeconstant变址寻址的位移量必须是常数
55
Illegalregistervalue
非法的寄存器值.目标代码中表达寄存器的值超过7
56
Immediatemodeillegal
不允许使用立即数寻址.例如\"MOVDS,CODE\"其中CODE是段名,不能把段名作为立即数传送给段寄存器DS
57
Illegalsizeforoperand
使用操作数大小(字节数)出错.例如:
使用双字的存储器操作数
58
Byteregisterillegal要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器
59
IllegaluerofCSregister
指令中错误使用了段寄存器CS.如:
\"MOVCS,AX\"CS不能做目的操作数
60
Mustbeaccumulatorregister
要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必须使用累加器AX或AL
61
Improperuerofsegmentregister不允许使用段寄存器的位置上使用了段寄存器.如\"SHLDS,1\"
62
MissingorunreachableCS
试图跳转去执行一个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联
63
Operandcombinationillegal双操作数指令中两个操作数组合出错
64
NearJMP/CALLtodifferentCS试图用NEAR属性的转移指令跳转到不在当前段的一个地址
65
Labelcannothavesegmentoverride段前缀使用出错
66
Musthaveinstuctionagterprefix
在重复前缀REP,REPE,REPNE后面必须有指令
67
CannotoverrideESfordestination串操作指令中目的操作数不能用其他段寄存器替代ES
68
Cannotaddresswithsrgmentregister
指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联69
Mustbeinsegmentblock指令语句没有在段内
70
CannotuseEVENorALIGNwithbytealignment在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令71
ForwardneedsoverrideorFAR
转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定
72
IllegalvalueforDUPcount
操作符DUP前的重复次数是非法的或未定义
73
Symbolidalreadyexternal在模块内试图定义的符号,它已在外部符号伪指令中说明
74
DUPnestingtoodeep操作数DUP的嵌套太深
75
Illegakuseofundefindeoperand()不定操作符\"\"使用不当.例如\"DB10HDUP
(2)\"76
Toomanyvalerforstrucorrecordinitialization在定义结构变量或记录变量时,初始值太多77
Anglebracketsrequoredaroundinitializedlist定义结构体变量时,初始值未用尖括号()括起来78
DB,DW等
Directiveillegalstructure
在结构体定义中的伪指令使用不当.结构定义中的伪指令语句仅二种:
分号(;)开始的注释语句和用数据定义伪指令语句
OverridewithDUPillegal在结构变量初始值表中使用DUP操作符出错80
Fieldcannotbeoverridden在定义结构变量语句中试图对一个不允许修改的字段设置初值
81
Overrideidofwrongtype在定义结构变量语句中设置初值时类型出错
82
CircularchainofEQUaliases用等值语句定义的符号名,最后又返回指向它自己.如:
AEQUB
BEQUA
83
Cannotemulatecooprocessoropcode仿真器不能支持的8087协处理器操作码84
Endoffile,notENDdirective源程序文件无END文件
85
Dataemittedwithnosegment语句数据没有在段内
汇编语言程序设计
1.在MASM编译时产生警告错误“Operandtypesmustmatch能够忽”略吗?
答:
不能,如语句:
MOVAL,BX就会产生上述错误信息,原因是AL和BX两个操作数的字长不匹配。
2.在MASM编译时为什么产生警告错误“Operandmusthavesize?
”
答:
如果有类似:
MOV[SI+1],10H的语句会产生此类错误,应改为:
MOVBYTEPTR[SI+1],10H。
因为目标操作数为存储器,源操作数———立即数应指明字长是8位还是16位,若目标操作数为寄存器则不需要。
3.在编译时为什么产生警告错误“Reservedwordassymbol:
XXXXXX?
LENGTHDW256这样的定
答:
指的定义数据或定义符号的名字时使用了保留字。
如在数据段中出现了:
义时就会产生警告,因LENGTH是取值运算符,作为保留字不应标识名字。
4.在程序中定义了数据段,并且以VAR命名的表中设有0⋯..9十个数据,为什么开始的语句:
MOVAL,VAR执行结果不正确?
答:
如果代码段起始没有将数据段基址赋给DS寄存器,将会产生此类运行错误,因段基址不是所设定的数据段的基址。
5.有数据段定义:
DATASEGMENT/⋯⋯⋯./DATAENDS/,语句MOVAX,DATA和MOVAX,SEGDATA含义相同吗?
答:
不,前者是取得DATA段的基地址,后者是指取DATA变量所在段的基地址。
如果DATA已定义为数据段的名字,再定义为变量或表的名字会产生编译错误
6.在数据段中设定名为BUF1的表中存有字符串'Helloctec!
,后'设名为BUF2的表长度为11个字符,初始值设0,在代码段中使用串传送指令实现BUF1——BUF2的传送,没有发现语法和控制结构的错误,为什么结果不对?
答:
如果控制结构和指令形式都没有错,就要检查是否定义ES段,MOVS指令要求源指针为DS:
[SI],目的指针为ES:
[DI],因此应定义ES段;当然,DS段和ES段可为同一个段。
7.在编译中指出某行产生“Immediatemodeillegal错误是”什么原因?
答:
指立即数出现在非法的指令形式中,举例来说,如果在数据段定义有:
LENGEQU1000H;在代码段中有:
LEABX,LENG这样的语句即会出现这类错误,因为EQU伪指令使得编译时将代码中所有的LENG符号用立即数1000H替代,而指令:
LEABX,1000H是非法的。
8.实验程序中设有宏定义:
DOSFMACROFUNNO/MOVAH,FUNNOINT21H/ENDM/,其中的参
数FUN_NO代表什么含义?
答:
FUN_NO是宏定义中的形式参数,宏应用时用实际参数替代,此例中实际参数可以是立即数。
9.在程序中有这样的语句:
MOVAX,8000H/MOVBL,4/DIVBL/运行时报告算术溢出,为什么?
怎
样解决?
答:
除法指令DIV规定,如果除数字长为8位,商的字长超过了8位二进制数的表示范围则为溢出。
上文中被除数为8000H,除数为4,结果:
2000H超过了8位二进制数,即产生溢出错误。
为避免这种情况,可采用移位或减法指令替代除法指令。
10.在程序中有语句:
JCNEXT,引起编译错误“Jumpoutofrangeby18byte(s),如何解”决?
答:
指条件转移语句超出范围,8088汇编规定条件转移语句的转移范围在:
-128~+127个字节以内,若转移距离超过这一范围,应配合使用无条件转移语句。
原代码可改为:
JNCL1/JMPNEXT/L1:
⋯⋯⋯⋯⋯./
11.为什么语句:
LEAAX,ADDR是正确的,而MOVBL,[AX]是错误的?
答:
前者是取值语句,功能是将ADDR的偏移地址值送到寄存器AX;后者将AX寄存器作为间接寻址寄存器使用,这在8086/8088指令中是不允许的。
12.利用9号DOS功能调用显示一个字符串,为什么会显示乱码?
答:
常见的情况是定义字符串缺少结尾标志“$”,功能子程序执行时找不到结尾,更正办法是在定义的字符串后面加“$”或ASCII码形式的24H。
13.在Windows2000中,TD窗口过小,如何把窗口设置的大一些?
答:
按Alt-O键,在下拉菜单中选择Displayoptions项,在弹出的对话框中,用Tab键选Screenlines选项,用←、→键选中“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号功能显示数字,有语句:
/MOVDL,CL/MOVAH,2/INT21H/为什么显
示不出结果?
答:
参数DL应放置数字的ASCII码,而不是数字本身,以上程序中,若CL内是0~9的数值,应添加语句:
ADDDL,30H。
17.使用算术右移指令SAR移位一次,会影响OF吗?
答:
在MASM宏汇编环境中不会,因为算术右移不改变符号位,符号位被复制到下一位,故最高位和次高位相等,而判断是否溢出的条件是双高位不相等,OF不会被置1。
18.如何编程实现一块内存储区的奇偶校验?
答:
先使用如下程序段:
MOVAL,[SI]/ANDAL,AL/JPNEXT/ORAL,80H/NEXT:
MOV[SI],AL/.
将存储区写为偶校验码,再使用:
MOVAL,[SI]/ANDAL,AL/JPOERROR/做校验。
汇编语言源程序的编辑与调试过程
1.怎样在TD环境下载入被调试程序?
答:
方法1:
转到TD.EXE所在目录,在DOS提示符下键入以下命令:
C:
\\ASM>TD↙
进入TD后,按Alt-F键打开File菜单,选择Open,在文件对话框中输入要调试的程序名,按回车
方法2:
转到TD.EXE所在目录,在DOS提示符下键入以下命令(假定要调试的程序名为HELLO.EXE)
C:
\\ASM>TDHELLO.EXE↙
方法3:
在Windows操作系统中,打开TD.EXE所在目录,把要调试的程序图标拖放到TD的图标上
2.在TD环境下如何输入编辑汇编指令?
答
(1)用Tab键选择代码区为当前区域;
2)用方向键把光标移到期望的地址处,如果是输入一个新的程序段,建议把光标移到CS:
0100H处;
3)打开指令编辑窗口,有两种方法:
一是在光标处直接键入汇编指令,在输入汇编指令的同时屏幕上就会自动弹出指令的临时编辑窗口
二是用Alt-F10键激活代码区局部菜单,选择其中的汇编命令,屏幕上也会自动弹出指令的临时编辑窗口
(4)在临时编辑窗口中输入/编辑指令,每输入完一条指令,按回车,输入的指令即可出现在光标处(替换掉原来的指令),同时光标自动下移一行,以便输入下一条指令。
3.在TD环境下如何查看/修改数据段的数据?
答:
(1)用Tab键选择数据区为当前区域;
(2)使用局部菜单中的“Goto”命令并结合使用方向键把光标移到期望的地址单元(注意数据区的光标是一个下划线),数据区就从该地址处显示内存单元的内容。
3)若要修改该地址处的内容,则需打开数据编辑窗口。
有两种方法:
一是在光标处直接键输入数据,在输入数据的同时屏幕上就会自动弹出数据编辑窗口
二是用Alt-F10键激活数据区局部菜单,选择其中的“Change”命令,屏幕上也会弹出数据编辑窗口
4)在数据编辑窗口中输入所需的数据,输入完后,按回车,输入的数据就会替代光标处的原始数据。
4.在TD环境下如何修改寄存器内容?
答:
(1)用Tab键选择寄存器区为当前区域;
2)用方向键把光标移到要修改的寄存器上;
3)打开编辑输入窗口。
有两种方法:
一是在光标处直接键入所需的值,在键入的同时屏幕上就会自动弹出编辑输入窗口
二是用Alt-F10键激活寄存器区局部菜单,选择其中的“Change”命令,屏幕上也会弹出编辑输入窗口
4)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 常见 错误信息 解释