【春芽电子科技】【汇编语言】汇编语言单片机程序错误分析
一、 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行号处
上一篇:单片机程序C语言与汇编语言混合编程
下一篇:SD卡SPI读写子程序以及SD卡设置成SPI总线的操作
推荐阅读最新更新时间:2024-03-16 14:31
设计资源 培训 开发板 精华推荐
- 下载Intel《赢得大资料爆炸——大资料、智慧系统与物联网的时代》白皮书
- 下载有礼|是德科技电子书 《通过了解测试精度的基础知识, 提高良率并降低风险》,不做“差不多先生”
- 趣味电子技术史话栏目开播啦!第一集:白炽灯到底是谁发明的?
- 有奖直播|TI 毫米波雷达传感器在智能家居及智能安防中的应用
- 抢先体验NUCLEO家族新贵,ST STM32 NUCLEO-F091RC开发板28元包邮!
- Keysight教你如何提高测试精度,答对问题还有礼品相送,速速参与!
- 免费申请|Maxim 高性能模拟工具包(内含78个器件)
- 【你晒单我送礼】免费申请TI样品,晒单赢礼 !
- 【已结束】 Qorvo、村田、NI直播【UWB最新技术、方案、市场、应用解析】(13:30开始入场)