我这里有几个额外的方面:
考虑操作“a=b/c”x86 将其实现为
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
作为 div 指令的额外奖励,edx 将包含其余部分。
RISC 处理器需要首先加载 b 和 c 的地址,将 b 和 c 从内存加载到寄存器,进行除法并加载 a 的地址,然后存储结果。dst,src 语法:
mov r5,addr b
mov r5,[r5]
mov r6,addr c
mov r6,[r6]
div r7,r5,r6
mov r5,addr a
mov [r5],r7
这里通常不会有余数。
如果要通过指针加载任何变量,则两个序列可能会变得更长,尽管这对于 RISC 来说不太可能,因为它可能已经在另一个寄存器中加载了一个或多个指针。x86 的寄存器较少,因此指针位于其中之一的可能性较小。
优点和缺点:
RISC 指令可以与周围的代码混合以改进指令调度,这在 x86 中不太可能,而是在 CPU 本身内部完成这项工作(或多或少取决于序列)。在 32 位架构上,上述 RISC 序列通常为 28 字节长(7 条 32 位/4 字节宽的指令)。这将导致片外存储器在获取指令(七次获取)时工作得更多。更密集的 x86 序列包含更少的指令,尽管它们的宽度各不相同,但您可能也在其中查看平均 4 个字节/指令。即使您有指令高速缓存来加快七次取指的速度,也意味着与 x86 相比,您将在其他地方有 3 次的不足来弥补。
x86 架构具有更少的寄存器来保存/恢复意味着它可能会比 RISC 更快地进行线程切换和处理中断。更多的寄存器来保存和恢复需要更多的临时 RAM 堆栈空间来执行中断和更多的永久堆栈空间来存储线程状态。这些方面应该使 x86 成为运行纯 RTOS 的更好候选者。
就个人而言,我发现编写 RISC 程序集比 x86 更难。我通过用 C 语言编写 RISC 例程、编译和修改生成的代码来解决这个问题。从代码生产的角度来看,这更有效,而从执行的角度来看,这可能效率较低。所有需要跟踪的 32 个寄存器。对于 x86,情况正好相反:6-8 个具有“真实”名称的寄存器使问题更易于管理,并且更加确信生成的代码将按预期工作。
丑陋?那是在旁观者的眼中。我更喜欢“不同”。