找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2681|回复: 7
打印 上一主题 下一主题
收起左侧

汇编指令的数据转移为什么总是要经过累加器A

[复制链接]
跳转到指定楼层
楼主
我看到汇编语言在转移数据的时候很多地方都要经过累加器A,什么情况下必须要经过A来中转之后才能赋值呢?可不可以跳过A直接对特定的地址赋值呢?

图1

上面这个程序的红圈部分可不可以改成:
MOV 30H, DPH
MOV 31H, DPL


图2

还有上图的程序,可不可以改成:
MOV DPTR, #4000H
MOVX 40H, @DPTR





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-7-18 01:29 来自手机 | 只看该作者
标准a51指令的话,图一的可以,图二的不可以。 为什么很多转移需要经过A寄存器,是因为很多操作,都只有对于a寄存器的操作指令。
回复

使用道具 举报

板凳
ID:883242 发表于 2022-7-18 02:12 | 只看该作者
本帖最后由 Hephaestus 于 2022-7-18 02:18 编辑

这就是CISC和RISC体系的区别了,CISC围绕着一个ACC来运转,RISC围绕一堆寄存器文件来运转,并不需要经过ACC。早期RISC并没有普及就是因为这种体系要用到的内存是CISC的120~150%,而内存非常昂贵。同样道理,楼主的代码可以运行,但是你看看你编译成的机器码要比通过ACC的大得多,执行时间也要慢,现在内存便宜这么做也可以,但是内存利用率和时间效率都比较差。对于某个应用这么做看不出什么差异,但一个大型程序的性能就是这么多细节累积出来的。
没仔细看,MOVX 40H, @DPTR 其实是非法指令,无法编译通过的。
回复

使用道具 举报

地板
ID:827243 发表于 2022-7-18 08:50 | 只看该作者
Hephaestus 发表于 2022-7-18 02:12
这就是CISC和RISC体系的区别了,CISC围绕着一个ACC来运转,RISC围绕一堆寄存器文件来运转,并不需要经过ACC ...

正解,这就是为什么不同的CPU都有不同汇编指令, 需要你去研读这些指令文档,了解每条指令的用法,而不能想当然的写出 MOVX 40H, @DPTR, 这指令51系列的CPU就不支持。 这也是为什么要学习C语言的原因,C语言对不同CPU来说,相对都一样,只是通过不同的编译器编译为不同CPU的汇编代码,使用起来就比较方便了,不用考虑CPU的不同汇编指令。
回复

使用道具 举报

5#
ID:401564 发表于 2022-7-18 12:22 | 只看该作者
图一是可以的
你参考答案的图片上的汇编代码,一般这种的是学过C的,也不怎么研究汇编,大多就是参考Keil编译出来的代码修改的以下是一个C代码编译后的汇编代码
你看图片中对R6,R7的操作就知道了,实际上是可以直接操作的,但却要通过A来操作

这个只是8051的汇编系统是这样子的而已,并不是所有的汇编都支持寄存器之间数据直接传送的,主要是半导体制造成本限制
图二是不行的,至于原因就是8051的汇编系统就是这么规定的

回复

使用道具 举报

6#
ID:121859 发表于 2022-7-18 14:35 | 只看该作者
A累加器就好比交通枢纽,南来北往东去西来都得经过这里,所以大部分指令都需要借助这个枢纽到达彼岸。
回复

使用道具 举报

7#
ID:883242 发表于 2022-7-18 18:02 | 只看该作者
zhxiufan 发表于 2022-7-18 14:35
A累加器就好比交通枢纽,南来北往东去西来都得经过这里,所以大部分指令都需要借助这个枢纽到达彼岸。

所以人们发明了RISC体系扔掉这个造成交通拥堵的“交通枢纽”。
回复

使用道具 举报

8#
ID:195496 发表于 2022-7-20 09:14 | 只看该作者
这个问题涉及内核的设计与实现,不是简单一句话就可以更改的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表