X86 gdb中的小端点

X86 gdb中的小端点,x86,gdb,endianness,X86,Gdb,Endianness,大-000000000000110 00000000000000000001 LIT-00000001 00000000 00000110 00000000 所以我期望0xcfb01420+2是0x6,但事实并非如此。我错过什么了吗 0x0 0x6 0x0 0x1 我的假设是,小端格式的0x601的字节序列应该与我上面表示的方式相匹配。因此,第二个字节应该是全零。我想我已经把所有的半字节都放对了。相对于您实际检查的内容,您的初始十六进制值都缺少数

大-000000000000110 00000000000000000001

LIT-00000001 00000000 00000110 00000000

所以我期望0xcfb01420+2是0x6,但事实并非如此。我错过什么了吗

        0x0      0x6      0x0       0x1

我的假设是,小端格式的0x601的字节序列应该与我上面表示的方式相匹配。因此,第二个字节应该是全零。我想我已经把所有的半字节都放对了。

相对于您实际检查的内容,您的初始十六进制值都缺少数字

00000001
0x01
——它是8个二进制数字,因此是一个完整字节

因此
0x601
=
0x0601
=
00000110 00000001

您可以在gdb中通过以下方式看到这一点:

(gdb) p &tx_q_sem->mlock.u.mtxa_owner
$41 = (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
$34 = 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
$36 = 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
$37 = 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
$38 = 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
$39 = 0x0

相对于您实际检查的内容,您的初始十六进制值都缺少数字

00000001
0x01
——它是8个二进制数字,因此是一个完整字节

因此
0x601
=
0x0601
=
00000110 00000001

您可以在gdb中通过以下方式看到这一点:

(gdb) p &tx_q_sem->mlock.u.mtxa_owner
$41 = (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
$34 = 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
$36 = 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
$37 = 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
$38 = 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
$39 = 0x0

使用
x/4xb 0xcfb01420
检查内存中的4个字节,分别显示每个字节。比打印它们容易得多。虽然你也可以做
p/x(char[4])tx_q_sem->mlock.u.mtxa_owner
,但我想。谢谢你的评论,不过我想我并没有像我想的那样清楚地表达我的问题。即使使用您的方法,也不会发生任何变化。我的问题是GDB中没有正确显示little endian。对于x86小端字节格式,0x6应该位于第三个字节。(gdb)x/4xb0xcfb01420给我0xcfb01420:0x01 0x06 0x00 0x00。还是我的转换本身是错误的?记住一个字节是两个十六进制数字(半字节)宽。Tom的答案是正确的,当分别打印每个字节时,gdb忽略了前导零,这让您感到困惑。
0x601
6
的位置值为2^8:它是
6*(1U这些都是错误的。谢谢,前提本身是错误的。你们两个都是对的,我弄糊涂了,并在不同的半字节中处理前导零。使用
x/4xb 0xcfb01420
检查内存中的4个字节,分别显示每个字节。这比打印它们容易得多。尽管您也可以执行
p/x(char[4])tx_q_sem->mlock.u.mtxa_owner
,我想。谢谢你的评论,但是我想我没有像我想的那样清楚地表达我的问题。即使你的方法也没有改变。我的问题是GDB中的小尾端没有正确显示。对于x86小尾端格式,0x6应该在第三个字节。(GDB)x/4xb 0xcfb01420给我0xcfb01420:0x01 0x06 0x00 0x00。或者是我的转换本身是错误的?记住一个字节是两个十六进制数字(半字节)宽。Tom的答案是正确的,您会被gdb在单独打印每个字节时忽略前导零弄糊涂。
0x601
6
的位置值是2^8:它是
6*(1U这些都是错误的。谢谢,前提本身是错误的。你们都是对的,我弄糊涂了,把前导零放在另一个半字节中处理。