单片机汇编语言常见错误分析

合集下载

单片机C语言编程的常见问题分析

单片机C语言编程的常见问题分析

单片机C语言编程的常见问题分析单片机C语言编程是嵌入式系统开发的关键环节,其涉及的问题较多,下面是一些常见问题的分析:1. 编程语法问题在单片机C语言编程中,常见的语法问题包括错误的注释、拼写错误、语法错误等。

这些问题会导致代码无法编译或者运行出错。

为了解决这类问题,可以通过学习C语言的语法规则、对于变量和函数命名要求的规范等方式来规避。

2. 变量类型问题在单片机C语言程序中,常见的变量类型问题包括数据类型选择错误、变量的生命周期问题等。

数据类型选择错误可能会导致计算结果错误或溢出;而变量的生命周期问题可能会导致程序逻辑错误,例如在函数外部访问已被销毁的变量。

为了避免这类问题,可以采用C语言的作用域规则,注意变量的定义位置和生命周期。

3. 内存管理问题单片机编程中常见的内存管理问题包括内存的分配和释放、指针操作、堆栈溢出等。

这些问题都可能导致程序运行出错,例如崩溃或错误输出。

在实际编程过程中,需要理解单片机的内存结构和内存分配的方式,注意动态分配内存的安全性,避免使用未初始化的指针等。

4. 中断问题中断是单片机程序中常见的控制流处理方式。

在单片机C语言编程中,中断的处理需要注意很多细节,例如中断向量表的定义、中断处理函数的编写、优先级等。

这些问题都与单片机的硬件架构密切相关,需要根据具体情况进行处理。

5. 硬件驱动问题单片机程序通常需要与外设进行通信,这就需要编写硬件驱动程序。

硬件驱动程序需要考虑到外设的工作方式,通信协议等问题。

这些问题都需要结合具体的硬件进行分析和处理。

总之,单片机C语言编程涉及的问题较多,程序员需要熟练掌握C语言的语法规则、理解单片机的硬件结构和特性,以及理解外设工作原理和通信协议。

同时,程序员还需要注意代码的可读性和可维护性,编写清晰、简洁、高效的代码。

汇编语言一些常见错误

汇编语言一些常见错误

常见的汇编语言错误:
推荐书籍和软件:
1.《IBM PC汇编语言程序设计》作者:沈美明温冬婵/编著出版社:清华大学出版社
以前学习汇编必备的一本书,相当不错。

2.《Intel汇编语言程序设计(第四版)》作者:[美]Kip R.Irvine 译者:温玉杰张家生罗云彬针对Intel系列写的比较全面,翻译的人也不错,作为参考资料应该不错
3.Win32下的汇编书籍罗云彬写的《Windows环境下32位汇编语言程序设计》,32位环境下的汇编开发必备书
3.Emu8086开发环境(提供一些简单例子,并有单步执行和虚拟视窗模拟输入输出,比较直观)4.简单的编译环境(Microsoft公司的MASM.exe,Link.exe和Windows自带的Debug.Exe调试)。

单片机常见错误例程分析

单片机常见错误例程分析

单片机常见错误例程分析单片机是一种集成电路,对于初学者来说,由于经验不足,常会遇到一些错误。

下面我们来分析一些单片机常见的错误例程,以及解决方法。

一、看门狗定时溢出引起的复位单片机中通常都有看门狗(Watchdog)定时器,用于监控系统运行。

如果在程序中没有及时喂狗,导致看门狗定时器溢出,会引起复位。

解决方法:1.在主程序中设定喂狗的指令,以避免看门狗定时溢出。

2.在适当的位置设置看门狗使能的指令,保证看门狗定时器能正常工作。

3.尽量避免在中断服务程序中关闭看门狗定时器,以免因为中断响应过慢导致看门狗复位。

二、中断服务程序执行时间过长当中断服务程序执行时间过长时,会导致主程序无法继续正常运行。

这种情况下,单片机很可能无法响应其他外部事件。

解决方法:1.在中断服务程序中尽量减少对资源的占用,避免复杂的运算和长时间的延时操作。

2.将必要的数据交给主程序处理,减少中断服务程序的工作量。

3.合理设置中断优先级,确保重要的中断能及时响应。

