为什么单片机51汇编程序,累加器有时候要写成ACC,有时候却要写成A 。否则都会报错?

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-01
51单片机汇编语言中的A和ACC,这是同一个寄存器呀。同一个寄存器可以有2个名称么?

是同一个。

写成 A,是寄存器寻址。
写成 ACC,是直接寻址。

在 PUSH、POP 指令中,必须使用直接寻址,写成 A 就错了。
在必须使用寄存器寻址的时候,也不可用 ACC 来代替。

计算机,包括单片机内只有二进制的数据,十六进制,十进制都是写程序时方便,具体转为程序时,全部要换回二进制。

这是51的系统架构决定的。因为51累加器有2个地址,一是特殊功能寄存器地址,指令使用这个地址访问累加器,是已明确知道访问对象就是累加器,是专指的,这是用A表示。比如ADD A,03H,因为在51中,ADD 的第一对象就是累加器,而不能用别的寄存器,用A可以少打俩字母CC。
另外一个是累加器的直接内存地址,指令访问时并不明确访问对象是什么,因为访问地址是程序员编程决定的。比如PUSH/POP指令,在51的定义里是PUSH/POP direct,这个direct可以是0~255。指令事前并不知direct到底是多少,这时将direct写成ACC,编译器就找到默认的地址E0H,而将它编译出来。
如果你熟悉51单片机,应不会有这样的疑问。不过,不管是否熟悉51系统,开始时尽管讲累加器些成A.,而不写成ACC。当编译器提示出错时,将A 改成ACC即可。所以这样做的原因,是因为大多数51中访问特殊功能寄存器的速度要比访问直接地址内存快,特别累加器的特殊功能寄存器地址,访问速度时最快的。
类似的情况还存在通用寄存器组R0~R7上。它们跟累加器一样同时有寄存器地址和直接内存地址,有的编译器如果 Keil 将它们的直接内存地址写成AR0~AR7。访问寄存器地址也比访问内存地址快。

acc is register. a is a unseparatable part of opcode.

在mov指令中可通用,用"a"时为2字节1周期;用"acc"时为3字节2周期。
在mov指令中可通用,用"a"时为2字节1周期;用"acc"时为3字节2周期。
尽管物理地址相同,但push是对寄存器操作,而movx是对累加器操作。
尽管物理地址相同,但push是对寄存器操作,而movx是对累加器操作。

写程序,给人看,就可以随意一些。

如果想用软件来编译,你就必须按照这个软件要求的格式来写。

各种编译软件,要求的格式,不完全相同。
常用什么软件?
摸透它的脾气,即可令它为我们干活。

也许是汇编语言的规定吧

  • 为什么单片机51汇编程序,累加器有时候要写成ACC,有时候却要写成A...
    答:这是51的系统架构决定的。因为51累加器有2个地址,一是特殊功能寄存器地址,指令使用这个地址访问累加器,是已明确知道访问对象就是累加器,是专指的,这是用A表示。比如ADD A,03H,因为在51中,ADD 的第一对象就是累加器,而不能用别的寄存器,用A可以少打俩字母CC。另外一个是累加器的直接内存...
  • RL51单片机汇编中的RL
    答:在RL51单片机的汇编语言中,有一个专门的指令用来处理累加器A的循环移位。这个指令的表示形式为"RL A",它的功能是将累加器A的每一位向左移动一位,同时将A的最低位(A.0)置为原最高位(A.7)的值。值得注意的是,这个操作并不影响标志位,保持它们的原始状态。当累加器A的最高位(D7)为0时...
  • 51单片机指令累加器A是8,但为何有这样的指令MOV A,@ DPTR的是什么?累了...
    答:51单片机的累加器A是8位的,51单片机的指令存储器的内容,也是8位的。51单片机的指令存储器的地址号码,却是16位的。正确指令是:MOVC A,@A + DPTR 这是从一个16位地址的单元中,取出8位的内容,送到A。
  • 关于汇编语言中累加器的问题
    答:呵呵,好像是MCS-51单片机的汇编语言呐,大家别误解了。在Keil编译系统里面,累加器A,有时也可以写成ACC;另外,也可以使用它的地址进行数据传送,地址是E0H。使用地址代替A的时候,指令代码会多一个字节。
  • c51单片机的累加器属于寄存器吗?
    答:51中的累加器是寄存器,但也是51中最NB的寄存器,有很多操作必须通过累加器才能执行,正是这一点也限制了51单片机的性能。加减乘除都必须通过累加器,当然,如果你把某个数据临时的放在累加器中也可以,只是你必须当心,别让其他的指令把累加器覆盖了。
  • 51单片机汇编语言 累加器问题
    答:51单片机是8位机,传送类到累加器的指令不可能一次送16位数据的,所以不存在剩下八位的数据问题,只有给DPTR赋值的语句,才可能出现十六位数据的情况。
  • 51单片机中累加器A到底是属于CPU还是属于特殊功能寄存器?有人能给详...
    答:累加器ACC(在程序里一般简写为A)是特殊功能寄存器。但特殊功能寄存器也属于8位CPU的一个部分。详细解释请找8051的数据说明书datasheet。intel的版本!
  • 在51系列单片机的指令系统中,其加法,减法,乘法和除法必须又累加器A
    答:是的,乘法和除法的两个运算数必须是一个放在累加器A中,另一个在寄存器B中,运算结果也是商放在A 中,余数放在B 中,积的高位放A中,低位放B 中,除一些自减1运算可以在其它寄存器中进行, 加减法的一个操作数也放要在A中,你看一下51单片机的运算指令就明白了 ...
  • 51单片机汇编CJNEA,30H,LOOP这句是什么意思?
    答:这条指令通常用于循环结构中,以判断循环次数或条件是否满足。在 51 单片机汇编语言中,CJNE 是一个条件跳转指令,A 是累加器,30H 是一个常数,LOOP 是一个标签,代表一个地址。具体到使用方法,首先要确保仿真器正确地插入了用户板上的 CPU 插座,并且仿真器由用户板供电。然后,将仿真器的串行电缆...
  • 51单片机的累加器 如果里面有数 再往里面放一个数 那现在的数就是两个...
    答:当然不是,再放一个数原来数就没了,如果要计数加,汇编用ADD指令