小端和推入nasm

时间:2013-07-20 14:35:19

标签: assembly x86 nasm endianness

我不明白为什么代码的输出是 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 。 在推dword [x] 之后,堆叠的图片相同(向下反转),其中 esp 指向 0a

同样的问题与

时的代码有关
  mov dword[x], 0x0a656c4f
  push dword[x]

替换为:

push dword 0x0a656c4f

感谢。

2 个答案:

答案 0 :(得分:1)

堆栈向下

推前:

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

push DWORD 0x0a656c4f之后:

****
****
****            -+
0x0A             |
0x65             ^
0x6C             |
0x4F <--- ESP   -+- write(2) four bytes from here

答案 1 :(得分:0)

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

与Nasm语法相关的(?)奇怪的是假设字符常量按照你写的顺序排列。例如,如果您正在搜索环境变量,Nasm会期望:

cmp dword [esi], 'HOME'

Other assemblers might expect:

cmp dword [esi], 'HOME'

当你从一个汇编程序的语法“翻译”到另一个汇编程序的语法时,通常会出现问题...