c51单⽚机汇编语⾔语法错误,汇编语⾔单⽚机程序错误分析
【春芽电⼦科技】【汇编语⾔】汇编语⾔单⽚机程序错误分析
⼀、 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⾏号处