gpt4 book ai didi

特定内存地址上的内容与 gdb 中的预期不同

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:52 25 4
gpt4 key购买 nike

我有一个 int 类型的变量 i,它的值为 129。我在 gdb 中使用了这个变量的各种表示。

# Decimal format of i
(gdb) p/d i
$18 = 129


# Binary format of i
(gdb) p/t i
$19 = 10000001


# Address of variable i
(gdb) p &i
$20 = (int *) 0xbffff320


# Binary format displayed at one byte
(gdb) x /tb &i
0xbffff320: 10000001


# Decimal format displayed at four bytes (one word)
(gdb) x /dw &i
0xbffff320: 129


# Decimal format displayed at one byte
(gdb) x /db &i
0xbffff320: -127

上面的输出可能是因为 10000001 根据 page 的二进制补码等价于 -127如果我错了,请纠正我。

据此:

# Size of int in bytes:
(gdb) p sizeof(int)
$22 = 4

我知道 int 在计算机内存中占用 4 个字节。因此,如果我的理解是正确的,那么数字驻留在内存中的某个地址上并占用 4 个字节(或 32 位,或 1 个字或 1/2 个巨字)。然后这个数字的表示是这样的:

AAAAAAAA: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

在哪里

AAAAAAAA is the location in memory and
XXXXXXXX is the bits of that number (i have divided this bits into four octets for better understanding)

因此,当我访问 int 数字时,我需要知道它的地址以及它消耗了多少位。所以 int 占用 32 位,可以使用 & 运算符获取地址。这是我在内存中的实际 int 表示(顺便说一句,为什么两个不同是与系统上的字节序设置有关还是什么?):

# Binary format displayed as one word (4 bytes) (I have put space between group of 8 bits for better understanding)
(gdb) x /tw &i
0xbffff320: 00000000 00000000 00000000 10000001

# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320: 10000001 00000000 00000000 00000000

现在是一些基础数学:

0xbffff320:     00000000 00000000 00000000 10000001
AAAAAAAA: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
AAAAAAAA: 8bits 8bits 8bits 8bits

8*3=24
(24)DEC == (0x18)HEX
0xbffff320 + 0x18 = 0xBFFFF338

0xBFFFF338 应该是我最后一个八位字节的地址。那么为什么这给我 11001100 而不是 10000001

(gdb) x/tb 0xBFFFF338
0xbffff338: 11001100

我正在打印一个字节。如果我正在打印消耗 4 个字节的整个 int(我不认为这在我的情况下是可能的,因为我没有对应于这个内存的变量名,但你明白了)它可能是一些奇怪的数字,因为我我在声明的变量之后访问内存,可能会有一些垃圾,而且我的 10000001 会驻留在最重要的八位字节中,但为什么是现在?

编辑:根据建议,我添加了 3 个字节而不是之前的 24 个字节,但结果仍然是错误的:

(3)DEC == (3)HEX
0xbffff320 + 0x3 = 0xbffff323

(gdb) x/tb 0xbffff323
0xbffff323: 00000000

仍然没有返回 10000001 这里有什么问题?

最佳答案

看来你已经自己解决了这个问题:

(gdb) x /tb &i
0xbffff320: 10000001 #### Look at the address of this byte ####

# Binary format displayed as four bytes
(gdb) x/4tb &i
0xbffff320: 10000001 00000000 00000000 00000000
# +0 +1 +2 +3

整数以最低有效字节在先的方式存储。其他 3 个字节包含 00000000

大概是这样

(gdb) x/tb 0xbffff320
0xbffff320: 10000001

(gdb) x/tb 0xbffff321
0xbffff321: 00000000

(gdb) x/tb 0xbffff322
0xbffff322: 00000000

(gdb) x/tb 0xbffff323
0xbffff323: 00000000

关于特定内存地址上的内容与 gdb 中的预期不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29286178/

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