【问题标题】:Interpreting GDB registers (SSE registers)解释 GDB 寄存器(SSE 寄存器)
【发布时间】:2014-01-10 07:26:16
【问题描述】:

我使用 GDB 已经 1 天了,对它有了相当的了解。 但是,当我使用 GDB 在最后的分号处设置断点并打印寄存器时,我无法完全解释存储到 XMM 寄存器中的数据的含义。

我不知道数据是 (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
}

那么有人会指导我如何解释数据。

【问题讨论】:

    标签: unix x86 gdb sse


    【解决方案1】:

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

    【讨论】:

    • 所以我正在使用内部函数_mm_load_si128加载一个数组,但是我不知道数组中的最高有效字节是否会成为寄存器中的最低有效字节。
    • 一般你不需要担心这个,但是正常的x86 little endian约定适用,所以16字节加载的LS字节在16字节寄存器的LS字节中。 gdb 以自然顺序显示寄存器 - 请参阅上面的编辑回答。
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多