gpt4 book ai didi

unix - 解释GDB寄存器(SSE寄存器)

转载 作者:行者123 更新时间:2023-12-02 14:51:27 27 4
gpt4 key购买 nike

我已经使用 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
}

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

最佳答案

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}

关于unix - 解释GDB寄存器(SSE寄存器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21038407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com