汇编 - 如何使用ecx = esp的0x80工作?

时间:2012-03-11 14:47:06

标签: assembly x86

我有下一个代码:

Doit: mov eax, 4 ; for write system call
      push Dword, 0x44434241
      mov ebx, 1
      mov ecx, esp
      mov edx, 4
      int 0x80
      add esp, 4
      ret

当我检查时,它是打印“ABCD”,但为什么?据我所知,在堆栈上我们有下一张图片:

低--- 0x41 0x42 0x43 0x44 - esp,

即esp指向0x44。当我们调用0x80时。它应该打印“DCBA”。我错过了什么?

2 个答案:

答案 0 :(得分:2)

您的堆叠图片错误。由于x86是一个小端架构,因此ESP等于推送值中最低有效字节的地址,或0x41

来自Intel's priceless Architecture Developer's Manual

  

当项目被推入堆栈时,处理器会递减   ESP寄存器,然后将项目写入堆栈的新顶部。

答案 1 :(得分:1)

这只是一个endianness问题。您只需将32位值压入堆栈,该堆栈将位于地址ESP处。 x86是little-endian,并且首先存储最不重要的字节:

ESP + 0(0x41),ESP + 1(0x42),ESP + 2(0x43),ESP + 3(0x44)。然而,当作为字节数组访问时,它在ESP处启动并通过内存递增。

使用堆栈时出现 nothing 错误,只是误解了word / dword / qword存储与字节访问。