<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://www.gentoo-zh.org/extern.php?action=feed&amp;tid=23&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 汇编程序 常见错误]]></title>
		<link>https://www.gentoo-zh.org/viewtopic.php?id=23</link>
		<description><![CDATA[汇编程序 常见错误 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 04 Aug 2022 14:08:31 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[汇编程序 常见错误]]></title>
			<link>https://www.gentoo-zh.org/viewtopic.php?pid=23#p23</link>
			<description><![CDATA[<p>汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息.如操作人员指定的列表文件名(即.LST),汇编程序亦将在列表文件中出错的下面给出出错信息,以便操作人员即时查找错误,给予更正.MASM5.0出错信息格式如下:<br />源程序文件行:WARNING/ERROR错误信息码:错误描述信息<br />其中,错误描述信息码由五个字符组成.第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出错类别:&#039;2&#039;为严重错误,&#039;4&#039;为严肃警告,&#039;5&#039;为建议性警告,最后三位为错误编号.<br />错误编号<br />错误描述<br />0<br />Block nesting error<br />嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局<br />1<br />Extra characters on line<br />一语句行有多余字符,可能是语句中给出的参数太多<br />2<br />Internal error-Register already defined<br />这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request 表与Microsoft公司联系<br />3<br />Unkown type specifer<br />未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等<br />4<br />Redefinition of symbol<br />符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误<br />5<br />Symbol is multidefined<br />符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误<br />6<br />Phase error between passes<br />两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误<br />7<br />Already had ELSE clause<br />已有ELSE语句.在一个条件块里使用多于一个的ELSE语句<br />8<br />Must be in conditional block<br />没有在条件块里.通常是有ENDIF或ELSE语句,而无IF 语句<br />9<br />Symbol not defined<br />符号未定义,在程序中引用了未定义的标识符<br />10<br />Syntax error<br />语法错误.不是汇编程序所能识别的一个语句<br />11<br />Type illegal in context<br />指定非法类型.例如对一个过程指定BYTE类型,而不是NEAR或FAR<br />12<br />Group name must be unique<br />组名应是唯一的.作为组名的符号作为其他符号使用<br />13<br />Must be declared during pass 1<br />必须在第一遍扫描期间定义.在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误.<br />14<br />Illegal public declaration<br />一个标识符被非法的指定为PUBLIC类型<br />15<br />Symbol already defferent kind<br />重新定义一个符号为不同种类符号.例如一个段名重新被当作变量名定义使用<br />16<br />Reserved word used as symbol<br />把汇编语言规定的保留字作标识符使用<br />17<br />Forward reference illegal<br />非法的向前引用.在第一遍扫描期间,引用一个未定义符号.<br />18<br />Operand must be register<br />操作数位置上应是寄存器,但出现了标识符<br />19<br />Wrong type of register<br />使用寄存器出错<br />20<br />Operand must be segment or group<br />应该给出一个段名或组名.例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等<br />21<br />Symbol has no segment<br />不知道标识符的段属性<br />22<br />Operand must be type specifier<br />操作数应给出类型说明,如NEAR,FAR,BYTE等<br />23<br />Symbol alread defined locally<br />以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识<br />24<br />Segment paraneters are changed<br />段参数被改变.如同一标识符定义在不同段内<br />25<br />Improper align/combin type<br />段定义时的定位类型/组合类型使用出错<br />26<br />Reference to multidefined symbol<br />指令引用了多重定义的标识符<br />27<br />Operand expected<br />需要一个操作数,只有操作符<br />28<br />Operator expected<br />需要一个操作符,但只有操作数<br />29<br />Divdsion by 0 or overflow<br />除以0或溢出<br />30<br />Negative shift count<br />运算符SHL或SHR的移位表达式值为负数<br />31<br />Operand type must match<br />操作数类型不匹配.双操作数指令的两个操作数长度不一致,一个是字节,一个是字<br />32<br />Illegal use of external<br />外部符号使用出错<br />33<br />Must be record field name<br />应为记录字段名.在记录字段名位置上出现另外的符号<br />34<br />Must be record name or field name<br />应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号<br />35<br />Operand must be size<br />应指明操作数的长度(如BYTE,WORD等).通常使用PTR运算即可改正<br />36<br />Must be variable,label,or constant<br />应该是变量名,标号,或常数的位置上出现了其他信息<br />37<br />Must be stucture field name<br />应该为结构字段名.在结构字段名位置上出现了另外的符号<br />38<br />Lefe operand must segment<br />操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:&quot;MOV AX,DA1:DA2&quot;.DA1位置上应使用某段寄存器名<br />39<br />One operand must constant<br />操作数必须是常数.<br />40<br />Operand must be in same segment or one constant<br />&quot;—&quot;运算符用错.例如&quot;MOV AL,—VAR&quot;,其中VAR是变量名,应有一常数参加运算.又如两个不同段的变量名相减出错<br />41<br />Normal type operand expected<br />要求给出一个正常的操作数.<br />42<br />Constant expected<br />要求给出一个常数.<br />43<br />Operand must have segment<br />运算符SEG用错.<br />44<br />Must be associated with data<br />在必须与数据段有关的位置上出现了代码段有关的项<br />45<br />Must be associated with code<br />在必须与代码段有关的位置上出现了数据段有关的项<br />46<br />Multiple base registers<br />同时使用了多个基址寄存器.如&quot;MOV AX ,SI&quot;<br />47<br />Multiple index registers<br />同时使用了多个变址寄存器.如&quot;MOV AX ,SI&quot;<br />48<br />Must be index or base register<br />指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器.<br />49<br />Illegal use of register<br />非法使用寄存器出错<br />50<br />Value is out of range<br />数值太大,超过允许值.例如:&quot;MOV AL ,100H&quot;<br />51<br />Operand not in current CS ASSUME segment<br />操作数不在当前代码段内.通常指转移指令的目标地址不在当前CS段内<br />52<br />Improper operand type<br />操作数类型使用不当.例如:&quot;MOV VAR1,VAR2&quot;.两个操作数均为存储器操作数,不能汇编出目标代码<br />53<br />Jump out of range by %ld byte<br />条件转移指令跳转范围超过-128~ 127个字节.出错厂,信息同时给出超过的字节数<br />54<br />Index displacement must be constant<br />变址寻址的位移量必须是常数<br />55<br />Illegal register value<br />非法的寄存器值.目标代码中表达寄存器的值超过7<br />56<br />Immediate mode illegal<br />不允许使用立即数寻址.例如&quot;MOV DS,CODE&quot;其中CODE是段名,不能把段名作为立即数传送给段寄存器DS<br />57<br />Illegal size for operand<br />使用操作数大小(字节数)出错.例如:使用双字的存储器操作数<br />58<br />Byte register illegal<br />要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器<br />59<br />Illegal uer of CS register<br />指令中错误使用了段寄存器CS.如:&quot;MOV CS,AX&quot;CS不能做目的操作数<br />60<br />Must be accumulator register<br />要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必须使用累加器AX或AL<br />61<br />Improper uer of segment register<br />不允许使用段寄存器的位置上使用了段寄存器.如&quot;SHL DS,1&quot;<br />62<br />Missing or unreachable CS<br />试图跳转去执行一个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联<br />63<br />Operand combination illegal<br />双操作数指令中两个操作数组合出错<br />64<br />Near JMP/CALL to different CS<br />试图用NEAR属性的转移指令跳转到不在当前段的一个地址<br />65<br />Label cannot have segment override<br />段前缀使用出错<br />66<br />Must have instuction agter prefix<br />在重复前缀REP,REPE,REPNE后面必须有指令<br />67<br />Cannot override ES for destination<br />串操作指令中目的操作数不能用其他段寄存器替代ES<br />68<br />Cannot address with srgment register<br />指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联<br />69<br />Must be in segment block<br />指令语句没有在段内<br />70<br />Cannot use EVEN or ALIGN with byte alignment<br />在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令<br />71<br />Forward needs override or FAR<br />转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定<br />72<br />Illegal value for DUP count<br />操作符DUP前的重复次数是非法的或未定义<br />73<br />Symbol id already external<br />在模块内试图定义的符号,它已在外部符号伪指令中说明<br />74<br />DUP nesting too deep<br />操作数DUP的嵌套太深<br />75<br />Illegak use of undefinde operand( )<br />不定操作符&quot; &quot;使用不当.例如&quot;DB 10H DUP( 2)&quot;<br />76<br />Too many valer for struc or record initialization<br />在定义结构变量或记录变量时,初始值太多<br />77<br />Angle brackets requored around initialized list<br />定义结构体变量时,初始值未用尖括号()括起来<br />78<br />Directive illegal structure<br />在结构体定义中的伪指令使用不当.结构定义中的伪指令语句仅二种:分号(;)开始的注释语句和用DB,DW等数据定义伪指令语句<br />79<br />Override with DUP illegal<br />在结构变量初始值表中使用DUP操作符出错<br />80<br />Field cannot be overridden<br />在定义结构变量语句中试图对一个不允许修改的字段设置初值<br />81<br />Override id of wrong type<br />在定义结构变量语句中设置初值时类型出错<br />82<br />Circular chain of EQU aliases<br />用等值语句定义的符号名,最后又返回指向它自己.如:<br />A EQU B<br />B EQU A<br />83<br />Cannot emulate cooprocessor opcode<br />仿真器不能支持的8087协处理器操作码<br />84<br />End of file,not END directive<br />源程序文件无END文件<br />85<br />Data emitted with no segment<br />语句数据没有在段内</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Thu, 04 Aug 2022 14:08:31 +0000</pubDate>
			<guid>https://www.gentoo-zh.org/viewtopic.php?pid=23#p23</guid>
		</item>
	</channel>
</rss>
