0

昨晚我和一个朋友在谈论嵌入式处理器之类的东西,我们谈到了 ASM 和特定指令集的话题——尽管我认为这个问题也可以应用于 x86 处理器。

在了解 ASM 中的寄存器时,很明显所有寄存器都有 100% 的独特和特定用途(至少在 x86 架构中)。然而,在讨论他的一些处理器时,他告诉我他正在使用的一些芯片有几个通用寄存器可以用于任何事情,而且很少(如果有的话)寄存器专门用于指令。

归根结底,在技术上不能使用任何寄存器来执行指令吗?它们的大小都相同,会有什么区别(堆栈指针等除外)?

4

2 回答 2

3

任何寄存器都可以用作指令操作数的指令集称为正交。8086 绝对不是正交设计。在 8086 之后几年发布的竞争对手是摩托罗拉 68000,这是一种高度正交的设计,并因其质量而受到许多程序员的青睐。

然而,8086 的设计并不是随意挑选的,两个非常重要的原则发挥了作用:

  • 与上一代 8080 的兼容性是一个强有力的目标。允许将旧汇编代码机械翻译到新处理器。8080 反过来又受到 8008 的严重影响。获得市场接受的新架构总是很困难,英特尔很早就认识到对工具和程序的投资是其客户的重要资产。一个长期为它服务的目标,当然也是设计能持续这么久的原因。

  • 工艺技术为您可以使用多少个晶体管来实现处理器设定了一个严格的上限。8086 只需要 29,000 个有源晶体管,这对于 16 位处理器来说是一项工程壮举。使用非正交设计允许丢弃大量胶合逻辑,它也更快。68000 为其预算选择了不同的用途,正交指令集但相当糟糕的总线接口,例如,当数据在非对齐地址上寻址时,会引发臭名昭著的总线错误处理器故障。

于 2012-12-09T17:24:47.223 回答
1

很明显,所有寄存器都有 100% 的独特和特定用途

错误的。EAX 的唯一用途是什么?

技术上不能使用任何寄存器来执行指令

您可以按照自己喜欢的方式使用任何寄存器。您只需要知道某些指令需要操作数/返回特定寄存器中的结果。例如loop递减ECX直到变为 0,movsb从 ESI 移动到 EDI 等。

于 2012-12-09T16:26:55.067 回答