为什么存储在存储器中的数据反转了?

问题描述 投票:1回答:2

这是我拥有的源代码:

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--)。为什么会这样?

linux assembly x86 endianness
2个回答
3
投票

GDB不知道您有一堆字符。您只是要求它查看一个内存位置,并显示那里的内容,默认为4字节整数。它假定该整数首先存储了最低有效字节,因为这是在Intel上完成的,因此您的字节反转了。

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

 x/10c 0x804a010 

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

GDB中的[help x将提供更多信息。


0
投票

内存中的所有数据都转换为little-endian顺序。呵呵..来自Koray Tugay的评论我如何切换到高字节序?

当然,您可以使用bswap指令。是的,这不是您的代码示例,而是使用bswap指令的示例,如下所示:

    mov     eax,0x61707070
    bswap   eax

跟随调试器:

% gdb -q bswap    
Reading symbols from bswap...(no debugging symbols found)...done.
(gdb) r
Starting program: /home/user/programming/assembly/bswap 

Program received signal SIGSEGV, Segmentation fault.
0x08048067 in ?? ()
(gdb) i r $eax
eax            0x70707061       1886416993
(gdb)
© www.soinside.com 2019 - 2024. All rights reserved.