2014-01-10 3 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 레지스터는 나타낼 수 : GDB가 표시되면

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 

은 그래서 XMM는 위의 예에서 볼 수 있듯이, 그것은 당신에게 모든 가능한 해석을 제공 등록합니다. 특정 해석 (예 : 16 × 8 비트의 int)를 사용하여 레지스터를 표시하려면

당신은 이런 식으로 작업을 수행 할 수 있습니다

엔디 언에 관해서는
(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까지.

다음과 같은 코드가 그래서 경우 : 당신이됩니다 당신은 GDB에서 코드를 단계별 그러나 경우

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

v을 검사 : 컴파일하고이를 실행하면

#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; 
} 

당신은 볼 것이다 참조 :

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는 자연 순서대로 레지스터를 표시합니다. 위의 편집을 참조하십시오. –

관련 문제