编写汇编语言常见错误分析:一、MAS51汇编软件汇编失败原因分析:单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误汇会造成汇编失败,常见的汇编错误如下:1.标号重复常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。2.标点符号以全角方式输入MAS51程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。3.注释太长有时为了以后读懂程序,写了很长的注释,站长发现超过20个汉子时也会造成汇编失败,解决办法可以将太长的注释分成多个注释。4.数值#FFH前遗漏0,根据要求应该在a~f前加0,写成#0FFH5.字母O和数字0搞混有时候这两个字看上去完全相同,要注意哦~~6.标号后边遗漏:7.标号使用了特殊字符,比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。8.AJMP跳转超过2K地址,AJMP属于短跳转命令,有2K地址范围的限制。9.JBP3.2,EXIT跳转超过-128~127个地址范围。这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把JBP3.2,EXIT转换成JNBP3.2,UUUAJMPEXITUUU:10.字母I和数字1混淆,冒失鬼的常见问题。11.创造发明不存在的汇编语言指令,在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。12.符号“:”“;”最好用半角书写。二、程序出错:1.寄存器重复调用比如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。2.硬件不熟悉单片机一般采用下拉输出,往往端口输出0驱动外设工作,和常见的正逻辑相反,容易搞错。想想我自己,还不只一次犯这样的错误.要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序、按键消抖子程序等编写实践一次,这样印象深刻,便于以后引用。常见汇编语言指令解释:1.Rn表示R0~R7中的一个2.#data表示8位的数值00H~FFH3.direct表示8位的地址00H~FFH4.@Ri表示寄存器间接寻址只能是R0或者R15.@DPTR表示数据指针间接寻址6.bit表示位地址7.$表示当前地址寄存器寻址MOVA,R1将R1中的数值赋予A直接寻址MOVA,3AH将地址3AH中的数值赋予A立即寻址MOVA,#3AH将3AH数值赋予A寄存器间址MOVA,@R0将R0中地址的数值赋予A变址寻址MOVCA,@A+DPTR以A中的数值为地址偏移量进行查表相对寻址AJMPMATN跳转到行号为MATNC处位寻址MOVC,7FH将位地址7FH的数值赋予CMOVA,#3AH数据传输、赋值命令PUSHdirect将direct为地址的数值压入堆栈中POPdirect将direct为地址的数值弹出堆栈XCHA,direct将direct中的数值与A进行交换ADDA,direct将direct中的数值与INCdirect将direct中的数值加1SUBBA,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零CLRCDECdirect将direct中的数值减1DAA用于对BCD码加减法后进行10进制调整MULAB将A和B相乘,并把高八位放在B中,低八位放在A中DIVAB将A和B相除,并把商放在A中,余数放在B中ANLA,direct将A与direct中的数值进行与运算,结果保留在A中(与运算规律:有0出0,全1出1)ORLA,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0)XRLA,direct将A与direct中的数值进行异或运算,结果保留在A中(异或运算规律:全0出0,全1出0,01、10出1)CRLA对A清零CPLA对A取反RLA对A中数右移RRA对A中数左移RLCA对A中数带Cy右移RRCA对A中数带Cy左移SWAPA对A中的数高4位低4位互相交换LJMP长跳转指令,64K地址范围AJMP短跳转指令,2K地址范围JZrel如果A为0就跳转到rel行号处JNZrel如果A不为0就跳转到rel行号处CJNEA,#data,rel如果A不等于data就跳转到rel行号处DJNZR1,rel如果R1减1后不为0就跳转到rel行号处ACALLrel调用rel子程序,2K地址以内LCALLrel调用rel子程序,64K地址以内RET子程序返回指令RETI中断程序返回指令NOP空操作指令MOVC,bit将位地址bit中的值赋予CCRLbit将bit位地址清0SETBbit将bit位地址置1CPLbit将bit位地址取反ANLC,bit将地址bit中的值和C做与运算,结果存放在C中ORLC,bit将地址bit中的值和C做或运算,结果存放在C中JCrel如果Cy为1,就跳转到rel行号处JNCrel如果Cy为0,就跳转到rel行号处