三、电源噪声导致系统不稳定单片机对电源的稳定性要求较高,如果电源存在噪声,则可能导致系统不稳定,甚至崩溃。

解决方法:1.在供电线路上添加合适的滤波电容,以减小电源噪声。

2.使用稳压电源,保证电源输出的稳定性。

3.合理布线,避免电源和信号线的干扰。

四、编程错误编程错误是单片机常见的错误之一、例如,写入错误的寄存器地址、错误的命令、错误的数据等。

解决方法:1.熟悉单片机的手册,了解相关寄存器、命令和数据的使用方法。

2.仔细检查编程代码,避免拼写错误和语法错误。

3.使用调试工具,例如仿真器、逻辑分析仪等,进行实时调试。

五、外围设备连接错误单片机通常需要与外围设备进行通信,如果连接错误,可能导致通信失败或者数据传输错误。

解决方法:1.确保电路连接正确,检查信号线、电源线等的连接是否松动、接触不良。

2.根据外围设备的手册,仔细查阅相关接口的使用说明书,确保连接方式正确。

3.使用示波器、逻辑分析仪等工具,对通信信号进行监测和分析,找出错误原因。

汇编语言常见错误指令解决办法

汇编语言常见错误指令解决办法

(1) MOV DS, 2010H ;立即数不能传送到DS(2) PUSH AL ;栈操作,操作数类型必须为WORD类型(3) MOV DX,[SP] ;SP寄存器不能做间址寄存器(4) IN AL,0A00H ;I/O指令的直接寻址,地址只能为8位(5) XCHG CL,CH ;正确(6) SHR AX,3 ;移位超过一位时,应采用CL寄存器间址(7) AAA CX ;非组合的BCD码加法调整AAA指令应为隐含操作数(8) ADD [BP+DI] ;加法指令ADD,缺少源操作数(9) OUT DX,CL ;I/O指令操作数只能用AX、AL提供,端口地址可以是8位的直接地址或用DX间址(10)CBW BH ;符号扩展指令为隐含操作数(11)ADD 03ECH ;加法指令应为双操作数指令,立即数不能做目的操作数(12)MOV BX, [SI+DI] ;源操作数形式错误,SI和DI不能同时做为间址寄存器(13)MOV DI, [AX] ;AX不能做为间址寄存器(14)OUT 258H, BX ;I/O指令格式错误,见(9)题的解释(15)SHL AX, 3 ;移位指令,位移位数大于1时,应用CL来指明(16)MOV 64H,AL ;立即数不能做为目的操作数(17)ADD AL,6600H ;源、目的操作数的类型不一致(18)MOV[BX],[SI];传送指令中,两个操作数不能同时为存储器操作数(19)XCHG AX,8800H ;交换指令的操作数不能使用立即数(20)MOV AX,[BX+DX];传送指令的源操作数,不能使用立即数(21)LEA BX,1000H;有效地址传送指令的源操作数不能为立即数,必须是存储器操作数(22)DIV 0010H ;正确(23)LEA DX,DI ;同(21)题,源操作数不能为寄存器操作数(24)MUL AX,200H ;乘法指令的目的操作数是隐含的,不能出现在指令中(25)MOV AX, [BX+BP];传送指令中源操作数格式错,BX和BP不能同时为间址寄存器(26)CMP [BX], [SI] ;比较指令的两个操作数不能同时为存储器操作数(27)OUT DX, BX ;I/O指令中,源操作数只能使用AL或AX寄存器(28)AND OFH,AL ;“与”指令中,目的操作数不能使用立即数(29)SAL [BX],CX ;移位指令,移位位移不能用CX寄存器指明(30)JMP FAR [BX+SI] ;转移指令中转移的目标地址表达方式错误;如果是段内间接转移,应为:JMP WORD PTR[BX+SI];如果是段间间接转移,应为:JMP DWORD PTR[BX+SI](31)JNZ AAA;不相等转移指令中,符号地址(标识符)不能使用系统中的保留字(32)JMP NEXT ;正确(33)SBC AX, [DX] ;指令助记符错,源操作数表示方式错(34)MOV CS,DS;段寄存器之间不能传送数据,CS寄存器也不能做为目的操作数(35)ADD DS, AX ;加法指令中段寄存器不能做为操作数(36)MOV AL,CX ;源、目的操作数的类型不一致,见(17)题(37)INC [BX];没有指定存储器操作数类型(38)MOV CL,A8H;源操作数为16进制的立即数,16进制数以字母开头时应在前面加“0”(39)MOV ES,DS ;错同(34)题(40)IN AL,BX ;I/O指令端口地址表示错误,只能用8位立即数或DX 间址。

