⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simd.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        目的寄存器与源存储器按字节比较,如果对应字节相等,就置目的寄存器对应字节为0ffh,否则为00h,
        内存变量必须对齐内存16字节.
        
        pcmpeqw XMM,XMM/m128
        目的寄存器与源存储器按字比较,如果对应字相等,就置目的寄存器对应字为0ffffh,否则为0000h,
        内存变量必须对齐内存16字节.
        
        pcmpeqd XMM,XMM/m128
        目的寄存器与源存储器按双字比较,如果对应双字相等,就置目的寄存器对应双字为0ffffffffh,否则为00000000h,
        内存变量必须对齐内存16字节.
        
        pcmpgtb XMM,XMM/m128
        目的寄存器与源存储器按字节(有符号补码)比较,如果目的寄存器对应字节大于源存储器,就置目的寄存器对应字节为0ffh,
        否则为00h,内存变量必须对齐内存16字节.
        
        pcmpgtw XMM,XMM/m128
        目的寄存器与源存储器按字(有符号补码)比较,如果目的寄存器对应字大于源存储器,就置目的寄存器对应字为0ffffh,
        否则为0000h,内存变量必须对齐内存16字节.
        
        pcmpgtd XMM,XMM/m128
        目的寄存器与源存储器按双字(有符号补码)比较,如果目的寄存器对应双字大于源存储器,
        就置目的寄存器对应双字为0ffffffffh,否则为00000000h,内存变量必须对齐内存16字节.
        
        movd XMM,r32/m32
        把源存储器32位内容送入目的寄存器的低32位,高96位清零.
        
        movd r32/m32,XMM
        把源寄存器的低32位内容送入目的存储器32位.
        
        movq XMM,XMM/m64
        把源存储器低64位内容送入目的寄存器的低64位,高64位清零.
        
        movq m64,XMM
        把源寄存器的低64位内容送入目的存储器.
        
        pand XMM,XMM/m128
        源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
      ◎我发现与andpd功能差不多,就不知其它特性是否一样.
        
        pandn XMM,XMM/m128
        目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
        
        por XMM,XMM/m128
        源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
        
        pxor XMM,XMM/m128
        源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
        
        packuswb XMM,XMM/m128   (此指令与前面的MMX指令packuswb MM,MM/m64操作相同,只是变成了128位)
        把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低64位
        把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高64位
        压缩时负数变为00h,大于255的正数变为0ffh,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
        源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
        目的寄存器压缩结果:   b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
        
        packsswb XMM,XMM/m128   (此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位)
        把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低64位
        把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高64位
        压缩时小于-128负数变为80h,大于127的正数变为7fh,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
        源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
        目的寄存器压缩结果:   b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
        
        packssdw XMM,XMM/m128
        把目的寄存器按双字有符号数压缩为字有符号数放入目的寄存器低64位
        把源寄存器按双字有符号数压缩为字有符号数放入目的寄存器高64位
        压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:                a0      |      a1     |      a2     |      a3
        源寄存器:                  b0      |      b1     |      b2     |      b3
        目的寄存器压缩结果:    b0  |   b1  |  b2  |  b3  |  a0  |  a1  |  a2  |  a3
        
        punpckldq XMM,XMM/m128
        把源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:                a0      |      a1     |      a2     |      a3
        源寄存器:                  b0      |      b1     |      b2     |      b3
        目的寄存器排列结果:        b2      |      a2     |      b3     |      a3
        
        punpckhdq XMM,XMM/m128
        把源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:                a0      |      a1     |      a2     |      a3
        源寄存器:                  b0      |      b1     |      b2     |      b3
        目的寄存器排列结果:        b0      |      a0     |      b1     |      a1
        
        punpcklwd XMM,XMM/m128
        把源存储器与目的寄存器低64位按字交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
        源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
        目的寄存器排列结果:    b4  |   a4  |  b5  |  a5  |  b6  |  a6  |  b7  |  a7
        
        punpckhwd XMM,XMM/m128
        把源存储器与目的寄存器高64位按字交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
        源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
        目的寄存器排列结果:    b0  |   a0  |  b1  |  a1  |  b2  |  a2  |  b3  |  a3
        
        punpcklbw XMM,XMM/m128
        把源存储器与目的寄存器低64位按字节交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:           a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
        源寄存器:             b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
        目的寄存器排列结果:   b8|a8| b9| a9| bA|aA| bB|aB| bC|aC| bD|aD| bE|aE| bF| aF
        
        punpckhbw XMM,XMM/m128
        把源存储器与目的寄存器高64位按字节交错排列,内存变量必须对齐内存16字节.
                                         高64位          |           低64位
        目的寄存器:           a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
        源寄存器:             b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
        目的寄存器排列结果:   b0|a0| b1| a1| b2|a2| b3|a3| b4|a4| b5|a5| b6|a6| b7| a7
        
        ───────────────────────────
        shufps XMM,XMM/m128,imm8(0~255)    SSE1指令
        把源存储器与目的寄存器按双字划分,由imm8(立即数)八个二进制位(00~11,00^11,00~11,00~11)指定排列,
        内存变量必须对齐内存16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.
        '( )'中的都是二进制数.
                                            高64位             |              低64位
        目的寄存器:                a(11)      |      a(10)     |      a(01)     |      a(00)
        源寄存器:                  b(11)      |      b(10)     |      b(01)     |      b(00)
        目的寄存器排列结果:      b(00~11)     |    b(00~11)    |    a(00~11)    |    a(00~11)
        目的寄存器压缩结果'( )'中的值由imm8对应的两位二进制位指定.
        例:
                 (  11  ) (  10  ) (  01  ) (  00  )           (  11  ) (  10  ) (  01  ) (  00  )
        当XMM0 = 090a0b0c 0d0e0f11 01020304 05060708 h,XMM1 = 0aabbccdd eeff1234 22334455 66778899 h,
                                    imm8       ══>        (XMM1 10) (XMM1 01) (XMM0 11) (XMM0 00)
        执行shufps XMM0,XMM1,10 01 11 00 b(二进制),则XMM0 = 0eeff1234  22334455   090a0b0c 05060708 h
        由例子中我们发现imm8=10011100b,imm8的高4位选的是源存储器,低4位选的是目的寄存器,imm8的最高两位
        为 10b 那么就选则XMM1中的第 2(从0开始选择) 个双字,发现为0eeff1234h,就放入XMM0的高32位(原来的
        值已经自动保护起来了),01b就选择XMM1中的第2个,11选择XMM0中的第3个,00选择XMM0中的第0个.
        当然imm8中4个选则也可以相同,比如shufps XMM0,XMM1,10 10 10 10 b,那么结果为:
        XMM0 = 0eeff1234 eeff1234 0d0e0f11 0d0e0f11 h.
        
        
        shufpd XMM,XMM/m128,imm8(0~255)      imm8(操作值) = imm8(输入值) mod 4
        把源存储器与目的寄存器按四字划分,由imm8(立即数)4个二进制位(0~1,0^1,0~1,0~1)指定排列,
        内存变量必须对齐内存16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.
                                            高64位             |              低64位
        目的寄存器:                          a(1)              |               a(0)
        源寄存器:                            b(1)              |               b(0)
        目的寄存器排列结果:                 b(0~1)             |              a(0~1)
        例:
        当XMM0 = 1111111122222222 3333333344444444 h
          XMM1 = 5555555566666666 aaaaaaaacccccccc h,执行shufpd XMM0,XMM1,101001 1 0 b
        则XMM0 = 5555555566666666 3333333344444444 h
        因为101001 1 0 b mod 4(101001 1 0 b & 11b),得到操作值为1 0b,
        1选择XMM1的第1位5555555566666666h,0选择XMM0的第0位3333333344444444.
        
        pshuflw XMM,XMM/m128,imm8(0~255)
        先把源存储器的高64位内容送入目的寄存器的高64位,然后用imm8将源存储器的低64位4个字选入
        目的寄存器的低64位,内存变量必须对齐内存16字节.
                                                            低64位
        源寄存器低64位:           b(11)      |      b(10)     |      b(01)     |      b(00)
        目的寄存器低64位排列结果: b(00~11)   |    b(00~11)    |    b(00~11)    |    b(00~11)
        例:
        当XMM0 = 1111111122222222 3333 4444 5555 6666 h
          XMM1 = 5555555566666666 7777 8888 9999 cccc h,执行pshuflw XMM0,XMM1,10 10 01 10 b
        则XMM0 = 5555555566666666 8888 8888 9999 8888 h
        
        pshufhw XMM,XMM/m128,imm8(0~255)
        先把源存储器的低64位内容送入目的寄存器的低64位,然后用imm8将源存储器的高64位4个字选入
        目的寄存器的高64位,内存变量必须对齐内存16字节.
                                                            高64位
        源寄存器高64位:           b(11)      |      b(10)     |      b(01)     |      b(00)
        目的寄存器高64位排列结果: b(00~11)   |    b(00~11)    |    b(00~11)    |    b(00~11)
        例:
        当XMM0 = 3333 4444 5555 6666 1111111122222222 h
          XMM1 = 7777 8888 9999 cccc 5555555566666666 h,执行pshufhw XMM0,XMM1,10 10 01 10 b
        则XMM0 = 8888 8888 9999 8888 5555555566666666 h
        
        pshufd XMM,XMM/m128,imm8(0~255)
        将源存储器的4个双字由imm8指定选入目的寄存器,内存变量必须对齐内存16字节.
                                           高64位             |              低64位
        源寄存器:                 b(11)      |      b(10)     |      b(01)     |      b(00)
        目的寄存器排列结果:       b(00~11)   |    b(00~11)    |    b(00~11)    |    b(00~11)
        例:
        当XMM1 = 11111111 22222222 33333333 44444444 h,执行pshufd XMM0,XMM1,11 01 01 10b
        则XMM0 = 11111111 33333333 33333333 22222222 h
        
        
        
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁


    啊!不容易,终于写好了,那手敲了累呀,不过能为许多初学者带来一点方便我还是很开心的,因为网上真的很难找到如此详细
