`lodsl` 和 `movl (%esi), %eax; 有什么区别?添加 4 美元,%esi`?
What's the difference between `lodsl` and `movl (%esi), %eax; addl $4, %esi`?
我在 Linux
上阅读了学习 i386 汇编的书 Programming from the Ground Up by Jonathan Barlett
我的目的是阅读一些用 asm 编写的项目的源代码,然后我遇到了这个 LODSL
,从手册中我可以知道它从 %esi
指向的位置加载数据,并且之后创建地址大小
那么为什么人们不能直接使用 movl
来做到这一点呢?是否有任何速度改进或我没有考虑的任何其他问题?
so why cant people just use movl to do that?
code-size,ADD修改flags。 (虽然你可以通过使用 LEA 作为指针增量来避免这种情况)。
大多数复杂的单字节指令存在的主要原因之一是 8086 在取码方面几乎完全成为瓶颈。除了内存通常很宝贵这一事实之外,代码大小 ~= 第一代 x86 CPU 上的代码速度。现代 CPU 绝对不是这种情况,它具有快速指令缓存和耗电解码器,甚至 caches for decoded instructions.
为 exchange-register-with-AX 使用单字节指令是对现代 x86 8 个宝贵操作码的巨大浪费,但显然对 8086 有用,因为 MOVSX 直到 386 才存在(所以你需要 CBW) ,以及其他需要 AX 的东西。 (并且 XCHG 的吞吐量并不比现在的 MOV 差 3 倍)。有趣的事实:0x90 NOP 来自 xchg eax, eax
.
的这种编码
are that any speed improvements
是的,代码大小总是很重要。
此外,在 Intel P6 系列和 Sandybridge 系列上,LODSD(在 at&t 语法中又称为 lodsl
)在 Haswell 之前为 3 微指令。在 Haswell 上,LODSD/Q 只有 2 微指令。 (LODSB/W 仍然是 3 微指令)。请参阅 Agner Fog's instruction tables and microarch pdf, and other links in the x86 标签 wiki,例如英特尔的优化手册。
因此,在 Haswell 之前,最好使用单独的 MOV 和 ADD 指令,除非代码大小非常重要(例如,在引导加载程序中,速度几乎无关紧要)。
我在 Linux
上阅读了学习 i386 汇编的书 Programming from the Ground Up by Jonathan Barlett我的目的是阅读一些用 asm 编写的项目的源代码,然后我遇到了这个 LODSL
,从手册中我可以知道它从 %esi
指向的位置加载数据,并且之后创建地址大小
那么为什么人们不能直接使用 movl
来做到这一点呢?是否有任何速度改进或我没有考虑的任何其他问题?
so why cant people just use movl to do that?
code-size,ADD修改flags。 (虽然你可以通过使用 LEA 作为指针增量来避免这种情况)。
大多数复杂的单字节指令存在的主要原因之一是 8086 在取码方面几乎完全成为瓶颈。除了内存通常很宝贵这一事实之外,代码大小 ~= 第一代 x86 CPU 上的代码速度。现代 CPU 绝对不是这种情况,它具有快速指令缓存和耗电解码器,甚至 caches for decoded instructions.
为 exchange-register-with-AX 使用单字节指令是对现代 x86 8 个宝贵操作码的巨大浪费,但显然对 8086 有用,因为 MOVSX 直到 386 才存在(所以你需要 CBW) ,以及其他需要 AX 的东西。 (并且 XCHG 的吞吐量并不比现在的 MOV 差 3 倍)。有趣的事实:0x90 NOP 来自 xchg eax, eax
.
are that any speed improvements
是的,代码大小总是很重要。
此外,在 Intel P6 系列和 Sandybridge 系列上,LODSD(在 at&t 语法中又称为 lodsl
)在 Haswell 之前为 3 微指令。在 Haswell 上,LODSD/Q 只有 2 微指令。 (LODSB/W 仍然是 3 微指令)。请参阅 Agner Fog's instruction tables and microarch pdf, and other links in the x86 标签 wiki,例如英特尔的优化手册。
因此,在 Haswell 之前,最好使用单独的 MOV 和 ADD 指令,除非代码大小非常重要(例如,在引导加载程序中,速度几乎无关紧要)。