单片机指令的错误处理和调试方法

单片机指令的错误处理和调试方法

单片机指令的错误处理和调试方法在单片机编程中,指令的错误处理和调试方法是非常重要的。

由于单片机的指令执行过程是逐条执行的,一旦出现错误可能会导致系统崩溃或功能异常。

因此,正确处理指令错误以及有效地进行调试对于保证单片机系统的稳定性和可靠性至关重要。

一、指令的错误处理方法在单片机编程中,常见的指令错误包括语法错误、逻辑错误和运行时错误。

下面将分别介绍这些错误的处理方法。

1. 语法错误处理方法语法错误通常是由于编程人员书写代码时使用了错误的语法或格式造成的。

这种错误在编译时就会被捕捉到,并给出相应的错误提示信息。

处理语法错误的方法是仔细检查代码,找出错误的地方,并根据错误提示信息进行修改。

2. 逻辑错误处理方法逻辑错误是指程序的运行结果与预期结果不符。

这种错误通常需要通过调试的方式进行排查和修复。

常见的调试方法包括断点调试、输出调试和查看变量值。

断点调试是指在代码中设置断点,让程序在指定位置停止执行,然后通过逐步执行和观察变量的值来定位问题所在。

通过单步执行可以逐条地观察指令的执行情况,一步步分析程序的运行流程,从而找出错误。

输出调试是指在关键位置输出相关变量的值,通过观察输出结果来判断程序的执行情况是否符合预期。

可以通过串口输出或者在LCD屏幕上显示的方式进行输出调试。

查看变量值是指在程序运行过程中,通过查看关键变量的值来判断程序是否按照预期执行。

可以使用单片机提供的调试工具或者通过串口输出方式来实现。

3. 运行时错误处理方法运行时错误是指程序在运行过程中出现的错误,比如除零错误、溢出错误等。

这种错误通常需要通过错误处理机制来进行处理,以避免程序崩溃或数据损坏。

常见的处理方法包括异常处理和错误码处理。

异常处理是指在程序出现异常情况时,通过特定的程序逻辑进行处理,保证程序的正常运行。

错误码处理是指在程序出现错误时,通过返回特定的错误码来表示错误类型,并进行相应的处理。

二、指令的调试方法指令的调试是为了确保程序的正确性和稳定性。

单片机中常见的软件bug分析与修复方法

单片机中常见的软件bug分析与修复方法

单片机中常见的软件bug分析与修复方法在单片机开发过程中,软件bug是难以避免的。

这些bug可能会导致系统崩溃、功能异常或不可预测的行为。

因此,准确分析bug并修复它们至关重要。

本文将针对单片机中常见的软件bug,介绍一些分析和修复方法。

1. 编译错误和警告的处理在单片机软件开发过程中,编译错误和警告是最常见的bug。

编译器通常会提供有关错误和警告的详细信息,例如变量未声明、语法错误或类型不匹配等。

开发者应仔细阅读编译器的输出,查找并修复错误和警告。

2. 内存相关问题的解决内存相关问题可能会导致单片机系统异常甚至崩溃。

常见的内存问题包括栈溢出和堆溢出。

栈溢出通常发生在递归调用或局部变量过多的情况下,可以通过增加栈的大小来解决。

堆溢出通常是由于动态分配的内存没有正确释放导致的,应当对内存的分配和释放进行仔细管理。

3. 时序相关问题的分析与调试时序相关问题可能会导致设备无法按照预期的时间表执行任务,从而导致功能异常。

在分析和调试时序问题时,可以使用逻辑分析仪、示波器和调试器等工具来观察信号的时序关系。

还可以通过增添延时、优化中断服务程序或调整时钟频率等方法来修复时序问题。

4. 中断问题的排查和修复中断是单片机系统中常见的机制,用于处理实时事件或外部信号。

中断问题可能导致系统死锁或响应时间延长等问题。

