首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在现代x86中“指令前缀”意味着什么?

在现代x86中“指令前缀”意味着什么?
EN

Stack Overflow用户
提问于 2016-02-13 12:28:47
回答 2查看 7K关注 0票数 21

为了了解推土机为什么不合格,我一直在看阿格纳·福格( Agner Fog)那本出色的微结构书,在第178页的推土机下面有这一段。

有最多三个前缀的指令可以在一个时钟周期内解码。对于有三个以上前缀的指令,有一个非常大的惩罚。使用4-7个前缀的指令需要额外的14到15个时钟周期来解码.带有8-11个前缀的指令需要额外的20-22个时钟周期,而具有12-14个前缀的指令需要27 -28个时钟周期。因此,不建议使用三个以上的前缀使NOP指令更长。此规则的前缀计数包括操作数大小、地址大小、段、重复、锁、REX和XOP前缀。三个字节的VEX前缀算作一个,而两个字节的VEX前缀不算.转义码(0F,0F38,0F3A)不算。

当我搜索前缀时,我的技术定义远远超出了我的能力。或者,建议每条与上述摘录相冲突的指令限制在4条以内。

因此,简单地说,有人能解释他们是做什么的吗?为什么你可能想把14+连接到指令上而不是拆分它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-13 12:50:40

通常,您使用的数量尽可能多,而预期的指令和操作数决定了这一点。汇编程序自动发出一些前缀,而另一些则由您手动使用。

他们提到的例子是多字节NOP,它传统上用于对齐填充,其思想是使用单个但适当长的指令来节省资源。显然,使用更多的前缀来保持单个指令可能比使用两个前缀少的指令更糟糕。

此规则的前缀计数包括操作数大小、地址大小、段、重复、锁、REX和XOP前缀。三个字节的VEX前缀算作一个,而两个字节的VEX前缀不算.

示例:

  • 操作数大小:可以在32位寄存器和16位寄存器之间切换,例如,mov ax, [foo]的编码与mov eax, [foo]相同,但前缀为66h
  • 地址大小:可以在32/16或64/32位地址大小之间切换,例如,mov [eax], foo编码与mov [rax], foo相同,但前缀为67h (在64位模式下)
  • 段:可以覆盖所使用的段,例如mov [fs:eax], foomov [eax], foo编码相同,但前缀为64h
  • 重复:与用于重复的字符串指令一起使用,例如rep cmpsbcmpsb编码相同,但前缀为f3h
  • lock:与某些指令一起使用,使其具有原子性,例如,lock add [foo], 1add [foo], 1编码相同,但前缀为f0h
  • REX.W:用于切换到64位操作数大小,例如,add rax, 1编码与add eax, 1相同,但前缀为48h
  • REX.R,B,X:用作modr/m字节的扩展以访问额外的寄存器,例如add r8d, 1add eax, 1相同,但前缀为41h
  • XOP,VEX:用于矢量指令子集
票数 17
EN

Stack Overflow用户

发布于 2016-02-13 13:03:42

“四个前缀”交易来自“前缀组”:

  1. 锁/rep/回购
  2. 段覆盖
  3. 操作数大小覆盖
  4. 地址大小覆盖

您可以重复前缀,但不能使用来自同一组的多个不同前缀(可以,但行为未定义)。虽然这只适用于第一组和第二组,但其他组中每个组只有一件事。

类似于66 66 66 66 66 66 66 66 90的内容是有效的(但可能很难解码)。2E 3E 00 00 (混合段覆盖)不是。

当字节必须执行时,堆叠前缀对于代码对齐可能很有用,与填充nop不同,它不需要花费执行时间。一次使用过多可能会花费解码时间。

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

https://stackoverflow.com/questions/35379820

复制
相关文章

相似问题

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