它更快,因为您可以使用<<运算符而不是*操作符。即执行“向左移动1位”(乘以二)比执行“乘以43”要快。可以通过在图像的每一行末尾添加填充字节(如MS在内存位图中所做的那样)来解决这个限制,但本质上,这是两个指令之间速度差异的结果。
在旧时代的8位320x200(13h模式)中,您可以使用简单的公式索引像素:
pixOffset = xPos + yPos * 320;
但这很慢。一个更好的选择是使用
C
pixOffset = xPos + (yPos * 256) + (yPos * 64)
汇编语言
mov ax, xPos ; ax = xPos
mov bx, yPos ; bx = yPos
shl bx, 6 ; bx = yPos * 64
add ax, bx ; ax = xPos + (yPos * 64)
shl bx, 2 ; bx = yPos * 256
add ax, bx ; ax = xPos + yPos * 320
这可能看起来有些违反直觉,但是当写得很好时,它只使用单个时钟指令。也就是说,你可以在6个时钟周期内计算出偏移量。当然,流水线和缓存未命中会使情况变得复杂。
在硬件中实现移位寄存器比实现完整的乘法单元要便宜得多,无论是在美元还是晶体管方面。因此,相同数量的晶体管可以用于提供更好的性能,或者可以使用更少的晶体管以获得相同的性能并降低功率消耗。
据我所知,现代处理器的mul(和div)指令是通过查找表来实现的。这在很大程度上缓解了问题,但它也不是没有问题。如果想进一步阅读,请查看Pentium fdiv bug(芯片内的查找表填充错误)。
http://en.wikipedia.org/wiki/Pentium_FDIV_bug
因此,总的来说,这实际上是实现功能所使用的硬件/软件的产物。