我正在阅读Jonathan Barlett撰写的" 从头开始编程 "一书,用于在Linux上学习i386程序集
我的目的是阅读一些用asm编写的项目的源代码,然后我遇到了这个LODSL,从手册我可以知道它从哪里加载数据%esi,然后增加地址大小
那么为什么人们不能只是movl这样做呢?我没有考虑任何速度提升或任何其他问题?
那么为什么人们不能用movl来做呢?
代码大小,ADD修改标志.(尽管可以通过使用LEA来指示增量来避免这种情况).
存在最复杂的单字节指令的主要原因之一是8086在代码获取方面几乎完全成为瓶颈.除了内存通常是宝贵的事实,代码大小〜=第一代x86 CPU的代码速度.在现代CPU上绝对不是这种情况,具有快速指令缓存和耗电量大的解码器,甚至是解码指令的缓存.
交换寄存器与AX的单字节指令是现代x86的8个宝贵操作码的巨大浪费,但显然对8086有用,因为MOVSX直到386才存在(所以你需要CBW),还需要其他东西斧头.(并且XCHG的吞吐量不比现在的MOV差3倍).有趣的事实:0x90 NOP来自这种编码xchg eax, eax.
是任何速度改进
是的,代码大小总是很重要.
此外,在英特尔P6系列和Sandybridge系列上,LODSD(也称为lodslat&t语法)在Haswell之前为3 uop .在Haswell上,LODSD/Q仅为2 uops.(LODSB/W仍为3 uops).请参阅Agner Fog的说明表和microarch pdf,以及x86标签wiki 中的其他链接,如英特尔的优化手册.
因此,在Haswell之前,最好使用单独的MOV和ADD指令,除非代码大小非常重要(例如在引导加载程序中,速度几乎无关紧要).