在排查和修复中断问题时,可以检查中断向量表和中断服务程序的正确性。

还可以逐个排查外部中断源是否正常工作,以确保正确触发中断并及时处理。

5. 状态机的设计与调试在单片机程序中,状态机常用于描述复杂的系统行为。

状态机相关的bug可能导致状态转换错误或系统无法恢复。

为了分析和修复状态机问题,可以通过绘制状态转换图或使用状态转换表来更好地理解系统行为。

同时,使用断点调试和仿真工具来观察状态机的状态转换和变量值变化,以找到问题并进行修复。

6. 输入输出问题的分析和修复输入输出问题是单片机系统中常见的bug类型,可能导致设备无法正确响应输入或输出信号。

汇编语言程序常见错误分析

根据上表所反映的情况,笔者作了如下数据统计及分析:1、能正常登录的网站注249个,占调查总体样本容量的68.06%,不能登录的占31.94%,说明甘肃旅游网站的硬件建设依然存在较多问题,或者网站的所有方申请了域名后由于某种原因而放弃了其使用权。

2、在能统计出网站设计建设方的29个网站中,企业/组织自主开发的网站4个,占13.79%;委托其他企业/组织开发的网站25个,占86.21%。

说明甘肃旅游企业或组织缺乏技术,自主开发能力低。

3、能正常登录且能统计主页栏目数网站(45个)的主页栏目数平均值为9.71,这在一定程度上反映出甘肃旅游网站内容较为单一,这可能也是影响浏览量的一个因素。

4、有外文(含中文繁体)版注3网页的网站14个,占能正常登录的网站总数的28.57%,没有建设外文网业的比重较大(71.43%)。

说明甘肃旅游企业/组织的对外意识淡薄。

由于语言障碍,致使甘肃数量众多的优质旅游资源不能直接通过网络来吸引更多的国外游客,这也在一定程度上影响了国际客源地市场的来甘旅游量。

5、有在线预定(包括酒店、机/车票、线路预定等)功能的网站29个,占能正常登录网站总数的59.18%。

说明甘肃旅游企业/组织已经具备了在线交易的意识。

有在线支付功能的网站4个,占有在线预定功能网站总数的13.79%。

说明甘肃旅游网站实际能进行在线交易的很少,绝大部分只是简单的介绍旅游知识和旅游线路等,以信息公布为主要内容,对实现供需双方网上信息即时交换和网上交易等功能不全,不能真正发挥出电子商务网站的作用。

甘肃旅游电子商务仍处于较低发展层次。

6、值得一提的是,兰州雁滩宾馆的网站(yantanhotel.com),只有英文版,而没有中文版,链接的全是外国酒店,且与本酒店经营业务毫无联系。

白银区旅游网(byqtour.com)、崇信旅游网(chongxintour.com)的页面全是英文而无中文,且与旅游毫无联系。

打开甘肃旅游(xoxo113.8u8.com)网站,看到的却是推荐网民注册免费邮箱的信息。

单片机汇编语言错误分析与避免方法


