Assembly MMX-使用常量字节

Assembly MMX-使用常量字节,assembly,x86,constants,mmx,Assembly,X86,Constants,Mmx,我一直在做一些事情,但遇到了另外两个问题。首先: 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来学习)。在我使

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

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”的值,因为我已经通过MASM32中的错误确定MMX ops只在这些寄存器上工作。但是,当我尝试将“rot”和“64 rot”放入MMX寄存器时,会出现更多错误。我如何解决这个问题

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

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

看 .. MMX指令集的主要用途是基于压缩数据类型的概念,这意味着可以同时处理两个32位整数、四个16位整数或八个8位整数,而不是将整个寄存器用于单个64位整数

如今,由于SSEx技术,它已经过时了。 很抱歉,规范中没有类似PADDQ(查看)的说明

仅接受8位位移或其他MMX寄存器以保持移位量。这意味着您不能使用像
eax
这样的寄存器来执行此任务。不错的尝试,但有时愿望与现实世界无关

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

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


“我在使用的开发机器上只能访问MMX指令”-哇,那一定是一台非常旧的机器。我怀疑任何只有MMX的机器都不能运行任何用于发布此问题的现代浏览器这只是人为的限制吗?无论如何,我不熟悉MMX,因为它早在我的时代就出现了。但是我认为
PSRLQ
的两个操作数都需要是
mm
寄存器(如果您没有使用恒定的移位量)。所以你需要将
rot
从一个
mm
寄存器移到一个
mm
寄存器中。@Mysticial哦,你太年轻了:-)简言之,MMX可以做SSE1能做的一切,但没有浮点,只有一半的宽度。信不信由你,我的开发机器只支持MMX(还有3DNow!但这是另一个我不打算涉足的领域,因为它已经完全被淘汰了)。如果它确实支持更多,我可能仍然想研究它,只是为了了解它是什么。这是一个好处,在此之前,我真的不知道MMX或SSE的所谓好处是什么,尽管多年来接触了所有的营销材料。我在MMX上找到的参考资料显示了PADDQ指令。这是MMX的部分挑战我想,这是为了找到好的、准确的指令材料和参考资料,而这些材料和参考资料不是在DOS普及的年代编写的。正如哈罗德所说,SSE指令集中有一条名为PADDQ的指令(在这里使用它是有意义的)。对于MMX,没有这样的指令。老实说,这没有多大意义。请注意PADDQ代表P acked ADD of Q WORDS,但您不能将多个64位数字打包到MMX寄存器中,因为它只有64位。shift命令是全64位的,因为它将帮助您在MMX寄存器中排列数据。@Fermat2357rgument使D4/r的
0F感到悲伤:(是的,你是对的。我能找到你所指出的。我真的记不起来了:)。这一点似乎我错了。@DavidJ
paddq-mm,mm/m64
实际上是存在的。它不是MMX的一部分,而是SSE2的一部分。记住这一点直到SSE3(我想)所有SSE指令也适用于MMX寄存器。
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