MMX - 使用常量字节

Posted

技术标签:

【中文标题】MMX - 使用常量字节【英文标题】:MMX - working with constant bytes 【发布时间】:2012-10-24 03:15:57 【问题描述】:

我一直在做一些事情,但遇到了另外几个问题。首先:

ROR64 macro a, rot
; Result := (A shl (64-rot)) xor (A shr rot);
  MOV     EAX, 64
  SUB     EAX, rot
  PSLLQ   a, EAX
  MOVQ    mm6, a
  PSRLQ   mm6, rot
  PXOR    a, mm6
endm

根据最后一个问题,我一直在尝试使用 QWords 的过程(我可能也会尝试使用 DWords 来学习)。我在使用的开发机器上只能访问 MMX 指令,所以我一直在去那里。问题一直在处理来自“rot”的值,因为我已经确定 MMX 操作只能通过我从 MASM32 得到的错误在这些寄存器上工作。但是当我尝试将“rot”和“64-rot”放入 MMX 寄存器时,我得到了更多的错误。我该如何解决这个问题?

我还需要将 MMX 寄存器添加为 QWords。我在参考资料中没有看到执行此操作的说明。我是否需要将它们拆分为常规寄存器或通过 FP 指令推送它们?

【问题讨论】:

“我在使用的开发机器上只能访问 MMX 指令”——哇,那一定是一台非常老旧的机器。我怀疑任何只有 MMX 的机器可以运行任何用于发布这个问题的现代浏览器。 :P 这只是人为的限制吗? 无论如何,我对 MMX 并不熟悉,因为它早在我的时代之前。但我认为PSRLQ 的两个操作数都需要是mm 寄存器(如果您不使用恒定移位量)。所以你需要将rotmm 寄存器中移动。 @Mysticial 哦,你还那么年轻 :-) 总而言之,MMX 可以做 SSE1 可以做的所有事情,但没有浮点数,只有宽度的一半。 信不信由你,我的开发机器只支持 MMX(和 3DNow!但这是另一个我不打算涉足的问题,因为它已经完全被淘汰了)。如果它确实支持更多,我可能仍然想研究它只是为了了解它是什么。这是一个好处,在此之前,我真的不知道 MMX 或 SSE 的所谓好处是什么,尽管多年来接触过所有的营销材料。 【参考方案1】:

MMX 用于 SIMD 编程(通常不适用于 64 位操作)。

见wikipedia .. “MMX指令集的主要用法是基于打包数据类型的概念,这意味着不是将整个寄存器用于单个64位整数,而是两个32位整数,四个16-位整数,也可以同时处理八个 8 位整数。”

如今,由于 SSEx 技术,它已过时。 抱歉,规范中没有像 PADDQ(看看PADDx)这样的指令。

Shift-Instruction 仅接受 8Bit 位移或其他 MMX 寄存器来保存移位量。这意味着您不能使用像eax 这样的寄存器来完成这项工作。不错的尝试,但有时愿望与现实世界无关。

顺便说一下,请仔细查看您发布的宏。无论如何,我认为这似乎不正确。请考虑您要执行的操作顺序和您期望的结果。

因为您使用的宏会在您使用它的任何时候发出代码,您可以尝试(未经测试):

TEST macro a, rot
; Result := (A shl (64-rot)) xor (A shr rot);
  MOVQ    mm6, a
  PSLLQ   a, 64-rot
  PSRLQ   mm6, rot
  PXOR    a, mm6
endm

【讨论】:

我在 MMX 上找到的参考资料显示了 PADDQ 指令。我想,其中的一部分挑战是找到在 DOS 流行的时代没有写好的准确的指导材料和参考资料。 正如 harold 所说,在 SSE 指令集中有一条指令叫 PADDQ(这里有它是有道理的)。对于 MMX,没有这样的指令。老实说,这没有多大意义。请注意 PADDQ 代表 P acked ADD of Q WORDS,但您不能将多个 64 位数字打包到 MMX 寄存器中,因为它只有 64少量。移位命令是完整的 64 位,因为它将帮助您在 MMX 寄存器中排列数据。 @Fermat2357 这个论点让0F D4 /r 伤心:( 是的,你是对的。我可以找到here 你所指出的。我真的不记得了:)。在这一点上我似乎错了。 @DavidJ paddq mm, mm/m64 确实存在。它不是 MMX 的一部分,而是 SSE2 的一部分。请记住,在 SSE3(我认为)之前,所有 SSE 指令也适用于 MMX 寄存器。

以上是关于MMX - 使用常量字节的主要内容,如果未能解决你的问题,请参考以下文章

使用 MMX 指令集计算 f(x)=2*(x^2)+5 饱和度,用于从二进制文件加载的 128 个大小为 2 字节的数字

如何将 8 字节长整数的每个字节相加?

[C/C++]_[初级]_[声明和使用字符串常量和字节常量]

MMX 内部函数和 Microsoft C++ 的堆栈使用

(a*b)/256 和 MMX

MMX 符号扩展