PSHUFLW 和 PSHUFD 指令如何工作?

逆向工程 拆卸 x86 登记 英特尔
2021-06-14 02:52:14

我一直试图弄清楚这些说明到底发生了什么,但无法理解它们。我可以看到 PSHUFLW 指令作用于 XMM 寄存器的前 16 个字节,但无法弄清楚。我已阅读英特尔® 架构指令集扩展编程参考中的描述,但似乎无法理解我是一个非常直观的人,所以任何帮助将不胜感激。我已经使用代码运行了一些测试

xxm0 = 00000000000000000000000000003E2D
PSHUFLW xmm0, xmm0, N

并有以下结果

 N = 0, output = 00000000000000003E2D3E2D3E2D3E2D
 N = 1, output = 00000000000000003E2D3E2D3E2D0000
 N = 2, output = 00000000000000003E2D3E2D3E2D0000
 N = 3, output = 00000000000000003E2D3E2D3E2D0000
 N = 4, output = 00000000000000003E2D3E2D00003E2D
 N = 5, output = 00000000000000003E2D3E2D00000000
 N = 6, output = 00000000000000003E2D3E2D00000000
 N = 7, output = 00000000000000003E2D3E2D00000000
 N = 8, output = 00000000000000003E2D3E2D00003E2D
 N = 9, output = 00000000000000003E2D3E2D00000000
 N = 10, output = 00000000000000003E2D00003E2D3E2D
 N = 11, output = 00000000000000003E2D00003E2D0000
 N = 12, output = 00000000000000003E2D00003E2D0000
 N = 13, output = 00000000000000003E2D00003E2D0000
 N = 14, output = 00000000000000003E2D000000003E2D
 N = 15, output = 00000000000000003E2D000000000000
 N = 16, output = 00000000000000003E2D000000000000
 N = 17, output = 00000000000000003E2D000000000000
 N = 18, output = 00000000000000003E2D000000003E2D
 N = 19, output = 00000000000000003E2D000000000000
 N = 20, output = 00000000000000003E2D00003E2D3E2D

我想知道这些说明是如何工作的,也许还有一个与此类似的未来说明的视觉指南。我只倒车了几个星期,所以我很新鲜。感谢您的任何帮助,您可以提供。

1个回答

PSHUFLW的视觉故事如下:

在此处输入图片说明

  • 我将使用PositionOrder此处相同的平均值,并从零(零索引)开始。

如您所见,它根据 N 的值从源中选择单词。选择的顺序/位置将由 N 的 2 位值选择。例如,当 N=4 时,

  1. 根据 N (= 00) 的第一个字节(2 位),它将word在源的位置/顺序 0 处选择并将其复制到目标的位置 0。
  2. 根据 N (= 01) 的第二位(2 位),它将word在源的位置/顺序 1 处选择并将其复制到目标的第一个位置。
  3. 根据 N (= 00) 的第三位(2 位),它将word在源的位置/顺序 0 处选择并将其复制到目标的第二个位置。
  4. 根据 N (= 00) 的第四位(2 位),它将word在源的位置/顺序 0 处选择并将其复制到目标的第 3 位。

下一个例子,当 N=17 时,

  1. 根据 N (= 01) 的第一个字节(2 位),它将word在源的位置/顺序 1 处选择并将其复制到目标的位置 0。
  2. 根据 N (= 00) 的第二位(2 位),它将word在源的位置/顺序 0 处选择并将其复制到目标的第一个位置。
  3. 根据 N (= 01) 的第三位(2 位),它将word在源的位置/顺序 1 处选择并将其复制到目标的第二位置。
  4. 根据 N (= 00) 的第四位(2 位),它将word在源的位置/顺序 0 处选择并将其复制到目标的第 3 位。

PS:您在上述问题中 N=17 的输出是错误的!PSHUFD 是一样的,只是它会从源中选择双字并在目标中复制。所以将使用 PSHUFD 中的低四字和高四字,而在 PSHUFLW 中使用低四字。