的中文说明了,我刚学时也到网上去搜索,就是找不到满意的,而很多高手不知是因为忙,还是嫌这个太初级了,不高兴写,哎…,难
怪我国的IT事业如此落后,如果多几个像 罗云彬 这样的人,我国的软件事业肯定会更上几个台阶,可惜太少了,悲哉.
    本人就是通过学习 罗云彬 的《windows环境下32位汇编语言程序设计》开始win32编程的,算算学了有半年了,从中学了不少
知识,看他的书学习效率实在太高了,认识此书也是我在网上搜索win32汇编教程的时发现的,当时下载的是完整的chm文挡,阅读了
几天,发现写了实在太好了,十分适合我这个已学了半年D0S汇编的菜鸟,所以我就去网上书店买了一本第二版的,从此遍开始了我
的汇编之旅,学习的中间充满了辛酸,同学的冷笑,老师的劝解,说什么年代了还在钻研汇编语言,只要了解就可以了,现在应该去学
习C++,JAVA,Delphi等等,但是我没有改变我的立场,我坚信学好汇编以后会对我将来学习高级语言带来莫大的帮助,可以打下坚实
的基础,因为汇编语言是一门非常基础的语言,掌握她可以更好的对高级语言中的一些包装好的一些东西有本质上的认识,这对于
一名优秀的程式设计师来说是十分必要的,当然光学习汇编语言是不行的,还得去深入学习数据结构与算法,这些才是最最重要的,
比熟练API还重要.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -