【问题标题】:How do I extract a single byte from an xmm-register in Asm?如何从 Asm 中的 xmm 寄存器中提取单个字节?
【发布时间】:2019-01-21 08:58:07
【问题描述】:

我正在学习 SSE 指令,并在尝试将单个字节从 xmm 寄存器复制到 al 时发现 GNU 的 as 汇编器出现一个奇怪的错误: “错误:pextrb 的操作数类型不匹配”。

我认为我的语法是正确的,它与pextrd 完美搭配。

pextrd $3, %xmm0, %eax  # Works perfectly fine
pextrb $3, %xmm0, %al   # Error: operand type mismatch for 'pextrb'

【问题讨论】:

  • gcc 产生%eax。可能是因为结果是 0 扩展的?
  • 另见pextrbPEXTRB/PEXTRD 在 64 位模式下的默认操作数大小为 64 位,最低有效字节/双字数据上方的位用零填充我>
  • @MarcGlisse:是的,谢天谢地,英特尔避免引入需要额外工作的新指令以避免像setcc r/m8 那样的错误依赖关系,例如xor %eax,%eax / setl %al。如果将 PEXTRB/PEXTRW 合并到 RAX 的低字节而不是零扩展到完整的 RAX 中,而不依赖于旧值,那将是一个糟糕的设计决定。

标签: assembly x86-64 sse gnu-assembler


【解决方案1】:

Marc Glisse 是对的,它在使用 eax 而不是 al 时有效。它是零扩展的,所以 eax 实际上只包含一个字节。谢谢!

pextrb $3, %xmm0, %eax

【讨论】:

  • 或者,您可以将结果直接存储到内存中(在这种情况下,当然不是零扩展)。
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2019-01-06
  • 1970-01-01
  • 2014-04-12
  • 2020-10-03
  • 2023-03-31
相关资源
最近更新 更多