【发布时间】:2015-01-08 21:26:36
【问题描述】:
这是我的源代码:
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--)。为什么会这样?
【问题讨论】:
-
您很可能在 little-endian 环境中工作。字节只是以“另一种方式”存储。 See here
-
@lared 如何切换到高字节序?
-
@KorayTugay:你没有(大多数架构不能,而那些可以的,会导致你所有的程序崩溃)。您所做的是停止在 32 位视图中查看字节数组。使用面向字节的视图来匹配您的数据。当你说“位置 0x804a010 中的数据是 0x61707070”时你错了 实际上位置 0x804a010 中的数据是 0x70
-
你(很可能!)不能。当我说环境时,我还指的是您正在使用的硬件。你能告诉我你的电脑有什么处理器吗?
-
我一直认为您使用的是 x86 兼容处理器 - 英特尔历来在其处理器中使用小端约定,并且不允许切换它(与某些 ARM 处理器不同)。一般来说,您的程序应该与字节序无关,但是当使用 x86 程序集时,您可以假设它是小字节序。你真的无能为力。
标签: linux assembly x86 endianness