我读了一本书乔纳森·巴列特,用来学习Linux上的i386程序集。
我的目的是读取用asm编写的一些项目的源代码,然后我遇到了这个LODSL,从手册中我可以知道它从%esi指向的位置加载数据,然后增加地址大小
那么,为什么人们就不能直接用movl来实现呢?这是速度的提高还是其他我没有考虑过的问题?
发布于 2016-10-21 09:57:59
那么为什么人们就不能用movl来实现呢?
代码大小,并添加修改标志。(虽然可以通过使用LEA作为指针增量来避免这种情况)。
最复杂的单字节指令存在的主要原因之一是,8086几乎完全阻塞了代码获取。除了内存通常是宝贵的事实,代码大小的~=代码速度在第一代x86 CPU上。在现代CPU上绝对不是这样,它有快速的指令缓存和耗电的解码器,甚至还有解码指令的缓存。
使用一个字节的指令与AX交换寄存器是对现代x86 8种宝贵操作码的巨大浪费,但显然对8086很有用,因为MOVSX直到386才存在(所以您需要CBW)和其他东西需要AX。(而且XCHG的吞吐量并不比现在的MOV差3倍)。有趣的事实:0x90NOP来自于xchg eax, eax的这种编码。
有任何速度的提高吗?
是的,代码大小总是很重要的。
此外,在Intel P6家族和沙桥家族上,LODSD (又名at&t语法中的lodsl )是3 uop,直到Haswell。在Haswell上,LODSD/Q仅为2 uop。(LODSB/W仍为3 uop)。请参阅阿格纳·福格( Agner Fog)的指令表和微弓pdf和x86标记wiki中的其他链接,如英特尔的优化手册。
因此,在Haswell之前,最好使用单独的MOV并添加指令,除非代码大小非常重要(例如,在引导加载程序中,速度几乎与速度无关)。
https://stackoverflow.com/questions/40171684
复制相似问题