Interpréter les registres GDB (registres SSE)

J’utilise GDB depuis 1 jour et j’en ai une bonne compréhension. Cependant, lorsque je configure un point d’arrêt au dernier point-virgule à l’aide de la BDG et des registres d’impression, je ne peux pas interpréter complètement la signification des données stockées dans le registre XMM.

Je ne sais pas si les données sont au format (MSB> LSB) ou vice versa.

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

Donc, c’est le résultat que je reçois.

 (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 } 

Donc, quelqu’un me guiderait gentiment comment interpréter les données.

Les registres SSE (XMM) peuvent être interprétés de différentes manières. Le registre lui-même ne connaît pas la représentation implicite des données, il ne contient que 128 bits de données. Un registre XMM peut représenter:

 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 

Ainsi, lorsque gdb affiche un registre XMM, il vous donne toutes les interprétations possibles, comme indiqué dans votre exemple ci-dessus.

Si vous voulez afficher un registre en utilisant une interprétation spécifique (par exemple 16 x 8 bits), vous pouvez le faire comme ceci:

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

Pour endianness, gdb affiche le contenu du registre dans l’ordre naturel, c’est-à-dire de gauche à droite, de MS à LS.

Donc, si vous avez le code suivant:

 #include  #include  #include  int main(int argc, char *argv[]) { int8_t buff[16] __atsortingbute__ ((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; } 

Si vous comstackz et exécutez ceci, vous verrez:

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

Cependant, si vous parcourez le code dans gdb et examinez v vous verrez:

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