遇到SSE相关指令含义整理

工作需要逆向微信部分代码,遇到了这个指令集,资料很少,整理如下:

xmm0~xmm7 128位

mm0~mm7     64位

byte     一个字节、8bit

dword   双字,4个字节,32bit

qword   四字,8个字节,64bit

指令含义参照如下英文链接:

https://www.felixcloutier.com/x86/index.html

movdqu

movdqu xmm7,dqword ptr ds:[ebx]    从ebx所指向的地址中取双字存入xmm7

移入两个qword,可以在未对其的内存中操作,movdqa只能在对其内存中操作。

pextrb/pextrd/pextrq

pextrd edx,xmm7,0x3    //从xmm7中偏移3位抽取一个双字存储到edx。同理有pextrq,pextrb  根据最后一位字母决定抽取大小。byte、dword、qword分别代表单字,四字节和八字节。目标项可以是寄存器或内存地址,当是寄存器时,高位置零。

使用IDA F5反编译出的代码如下:

PEXTRB: int _mm_extract_epi8 (__m128i src, const int ndx);
PEXTRD: int _mm_extract_epi32 (__m128i src, const int ndx);
PEXTRQ: __int64 _mm_extract_epi64 (__m128i src, const int ndx);

pinsrb/pinsrd/pinsrq

pinsrd xmm7,ebp,0x3    // 在xmm7的03偏移的位置,插入ebp

同上,b,d,q代表不同的长度。

反编译如下:

PINSRB: __m128i _mm_insert_epi8 (__m128i s1, int s2, const int ndx);
PINSRD: __m128i _mm_insert_epi32 (__m128i s2, int s, const int ndx);
PINSRQ: __m128i _mm_insert_epi64(__m128i s2, __int64 s, const int ndx);

bswap

bswap ebx     //将ebx反序

pshufb

pshufb xmm1,xmm2 乱序,字节混淆。将xmm2乱序后传入xmm1

pshufw

pshufw mm2,mm1,0xC0   在mm1中取 c0 个单元存入mm2

PSHUFW: __m64 _mm_shuffle_pi16(__m64 a, int n)

movups

mov + u + ps   128位的传值。

xorps

xor + ps 128位异或

pxor

同上,没找到区别

猜你喜欢

转载自blog.csdn.net/liutianheng654/article/details/83055994
SSE