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

问题描述 投票:1回答:3

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

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

ASL - 算术左移

LSR - 逻辑右移

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

我知道人们可以简单地为自己添加一个数字,从逻辑上将它移到左边,但是专用指令会更方便,也更快,即使它就是这样。但缺少算术右移指令对我来说没有意义。

assembly bit-shift arithmetic-expressions instruction-set 6502
3个回答
3
投票

左边的逻辑移位与左移算术相同,因此无需区分这两者。许多其他平台的汇编程序将LSL和ASL助记符视为同义词(例如ARM)。

至于缺少算术右移,你总是可以做CMP#80 / ROR A来在累加器上执行算术右移。


2
投票

我一直认为这对特定的指令有点像骗局。在原始6502上根本没有算术移位。算术移位保留了被移位的数字的符号,所谓的ASL只能通过6502使用2的补码来实现。

原始6502仅具有两个移位操作:向右移位和向左移位,其中移位的位转移到进位标志,并且位移位被设置为零。对于带有2的补码的移位,算术和逻辑之间没有区别。但是,对于右移,算术移位必须保留符号位。这意味着,要做到这一点,你需要电路将输入的最高位传播到移位器的最高位和一个额外的控制线,以便在它和0之间进行选择。这些都需要更多的晶体管和算术移位可以用旋转模拟。

    CLC
    LDA number
    BPL positive
    SEC
positive:
    ROR A

6502设计背后的主要驱动力是让它以更低的价格胜过摩托罗拉6800。这是通过从6800中剥离不必要的功能来完成的,因此它们可以使晶体管数量尽可能低。 6502的晶体管数约为3,500。早期的6800晶体管数约为4,500。因此遗漏了诸如适当算术移位之类的不必要的特征。

实际上,考虑到可以通过清除进位标志然后进行旋转来模拟换档,我很惊讶他们完全不喜欢它们。设计人员必须发现他们可以添加移位指令而复杂性最小化,就像SBC指令与ADC指令完全相同但第二个操作数的位被反转。


1
投票

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

当设计6502时,(对现代标准相对严格)限制了晶体管的数量和CPU的复杂性。牺牲是为了使其成为可行的设计和制造,并且“几乎不需要”签名整数。

注意:使用“签名”的主要原因是C(及更高版本的语言)具有错误的默认值(除非你另有说明,否则它假定几乎所有整数都是“签名”)并且人们懒得在他们输入“unsigned”时输入不需要签名;所以很多软件使用(略贵一些)签名算术,除了懒惰之外没有任何理由。一般来说,大多数情况下你确实需要签名的数字,你正在处理“真实世界的价值”,无论如何都需要浮点数(比如数组索引,地址/指针,大小,字符/代码点,像素值,距离) ,......都是自然无符号的)。

© www.soinside.com 2019 - 2024. All rights reserved.