0 引 言
对汇编语言编程来 说 , 片机 内甚至 系统 的硬件 单 资源是完全透明的 , 汇编语 言与指令码 的一一对应性 , 使得任何具有物理或实名地址 的硬件单元都 可 以直接
被 调 用 , 现 出 该 种语 言 的 高效 性 。 体
但是 , 汇编语 言 也有 明显 的不 足之 处 , 主要 有 三 点: 第一 , 必须清晰 明了单片 机的硬 件结构 , 这对一 部
错。 例如使用 CR( I 伪指令 全 。
对于没有使 用操作 系统 的嵌 入式 系统 , 程序初 始
化 部 分 是 非 常 重 要 的 , 堆 栈 指 针 的 重 新 赋 值 到 中 断 从 管 理 寄 存 器 的 设 置 , 参 数 的建 立 到 定 时 器 和 串 口的 从
江西电力职业技术学 院学报
第2 2卷
序段 时 , I 再 加 1变 为 0 H, 需 要 再 循 环 10 CR B 就 0H (5 ) , 不只循 环 l 26 次 而 0次 ,I CR单元 中的计数值才能 重新 回到 0 H, 结果就 可想而知 了。 A 其
序 中使用计数变量都 是常有 的事 。有时人们会直接将 中断服务程序 中使用 的 变量用 到主程 序 ( 子程 序 ) 或
关键词 : 汇编语言; 编程; 错误分析; 避免方法
中 图分 类号 :P 1 T 33
文献标 识码 : B
文章编 号 : 7 — 07 2 1)2 04 — 3 1 3 09 (00 0 — 0 7 0 6
值是否达到要求 。 当然 , 并不是每个 R M 区单元 都要 初始 化赋值 , A 存储运算结果 、 写缓 冲 和显示缓 冲 区, 读/ 都是在 程序
中, CN N ,D T R L 或 “ J E A, I E T 用“ J ER # A A, E ” C N DR C . R L 之类 指令 与各 自的到限值 D T E” A A或 A进行 比较 , 殊 不 知 这 样做 是很 不 可 靠 的 。 由于中断响应 的随机性 , 其断点是无 法预料 的, 如 果在主程序或子程 序执行一 个耗时 的循 环操作 ( 如写 非易失性存储 器或键 盘扫描 等) 或循环 延时 的过程 中 发生 了一次 以上 的定 时器 中断 , 就很 有可能在 程序流 程循环 一次的过程 中 , 中断服务 程序 中的计 数值 已 使 经变化 了两次或更 多次 , 其结果 造成预期 的控 制操作 没有被执行 。

汇编语言常见错误信息解释

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

汇编错误原因

55
Illegal register value
指定的寄存器值不能放入“reg”字段中
56
No immediate mode
指定的立即方式或操作码都不能接收立即数
57
Illegal size for item
引用的项长度是非法的
58
Byte register is illegal
在上下文中,使用一个字节寄存器是非法的
汇编内部出现逻辑错误。
3
Unknown symbol type
符号语句的类型字段中有些不能识别的东西。
4
Redefinition of symbol
在第二遍扫视时,连续地定义了一个符号。
5
Symbol is multi-defined
重复定义一个符号。
6
Phase error between passes
84
Feature not supported be the small Assembler(ASM)
符号没有定义
10
Syntax error
语句的语法与任何可识别的语法不匹配
11
Type illegal in context
指定的类型在长度上不可接收
12
Should have been group name
给出的组名不符合要求
13
Must be declared in pass 1
得到的不是汇编程序所要求的常数值,例如:向前引用的长度
由于操作数不在当前IP段中,因此不能存取
52
Improper operand type
使用的操作数不能产生操作码
53
Relative jump out range
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机汇编语言常见错误分析
一、汇编软件汇编失败原因分析:
这里采用Keil C51 软件包中的宏汇编器A51 作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误会造成
汇编失败,常见的汇编错误如下:1. 标号重复:常见于复制、粘贴程序时忘
记修改标号,造成出现多个相同的标号,标号是不允许重复的。

2.标点符号
以全角方式输入:汇编程序要求标点符号为半角方式,否则汇编失败。

可以
在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易
犯而且不容易发觉的错误。

3.数值#FFH 前遗漏0:根据要求应该在a~f 前加0,写成#0FFH4.字母O 和数字0 搞混:有时候这两个字看上去完全相同,要注意哦~~5.标号后边遗漏”:”6.标号使用了特殊字符:标号不能用指令
助记符、伪指令、特殊功能寄存器名和8051 在指令系统中用的“#”、“@”等,长
度以2~6 字符为宜,第一字母必须是英文字母。

比如:T1、T2、A、B 这些字
符有特定的含义,不允许用于标号。

7.AJMP 跳转超过2K 地址:AJMP 属于短跳转命令,有2K 地址范围的限制。

8.超过地址范围:JB P3.2,EXIT 跳转超过-128~127 个地址范围。

这个是最容易出现的错误!你有可能程序刚才还
能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把JB
P3.2,EXIT 转换成JNB P3.2,LD01AJMP EXITLD01: AJMP EXIT……9.字母I 和数字1 混淆:冒失鬼的常见问题。

10.创造发明不存在的汇编语言指令:在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不
认可。

11.符号“:”“;”最好用半角书写。

二、程序出错:
1.寄存器重复调用:比如主程序中设定了R4=5,表示主程序循环执行5 次,。

相关文档
最新文档