0

我不明白为什么代码的输出是Ole。小字节序不应该影响推送命令吗?

global _start

  section .data
x: dd 3

section .text
_start:
  mov eax, 4
  mov ebx, 1
  mov dword[x], 0x0a656c4f
  push dword[x]
  mov ecx, esp
  mov edx, 4
  int 0x80
  mov eax,1 
  mov ebx, 0
  int 0x80

如果我在mov dword[x], 0x0a656c4f之后得到它,那么内存布局是:

  0a (higher) 
  65 
  6c 
  4f (lower)

因为 x86 的字节顺序很小,并且 x 指向值为4f的字节。在push dword[x]之后,有相同的堆栈图片(随着它向下增长而反转),其中esp指向0a

同样的问题与代码相关时

  mov dword[x], 0x0a656c4f
  push dword[x]

替换为:

push dword 0x0a656c4f

谢谢。

4

2 回答 2

2

堆栈向下增长:

推送前:

****
****
**** <--- ESP

之后push DWORD 0x0a656c4f

****
****
****            -+
0x0A             |
0x65             ^
0x6C             |
0x4F <--- ESP   -+- write(2) four bytes from here
于 2013-07-20T15:01:41.327 回答
1

请记住,“小端”(或大端)适用于多字节数字。“hello world”不会“向后”存储在内存中。同样,堆栈在push减少的意义上“向下增长” esp- 内存不会仅仅因为它在堆栈上而“倒置”。

Nasm 语法的一个相关(?)奇怪之处在于,假设字符常量按照您编写它们的顺序排列。例如,如果您正在搜索环境变量,Nasm 会期望:

cmp dword [esi], 'HOME'

Other assemblers might expect:

cmp dword ptr [esi], 'EMOH'

当您从一个汇编程序的语法“翻译”到另一个汇编程序的语法时,这主要是一个问题......

于 2013-07-20T17:06:41.200 回答