标题: 汇编指令的数据转移为什么总是要经过累加器A [打印本页]

作者: MagicKrse    时间: 2022-7-17 21:50
标题: 汇编指令的数据转移为什么总是要经过累加器A
我看到汇编语言在转移数据的时候很多地方都要经过累加器A,什么情况下必须要经过A来中转之后才能赋值呢?可不可以跳过A直接对特定的地址赋值呢?

图1

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


图2

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






作者: 188610329    时间: 2022-7-18 01:29
标准a51指令的话,图一的可以,图二的不可以。 为什么很多转移需要经过A寄存器,是因为很多操作,都只有对于a寄存器的操作指令。
作者: Hephaestus    时间: 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 其实是非法指令,无法编译通过的。

作者: daemondong    时间: 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的不同汇编指令。
作者: Y_G_G    时间: 2022-7-18 12:22
图一是可以的
你参考答案的图片上的汇编代码,一般这种的是学过C的,也不怎么研究汇编,大多就是参考Keil编译出来的代码修改的以下是一个C代码编译后的汇编代码
你看图片中对R6,R7的操作就知道了,实际上是可以直接操作的,但却要通过A来操作

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


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

所以人们发明了RISC体系扔掉这个造成交通拥堵的“交通枢纽”。
作者: 大漠落日    时间: 2022-7-20 09:14
这个问题涉及内核的设计与实现,不是简单一句话就可以更改的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1