gpt4 book ai didi

c - GDB 是否正确解释了内存地址?

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

我正在使用 GDB 检查内存地址的内容,但不知道它是否正确显示。

(gdb) p (char *)0x8182f40
$4 = 0x8182f40 "XYZ"
(gdb)


(gdb) x/40x 0x8182f40-16
0x8182f30: 0x00000000 0x00000000 0x000000a8 0x00000010
0x8182f40: 0x005a5958 0x00000000 0x00000000 0x00000029
0x8182f50: 0x00000000 0x00000000 0x00010000 0x082439d8
0x8182f60: 0x08199100 0x00000000 0x08000000 0x00002f08
0x8182f70: 0x00000002 0x000000b1 0x00000000 0x00000000
0x8182f80: 0x00000000 0x00000000 0x00000000 0x00000000
0x8182f90: 0x00000000 0x00000000 0x000000d4 0x00000002
0x8182fa0: 0x000003f1 0x00007162 0x00000002 0x08178d00
0x8182fb0: 0x00000000 0x080ef4b8 0x00000000 0x00000000
0x8182fc0: 0x00000000 0x00000000 0x0000021d 0x00000000

内容位于 0x8182f40上面显示为0x005a5958 ,但这看起来是相反的。对吗?

现在按字节打印,我明白了:

(gdb) x/40bx 0x8182f40-16
0x8182f30: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x8182f38: 0xa8 0x00 0x00 0x00 0x10 0x00 0x00 0x00
0x8182f40: 0x58 0x59 0x5a 0x00 0x00 0x00 0x00 0x00
0x8182f48: 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x00
0x8182f50: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

这个更有意义:0x8182f40: 0x58 0x59 0x5a<br/>
X Y Z

如何正确解读这些地址和内容?

最佳答案

那是 little endian .

在内存中存储多字节值时,有两种1存储方式:

  • 低地址上的低字节。这称为 Little Endian 或最低有效字节优先 (LSB)。

  • 低地址上的高字节。这称为 Big Endian 或最高有效字节优先 (MSB)。

从历史上看,有些 CPU 是小端,有些是大端,大端可能更常见,但小端盛行。部分原因是最常见的 ix86 架构是小端。第二个最常见的架构,ARM,可以配置为任何一种,虽然传统上许多操作系统将它用作 big endian(包括早期的 Linux),但最近似乎每个人都使用它 little endian。主要原因可能是为了避免必须检查从 ix86 移植的代码是否是字节序中立的。

原因是看起来“错误”只是两个约定的冲突:

  1. 数字从左到右书写,最高有效位在前
  2. 内存内容按照地址递增的顺序从左到右写入。

但这只是一个约定。在计算机中,在给定 intx 时,little endian 可能稍微更符合逻辑,等式 (char)x == *(char *)&x 成立,这在大端中是不正确的。当然,C 规范非常谨慎地保留了此实现的定义(使用 char 它不会违反严格的别名规则)。

1PDP-11 采用了第三种方式,一种称为中间字节序的特殊可憎之处,其中 16 位值是小字节序,但 32 位值由两个 16- big endian 中的位单元。

关于c - GDB 是否正确解释了内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23502179/

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