【春芽电子科技】【汇编语言】汇编语言单片机程序过错剖析
一、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行号处