1

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

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 指令推送它们?

4

1 回答 1

3

MMX用于 SIMD 编程(一般不用于 64 位操作)。

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

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

移位指令仅接受8位位移或其他 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
于 2012-10-24T05:20:30.837 回答