加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:17:36 所属栏目:安全 来源:网络整理
导读:我已经使用GDB一天了,我已经积累了很好的理解. 但是,当我使用GDB和打印寄存器在最后一个分号设置断点时,我无法完全解释存储在XMM寄存器中的数据的含义. 我不知道数据是否是(MSB LSB)格式,反之亦然. __m128i S = _mm_load_si128((__m128i*)Array16Bytes);} 所
我已经使用GDB一天了,我已经积累了很好的理解.
但是,当我使用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,-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,-113,32,-50,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,8,9,10,11,12,13,14,15 };

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

    printf("v = %vdn",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,0}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读