这是我拥有的源代码:
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字节整数。它假定该整数首先存储了最低有效字节,因为这是在Intel上完成的,因此您的字节反转了。
要解决此问题,请在x
命令中使用格式说明符,如下所示:
x/10c 0x804a010
((将从0x804a010开始打印10个字符。
GDB中的[help x
将提供更多信息。
内存中的所有数据都转换为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)