编写汇编语言常见错误分析

谁的谁心疼 2009-08-04 01:10:46
一、 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:\001.txt 注意asm51后面要加空格。
2.如果汇编软件出现**Dos File I/O error **提示字样说明是汇编文件的路径出错。第一要注意MASM51软件的安装路径中不能出现中文名称,例如汇编软件安装在D:\单片机\下面,第二要汇编的文件的路径中也不能出现中文名称,例如D:\单片机\001.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行号处
...全文
485 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qglxx 2009-08-04
  • 打赏
  • 举报
回复
学习了

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