我在这里还有其他一些方面:
考虑操作“ 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的可能性较小,但两个序列都可能变长,因为RISC可能已经在另一个寄存器中加载了一个或多个指针。x86的寄存器较少,因此指针位于其中之一的可能性较小。
利弊:
RISC指令可以与周围的代码混合以改善指令调度,而x86则不太可能这样做,而x86可以在CPU本身内部完成此工作(或多或少取决于顺序)。上面的RISC序列在32位体系结构上通常为28个字节长(每条7个指令,每个32位/ 4个字节宽度)。这将导致片外存储器在提取指令时(七次提取)工作更多。更密集的x86序列包含较少的指令,尽管它们的宽度有所不同,但您可能也正在查看平均每个指令4个字节。即使您具有指令高速缓存来加快这七个访存的速度,这也意味着与x86相比,您将在其他地方弥补三个不足。
x86体系结构具有更少的要保存/恢复的寄存器,这意味着它可能比RISC更快地执行线程切换和处理中断。要保存和还原更多的寄存器,需要更多的临时RAM堆栈空间来执行中断,并需要更多的永久堆栈空间来存储线程状态。这些方面应该使x86成为运行纯RTOS的更好的选择。
从个人角度来说,我发现编写RISC程序集比x86更加困难。我通过用C编写RISC例程,编译和修改生成的代码来解决此问题。从代码生产的角度来看,这效率更高,从执行角度来看,效率可能更低。所有这32个寄存器都需要跟踪。使用x86则是另一种方式:6-8个带有“真实”名称的寄存器使问题更易于管理,并且使人们更有信心产生的代码将按预期工作。
丑陋?这在情人眼中。我更喜欢“不同”。