为什么GDB按单词分组时会以相反的顺序打印内存?
我对内存的外观很感兴趣,并创建了一个基本的C结构:
typedef struct example_struct {
char foo[17];
} example_struct;
int main() {
struct example_struct *address_ptr;
char char_string[] = "AZZZBZZZCZZZDZZZ";
address_ptr = (example_struct *) malloc(sizeof(example_struct));
strcpy(address_ptr->foo, char_string);
return 1;
}
我在return语句中创建了一个断点,并在gdb中使用x/20xb address_ptr
向我显示了20个字节的原始内存。看起来完全符合预期:
(lldb) x/20xb address_ptr
0x7fbf40500190: 0x41 0x5a 0x5a 0x5a 0x42 0x5a 0x5a 0x5a
0x7fbf40500198: 0x43 0x5a 0x5a 0x5a 0x44 0x5a 0x5a 0x5a
0x7fbf405001a0: 0x00 0x00 0xd7 0xa1
但是,当使用x/5xw
(将内存分为字,每个块4个字节,5乘以4个字节也等于20个字节)时,我遇到了一些奇怪的事情:
(lldb) x/5xw address_ptr
0x7fbf40500190: 0x5a5a5a41 0x5a5a5a42 0x5a5a5a43 0x5a5a5a44
0x7fbf405001a0: 0xa1d70000
每个块都必须从右到左读取。为什么会这样?
这是正确的吗?何时:为什么将4个字节分组在一起时的读取方向颠倒了?由于最常见的体系结构上的内存是字节可寻址的(就像我的一样),我认为反向表示不是它在内存中的实际存储方式,是吗?
我只是想知道,也许有人会启发我,为什么gdb这样做,为什么只在每个块以四个字节打印十六进制时,为什么在以未分组的内存十六进制格式打印时顺序却不颠倒呢?
预先感谢:)