linux - 为什么内存中存储的数据是颠倒的?

标签 linux assembly x86 endianness

这是我的源代码:

section .data           
msg:    db "pppaaa"     
len:    equ $
section .text           
    global  main    
main:                    
    mov     edx,len 
    mov     ecx,msg 
    mov     ebx,1   
    mov     eax,4   
    int     0x80

当我调试这段代码时,我会看到:

(gdb) info register ecx
ecx            0x804a010        134520848
(gdb) x 0x804a010
0x804a010 <msg>:        0x61707070
(gdb) x 0x804a014
0x804a014:      0x00006161

这里的“70”显然代表字符“p”,“61”显然代表字符“a”。

我感到困惑的是,为什么位置 0x804a010 中的数据是 0x61707070 (appp) 而在 0x804a014 处向前移动 4 个字节的数据是 --aa ?

我希望在第一个位置看到 (pppa),在第二个位置看到 (aa--)。为什么会这样?

最佳答案

GDB 不知道你有一堆字符。您只是要求它查看内存位置,它会显示那里的内容,默认为 4 字节整数。它假定整数首先存储最低有效字节,因为英特尔就是这样做的,因此您可以颠倒字节。

要解决此问题,请在 x 命令中使用格式说明符,如下所示:

 x/10c 0x804a010 

(将从 0x804a010 开始打印 10 个字符)。

GDB 中的

help x 将提供更多信息。

关于linux - 为什么内存中存储的数据是颠倒的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27849798/

相关文章:

c - 如何确保数据写入物理介质?

android - 无法执行子项,getpt 失败 : no suck file or directory

assembly - Assembly-RiscV 中的 "not"是什么意思?

c - 将生成的程序集重写为 GCC 内联汇编

c - GCC 如何初始化自动变量?它们保证为 0 吗?

math - Bullet Physics 四元数 sse 实现疑惑

c++ - 如何交叉编译C++文件

linux - CMAKE install 命令后处理文件

performance - 在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或and?

assembly - 如何在 MASM 中为近乎直接的相对调用/jmp 编写绝对目标