微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 汇编语言单片机程序错误分析

汇编语言单片机程序错误分析

时间:11-27 来源:互联网 点击:

汇编语言单片机程序错误分析

一、MAS51汇编软件汇编失败原因分析

单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误汇会造成汇编失败,常见的汇编错误如下:
1.标号重复常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。
2.标点符号以全角方式输入MAS51程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。
3.注释太长有时为了以后读懂程序,写了很长的注释,站长发现超过20个汉子时也会造成汇编失败,解决办法可以将太长的注释分成多个注释。
4.数值#FFH前遗漏0,根据要求应该在a~f前加0,写成#0FFH
5.字母O和数字0搞混有时候这两个字看上去完全相同,要注意哦
6.标号后边遗漏":"
7.标号使用了特殊字符,比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。
8.AJMP跳转超过2K地址,AJMP属于短跳转命令,有2K地址范围的限制。
9.JB P3.2,EXIT跳转超过-128~127个地址范围。这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把
JB P3.2,EXIT
转换成
JNB P3.2,UUU
AJMP EXIT
UUU:
10.字母I和数字1混淆,冒失鬼的常见问题。
11.创造发明不存在的汇编语言指令,在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。
12.符号“:”“;”最好用半角书写。
使用汇编软件常见问题解答:
1.如果汇编软件出现** Unrecongnized Command **提示字样说明是汇编命令输入错误。正确的汇编命令是asm51 d:01.txt注意asm51后面要加空格。
2.如果汇编软件出现**Dos File I/O error **提示字样说明是汇编文件的路径出错。第一要注意MASM51软件的安装路径中不能出现中文名称,例如汇编软件安装在D:单片机下面,第二要汇编的文件的路径中也不能出现中文名称,例如D:单片机01.TXT。当文件后缀不是asm时,后缀不能省略。
二、程序出错
1.寄存器重复调用比如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。
2.硬件不熟悉单片机一般采用下拉输出,往往端口输出0驱动外设工作,和常见的正逻辑相反,容易搞错。
以上是站长学单片机时发生的不止一次的错误!!
编写汇编语言的忠告:
要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序、按键消抖子程序等编写实践一次,这样印象深刻,便于以后引用。
常见汇编语言指令解释:
1.Rn表示R0~R7中的一个
2.#data表示8位的数值00H~FFH
3.direct表示8位的地址00H~FFH
4.@Ri表示寄存器间接寻址只能是R0或者R1
5.@DPTR表示数据指针间接寻址
6.bit表示位地址
7.$表示当前地址
寄存器寻址MOV A,R1将R1中的数值赋予A
直接寻址MOV A,3AH将地址3AH中的数值赋予A
立即寻址MOV A,#3AH将3AH数值赋予A
寄存器间址MOV A,@R0将R0中地址的数值赋予A
变址寻址MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表
相对寻址AJMP MATN跳转到行号为MATNC处
位寻址MOV C,7FH将位地址7FH的数值赋予C
MOV A,#3AH数据传输、赋值命令
PUSH direct将direct为地址的数值压入堆栈中
POP direct将direct为地址的数值弹出堆栈
XCH A,direct将direct中的数值与A进行交换
ADD A,direct将direct中的数值与
INC direct将direct中的数值加1
SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零CLR C
DEC direct将direct中的数值减1
DA A用于对BCD码加减法后进行10进制调整
MUL AB将A和B相乘,并把高八位放在B中,低八位放在A中
div AB将A和B相除,并把商放在A中,余数放在B中
ANL A,direct将A与direct中的数值进行与运算,结果保留在A中(与运算规律:有0出0,全1出1)
ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0)
XRL A,direct将A与direct中的数值进行异或运算,结果保留在A中(异或运算规律:全0出0,全1出0,01、10出1)
CRL A对A清零
CPL A对A取反
RL A对A中数右移
RR A对A中数左移
RLC A对A中数带Cy右移
RRC A对A中数带Cy左移
SWAP A对A中的数高4位低4位互相交换
LJMP长跳转指令,64K地址范围
AJMP短跳转指令,2K地址范围
JZ rel如果A为0就跳转到rel行号处
JNZ rel如果A不为0就跳转到rel行号处
CJNE A,#data,rel如果A不等于data就跳转到rel行号处
DJNZ R1,rel如果R1减1后不为0就跳转到rel行号处
ACALL rel调用rel子程序,2K地址以内
LCALL rel调用rel子程序,64K地址以内
RET子程序返回指令
RETI中断程序返回指令
NOP空操作指令
MOV C,bit将位地址bit中的值赋予C
CRL bit将bit位地址清0
SETB bit将bit位地址置1
CPL bit将bit位地址取反
ANL C,bit将地址bit中的值和C做与运算,结果存放在C中
ORL C,bit将地址bit中的值和C做或运算,结果存放在C中
JC rel如果Cy为1,就跳转到rel行号处
JNC rel如果Cy为0,就跳转到rel行号处

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top