遇到SSE相關指令含義整理
阿新 • • 發佈:2018-11-09
工作需要逆向微信部分程式碼,遇到了這個指令集,資料很少,整理如下:
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
同上,沒找到區別