首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >和‘`movl (%esi),%eax,addl $4,%esi’之间有什么区别?

和‘`movl (%esi),%eax,addl $4,%esi’之间有什么区别?
EN

Stack Overflow用户
提问于 2016-10-21 08:21:37
回答 1查看 1.2K关注 0票数 1

我读了一本书乔纳森·巴列特,用来学习Linux上的i386程序集。

我的目的是读取用asm编写的一些项目的源代码,然后我遇到了这个LODSL,从手册中我可以知道它从%esi指向的位置加载数据,然后增加地址大小

那么,为什么人们就不能直接用movl来实现呢?这是速度的提高还是其他我没有考虑过的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)的指令表和微弓pdfx86标记wiki中的其他链接,如英特尔的优化手册。

因此,在Haswell之前,最好使用单独的MOV并添加指令,除非代码大小非常重要(例如,在引导加载程序中,速度几乎与速度无关)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40171684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档