gdb 中的 Little Endian
Little Endian in gdb
0x0 0x6 0x0 0x1
大 - 00000000 00000110 00000000 00000001
LIT - 00000001 00000000 00000110 00000000
所以我期望 0xcfb01420 + 2 为 0x6,但事实并非如此。我错过了什么吗?
(gdb) p &tx_q_sem->mlock.u.mtxa_owner
= (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
= 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
= 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
= 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
= 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
= 0x0
我的假设是小端格式的 0x601 的字节序列应该与我上面表示的方式相匹配。因此第二个字节应该全为零。我猜我把所有的半字节都放对了。
相对于您实际检查的内容,您的初始十六进制值都缺少数字。
00000001
是 0x01
-- 它是 8 个二进制数字,所以是一个完整的字节。
所以0x601
== 0x0601
== 00000110 00000001
.
你可以在 gdb 中看到这个:
(gdb) print /t 0x601
= 11000000001
0x0 0x6 0x0 0x1
大 - 00000000 00000110 00000000 00000001
LIT - 00000001 00000000 00000110 00000000
所以我期望 0xcfb01420 + 2 为 0x6,但事实并非如此。我错过了什么吗?
(gdb) p &tx_q_sem->mlock.u.mtxa_owner
= (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
= 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
= 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
= 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
= 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
= 0x0
我的假设是小端格式的 0x601 的字节序列应该与我上面表示的方式相匹配。因此第二个字节应该全为零。我猜我把所有的半字节都放对了。
相对于您实际检查的内容,您的初始十六进制值都缺少数字。
00000001
是 0x01
-- 它是 8 个二进制数字,所以是一个完整的字节。
所以0x601
== 0x0601
== 00000110 00000001
.
你可以在 gdb 中看到这个:
(gdb) print /t 0x601
= 11000000001