【问题标题】:Assembly mask logic question汇编掩码逻辑问题
【发布时间】:2010-01-26 01:22:14
【问题描述】:

这个很简单,但是我还没弄明白。

这个问题是关于一个程序集 mmx,但它是纯粹的逻辑。

想象以下场景:

MM0: 04 03 02 01 04 03 02 01  <-- input  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  <-- copy of input

after pcmpgtw MM0, MM1

MM0: FF FF 00 00 FF FF 00 00  <-- words where MM0 is greater than MM1 (comparing words)  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01

after pand MM0, MM2  

MM0: 04 03 00 00 04 03 00 00  <-- almost there...
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  

我想知道用 02 填充 MM0 的零。我想我必须在步骤 2 中反转 MM0 寄存器,将 FF 更改为 00,将 00 更改为 FF,然后执行 a 和 MM1,最后执行 a 或将两者合并。

如果我能得到:

MM3: 00 00 FF FF 00 00 FF FF

then, pand MM2, MM3

MM1: 04 03 00 00 04 03 00 00  
MM2: 00 00 02 02 00 00 02 02

finally por MM0, MM1 would give me the desired outcome:

MM0: 04 03 02 02 04 03 02 02  <-- Aha!

总结一下,我怎样才能将 MM3 寄存器设为 00 00 FF FF 00 00 FF ?如何反转位,证明 MMX 寄存器中只有 AND、OR、XOR 和 NAND 指令?

非常感谢任何答案。谢谢。

【问题讨论】:

  • 那么...问题是什么?看起来你已经自己回答了。
  • 在我的问题中可以读到:“如果我能得到”,这意味着我还没有,我问你怎么做。

标签: assembly logic boolean mask mmx


【解决方案1】:

您还可以使用 pcmpgtw 生成掩码并交换参数的顺序。这样你就可以保存一个寄存器:

MM0: 04 03 02 01 04 03 02 01  <-- input  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  <-- copy of input


pcmpgtw MM0, MM1    ; MM0 = FF FF 00 00 FF FF 00 00 
pcmpgtw MM1, MM2    ; MM1 = 00 00 FF FF 00 00 FF FF

您可能必须复制 MM1 参数,因为它会在掩码生成期间被销毁,但这通常比加载/生成 64 位常量更快。

另一种方法是使用 PNAND:

pcmpgtw MM0, MM1    ; MM0 = FF FF 00 00 FF FF 00 00 

pand    MM2, MM0    ; leave bytes with FF intact 
pnand   MM1, MM0    ; leave bytes with 00 intact 
por     MM1, MM2    ; combine the results.

【讨论】:

    【解决方案2】:

    那么你有一个mask = 0xFFFF0000FFFF0000;

    all_ones = 0xFFFFFFFFFFFFFFFF;
    
    inverted_mask = mask XOR all_ones;
    

    合并M0和M1是:

    M0 = M0 AND mask;
    M1 = M1 AND inverted_mask;
    M0 = M0 OR M1;
    

    这会在原地编辑 M0 和 M1,因此它们的值被破坏。如果要保留 M1 则需要将中间结果存储到临时变量/寄存器/内存中:

    M0 = M0 AND mask;
    TEMP = M1 AND inverted_mask;
    M0 = M0 OR TEMP;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2013-02-25
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多