注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

III = Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

A和ACC区别  

2017-07-20 17:18:06|  分类: C51(C&ASM) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们在很多51单片机的教材和资料上,可以看到类似的描述:
与运算器相关的寄存器(3个):ACC、B和PSW。ACC是累加器是单片机中最繁忙的寄存器……,实际编程时,ACC用A表示。这个地方就很容易让人产生误解,以为A和ACC是一样的。例如,我们要把R7中的数据移动到累加器中,用语句:
MOV ACC,R7
或者
MOV A,R7
好像程序运行起来并没有什么差别。
然而实际情况并非如此,累加器写成A或ACC在51汇编语言指令中是有区别的。根本的原因是:ACC在汇编后的机器码必有一个字节的操作数,即累加器的字节地址E0H,A在汇编后则隐含在指令操作码中。所以在指令中A不能用ACC来替代,而对A的特殊功能寄存器直接寻址和累加器某一位的寻址要用ACC,而不能写成A。
例如,指令INC A对应记得机器码是04H,而写成INC ACC后则成了INC direct的格式,对应机器码为05E0H,其中E0就是累加器的地址。
又比如,指令XRL A,#data,对应的机器码是64(data)H,即XRL A,#4BH对应的机器码是两字节的644BH,而指令XRL ACC,#data,对应的机器码是63E0(data)H,即XRL ACC,#4BH对应的机器码是三字节的63E04BH,其中E0是ACC的地址,而4B则是直接数。
此外,用A和用ACC,导致很多时候周期数也不同,例如,INC A和INC ACC的虽然都是1,但是像XRL A,#data和XRL ACC,#data的周期数则分别是1和2。在一般使用时这点差别问题不大,但是在涉及到一些严格计时方面,还是存在差别的。

ACC是地址为E0H的寄存器,A是标准的无地址的累加器,但两者在值是等同的。A表示了累加器中的内容寄存器寻址,ACC表示了累加器的地址直接寻址

在使用上,请留意如下几种情况:
一、都可以用
0. 在MOV,INC/DEC及ADD/SUB等算数运算等指令中A和ACC都能用,ANL/ORL等两个操作数的逻辑运算也可以用A或者ACC,但要注意机器码和周期数的不同。
二、只能用ACC不能用A
1. 要进行位寻址时,必须用ACC,比如要写成ACC.7,而不能写成A.7。
2. PUSH/POP操作只能用ACC,不能用A。其实原因和1类似,因为PUSH/POP接受的操作数类型是direct。这个比较特殊,记这个就行。
三、只能用A不能用ACC
绝大部情况下,用A比用ACC的情况更多,而且速度也更快,下面的几个情况就是只能用A不能用ACC:
3. MOVC/MOVX只能用A不能用ACC。变址寻址和外部RAM的读写操作只能用A。
4. XCH/XCDH/SWAP只能用A不能用ACC。因为没有类似XCH direct,* 之类的指令。
5. 十进制调整DA、单操作数逻辑运算如RL/RLC等也只能用A不能用ACC。
  评论这张
 
阅读(91)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017