1. 程式人生 > >遇到SSE相關指令含義整理

遇到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

同上,沒找到區別