论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 1084阅读
  • 4回复

[技术文章]汇编语言常见错误分析 [复制链接]

上一主题 下一主题
离线shuszhao
 

性别:
帅哥
发帖
18011
金币
36411
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2018-01-15
一、汇编软件汇编失败原因分析 h r!Htew4  
这里采用Keil C51软件包中的宏汇编器A51作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误会造成汇编失败,常见的汇编错误如下: ]/y&5X  
  1. 标号重复: hiN6]jL|O  
    常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。
2.标点符号以全角方式输入: (!^(74  
编程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。
8}0O @ wq  
3.数值#FFH 前遗漏0: RW@sh9  
根据要求应该在a~f前加0,写成#0FFH
^KsiTVY  
4.字母O和数字0搞混: -r!N; s$t  
有时候这两个字看上去完全相同,要注意哦~~
{t;{={$  
5.标号后边遗漏":" ,&\uuD&.@  
6.标号使用了特殊字符: ;&Oma`Ec  
标号不能用指令助记符、伪指令、特殊功能寄存器名和8051在指令系统中用的“#”、“@”等,长度以2~6字符为宜,第一字母必须是英文字母。比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。 nD$CY K  
7.AJMP跳转超过2K地址: ?r,lgaw  
AJMP属于短跳转命令,有2K地址范围的限制。 ,\FJVS;NeJ  
8.超过地址范围: u K`T1*_  
JB P3.2,EXIT跳转超过-128~127个地址范围。这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把 n0T'"i[  
JB P3.2,EXIT 'RlPj 0Cg  
转换成 ;J[1S  
JNB P3.2,LD01 v_gQCS  
AJMP EXIT `.FvuwP  
LD01: AJMP EXIT :(|;J<R%_  
…… ]tVU$9D   
9.字母I和数字1混淆: &a>fZ^Y=k  
冒失鬼的常见问题。 @Ee'nP   
10.创造发明不存在的汇编语言指令: 0r?}LWjf  
在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。 kphv)a4z=  
11.符号“:”“;”最好用半角书写。 XZv(B^  
二、程序出错 ;-d }\f ,  
1.寄存器重复调用: ]Xur/C2A  
比如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。 wnL\.%Y^  
2.硬件不熟悉: /h ef3DV5I  
单片机一般采用下拉输出,往往端口输出0驱动外设工作,和常见的正逻辑相反,容易搞错。 8gv \`  
三、指令系统常用符号和含义 E0<9NF Qr7  
(1)Ri:工作寄存器0和工作寄存器1,i=0或1。即R0~R1。 S3[rv  
(2)Rn:工作寄存器R0~R7,n=0~7。 %r0yBK2uOp  
(3)@Ri:寄存器Ri间接寻址8位存储器单元00H~FFH。 8} \Lt  
(4)direct:8位直接地址,它可以是内RAM 00H~7FH或SFR的80H~FFH。 dooS|Mq  
(5)#data:8位立即数。 0@yHT-Dy  
(6)#data16:16位立即数。 [lqwzW{(UN  
(7)addr16:16位目的地址。用于LCALL和LJMP指令,能调用或转移到64K程序存储器空间的任何地方。 ^1vh5D  
(8)addr11:11位目的地址。用于ACALL和AJMP指令,可在下条指令地址所在的2K字节页面内调用或转移。 c]>s(/}T  
(9)rel:带符号的8位偏移地址,用于SJMP和所有的条件转移指令。其范围是相对于下一条指令第1字节地址的-128~+127个字节。 $/aZ/O)F  
(10)DPTR:数据指针,可用作16位的地址寄存器。 Y{TzN%|LV  
(11)bit:位地址。片内RAM中的可位寻址及SFR中的可寻址位。 X=Q)R1~6v  
(12)A:累加器Acc。 F#X&Tb{  
(13)B:通用寄存器,主要用于乘法MUL和除法DIV指令中。 XHgwK @GU  
(14)Cy:进位标志位或布尔处理器中的累加器。 vs/.'yD/C  
(15)@:间接寄存器或基址寄存器的前缀。如@Ri,@DPTR,@A+PC,@A+DPTR。 0sv#* &0=  
编写汇编语言的忠告 c|lo%[]R!  
要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序、按键消抖子程序等编写实践一次,这样印象深刻,便于以后引用。 0Ii* "?s  


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线郑先生

性别:
帅哥
发帖
6562
金币
6414
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2018-01-15


离线小丫

性别:
人妖
发帖
1625
金币
499
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2018-01-15


离线h09721

性别:
人妖
发帖
7999
金币
7166
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2021-08-24


离线

性别:
帅哥
发帖
3827
金币
3093
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 2021-08-26


快速回复
限150 字节
 
上一个 下一个