2014-01-10 157 views
3

我一直在使用GDB一天,我已經積累了相當的理解。 但是,當我使用GDB和打印寄存器在最終分號處設置斷點時,我無法完全解釋存儲到XMM寄存器中的數據的含義。解釋GDB寄存器(SSE寄存器)

我不知道數據是以(MSB> LSB)格式存在,反之亦然。

__m128i S = _mm_load_si128((__m128i*)Array16Bytes); 

} 

所以這是我得到的結果。

(gdb) print $xmm0 
$1 = { 
    v4_float = {1.2593182e-07, -4.1251766e-18, -5.43431603e-31, -2.73406277e-14}, 
    v2_double = {4.6236050467459811e-58, -3.7422963639201271e-245}, 
    v16_int8 = {52, 7, 55, -32, -94, -104, 49, 49, -115, 48, 90, -120, -88, -10, 67, 50}, 
    v8_int16 = {13319, 14304, -23912, 12593, -29392, 23176, -22282, 17202}, 
    v4_int32 = {872888288, -1567084239, -1926210936, -1460255950}, 
    v2_int64 = {3749026652749312305, -8273012972482837710}, 
    uint128 = 0x340737e0a29831318d305a88a8f64332 
} 

所以有人會好心指導我如何解釋數據。

回答

7

SSE(XMM)寄存器可以用各種不同的方式解釋。寄存器本身不知道隱式數據表示,它只保存128位數據。 XMM寄存器可以表示:

4 x 32 bit floats  __m128 
2 x 64 bit doubles  __m128d 
16 x 8 bit ints   __m128i 
8 x 16 bit ints   __m128i 
4 x 32 bit ints   __m128i 
2 x 64 bit ints   __m128i 
128 individual bits  __m128i 

所以GDB顯示,當XMM寄存器它可以提供所有可能的解釋,如在你上面的例子。

如果你想用一個具體的解釋(例如,16×8位整數),以顯示寄存器,然後你可以做這樣的:

(gdb) p $xmm0.v16_int8 
$1 = {0, 0, 0, 0, 0, 0, 0, 0, -113, -32, 32, -50, 0, 0, 0, 2} 

至於字節序,GDB顯示自然順序寄存器內容,即從MS到LS的從左到右。

所以,如果你有下面的代碼:

#include <stdio.h> 
#include <stdint.h> 

#include <xmmintrin.h> 
int main(int argc, char *argv[]) 
{ 
    int8_t buff[16] __attribute__ ((aligned(16))) = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 

    __m128i v = _mm_load_si128((__m128i *)buff); 

    printf("v = %vd\n", v); 

    return 0; 
} 

如果您編譯並運行此您將看到:

v = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

不過,如果你通過代碼在gdb步驟和檢查v你會見:

v16_int8 = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} 
+0

所以我使用內部函數_mm_load_si128加載數組,但是我沒有知道數組中的最高有效字節是否成爲寄存器中的最低有效字節。 – Nocturnal

+0

一般而言,您不需要擔心這一點,但是正常的x86小端規則適用,因此16字節負載的LS字節位於16字節寄存器的LS字節中。 gdb以自然順序顯示寄存器 - 請參閱上面的回答編輯。 –