首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么6502微控制器没有算术右移?

为什么6502微控制器没有算术右移?
EN

Stack Overflow用户
提问于 2019-01-25 02:45:24
回答 4查看 2.5K关注 0票数 4

我正在努力理解旧的微控制器的指令集,特别是6502。

可以找到这里的指令集的文档列出了两个移位指令(在旋转指令旁边):

ASL -算术左移

LSR -逻辑移位右移

为什么没有算术移位右移和逻辑移位左移指令?

我知道,一个人可以简单地给自己添加一个数字,在逻辑上把它移到左边,但是一个专用的指令会更方便,也会更快,即使它就是这样做的。但是缺少一个正确的算术变换指令对我来说是没有意义的。

EN

回答 4

Stack Overflow用户

发布于 2019-01-29 10:15:07

我一直认为这对特殊的指令是个骗局。在原始的6502上根本没有算术移位。算术移位保留被移位的数字的符号,而所谓的ASL仅仅因为6502使用2的补码而做到这一点。

原始的6502只有两个移位操作:右移和左移,位移到进位标志,位移位设置为零。对于带有2的补码的移位,算术和逻辑没有区别。然而,对于右移位,算术移位必须保留符号位。这意味着,要做到这一点,您需要电路将输入的顶部位传播到移位器到输出的顶部位,并需要一条额外的控制线来在这和0之间进行选择。这些都需要更多的晶体管,并且可以通过旋转来模拟算术移位。

代码语言:javascript
复制
    CLC
    LDA number
    BPL positive
    SEC
positive:
    ROR A

6502的设计背后的主要驱动因素是以更低的价格使其性能优于摩托罗拉6800。这是通过从6800中剥离不必要的功能来实现的,这样他们就可以使晶体管的数量尽可能低。6502的晶体管计数约为3500。早期的6800晶体管数量约为4500。因此,忽略了一些无关紧要的特征,如适当的算术变换。

事实上,考虑到移动可以通过清除进位标志,然后进行旋转来模拟,我很惊讶他们会对它们感到困扰。设计者一定发现他们可以以最小的复杂度增加移位指令,就像SBC指令和ADC指令完全一样,但是第二个操作数的位是倒的。

票数 4
EN

Stack Overflow用户

发布于 2019-03-02 23:02:25

左的逻辑移位和左的算术移位是一样的,因此不需要区分两者。其他平台的许多汇编程序认为LSL和ASL助记符是同义词(例如ARM)。

由于缺少正确的算术移位,您可以始终执行CMP #80/ROR A来在累加器上执行算术移位。

票数 4
EN

Stack Overflow用户

发布于 2019-01-25 05:36:27

为什么没有算术移位正确指令,为什么寄存器这么少,为什么没有乘法/除法指令,为什么没有SIMD,为什么没有浮点支持,为什么没有MMU,.?

回到设计6502时,晶体管的数量和CPU的复杂性都受到了限制(按现代标准来说比较严重)。人们做出了牺牲,使之成为一个可行的设计和制造,并签署整数是“几乎不需要”。

注意:使用“已签名”的主要原因是C(和后来的语言)有错误的默认值(除非您告诉所有整数,否则它假定“已签名”),而且当不需要签名时,人们太懒得键入“无符号”;因此,许多软件使用(稍微昂贵一些)签名算术,而不是因为懒惰。通常,在大多数情况下,您确实需要处理“真实世界的值”和浮点数(如数组索引、地址/指针、大小、字符/代码点、像素值、距离、.当然都没有签名)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54358314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档