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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

一、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.寄存器重复调用比如主程序中设定了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

相关文档
最新文档