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

发布者:huanran最新更新时间:2015-09-10 来源: eefocus关键字:汇编语言  单片机程序  错误分析 手机看文章 扫描二维码
随时随地手机看文章
【汇编语言】汇编语言单片机程序错误分析

【春芽电子科技】【汇编语言】汇编语言单片机程序错误分析

一、 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

STC12C5A60S2单片机的DS18B20的C程序
最近在搞18B20,发现其对CPU的不兼容性很高,由于其对时间信号的敏感引起的 由于STC单片机的速度比8051速度快,属于1个时钟/机器周期高速单片机。速度快当然是它的优点,但对于要移植传统的8051程序而言,需要修改时序来实现某功能. 以下程序是ds18b20简单的驱动程序,其实是在网上Down的,经本人稍作修改之后,在STC12C5A60S2中调试通过的,最后读温度返回一个unsigned int,低12位就是温度数据。在主程序里进行运算即可得到实际温度值。呵呵~~ void delay_18B20(unsigned int i) { while(i--); } void Init_DS18B20(vo
[单片机]
LCD12864万年历单片机程序+实物制作+Proteus仿真
制作出来的LCD12864万年历实物图如下: LCD12864万年历仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 电路原理图如下: 单片机源程序如下: *----------------------------------------------- 名称:12864字库液晶显示 内容:通过显示字符、数字、汉字和图片测试液晶基本功能 ------------------------------------------------*/ #include reg52.h #include intrins.h #include delay.h sbit RS = P3^5; sbit RW = P3
[单片机]
LCD12864万年历<font color='red'>单片机</font><font color='red'>程序</font>+实物制作+Proteus仿真
基于51单片机制作的波形发生器Proteus仿真程序
仿真原理图如下 单片机源程序如下: #include reg51.h sbit wr=P3^6; sbit rd=P3^2; sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit key4=P1^4; unsigned char flag;//flag为0、1、2、3、4时分别为正弦波、方波、三角波、梯形波、锯齿波 unsigned char const code ZXB_code ={ 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2, 0xa5,0xa8
[单片机]
基于51<font color='red'>单片机</font>制作的波形发生器Proteus仿真<font color='red'>程序</font>
51单片机+LCD1602电子密码锁程序
24c02采用IIC与单片机通信,其详细通信时序参考24C02数据手册。我们只需使用At24c02Read(unsigned char addr)和At24c02Write(unsigned char addr,unsigned char dat)即可。 一、实验现象 将线连接好并将程序下载后,可以看到1602上显示: 此时可以按下任意键继续 在这里我们可以“1”或“9”选择开锁或者是修改密码。如果这里选择的开锁,按下确定键,此时会提示输入密码,初始密码默认为888888,输入密码 然后按下确定键,如果密码正确则会显示: 并且可以看到继电器模块指示灯亮并可以听到继电器闭合的声音。 如果密码错误则会提
[单片机]
51<font color='red'>单片机</font>+LCD1602电子密码锁<font color='red'>程序</font>
基于AVR单片机Atmega16的ADC采集数码管显示仿真程序
电路图 用到的数码管是7SEG-MPX4-CC。 程序代码 #include mega16.h #include delay.h #define uchar unsigned char #define uint unsigned int flash char led_7 = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; flash char position = {0xe0, 0xd0, 0xb0, 0xf0}; char ad ; //数码管显示函数 void display() { char i; for (i = 0;
[单片机]
基于AVR<font color='red'>单片机</font>Atmega16的ADC采集数码管显示仿真<font color='red'>程序</font>
单片机控制的步进电机PWM控制程序
8051单片机控制步进电机的C51语言编写的PWM控制程序 #include intrins.h #include stdio.h #include math.h #include UPSD3200.H #include upsd_pwm.h #define uint unsigned int #define uchar unsigned char PSD_REGS PSD8xx_reg _at_ csiop; #define KEYIO (~(PSD8xx_reg.DATAIN_A)) & 0x07 sbit CP=P4^7; sbit U_D=P1^1; void init_system(); // 系统初
[单片机]
PIC单片机引脚中断程序设计技巧
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,
[单片机]
基于51单片机的各种花样的流水灯c51程序
/*----------------------------------------------- 功能:流水灯对称移动闪烁(双闪烁) ------------------------------------------------*/ #include REG52.H #define uint unsigned int void delay(uint); main() { uint comp1=0xfe; uint comp2=0x80; P1=0x7e; delay(30000); while(1) { P1=0xff; comp1 =1;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved