Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86程序集堆栈布局混乱_Assembly_X86_Stack_Disassembly - Fatal编程技术网

Assembly x86程序集堆栈布局混乱

Assembly x86程序集堆栈布局混乱,assembly,x86,stack,disassembly,Assembly,X86,Stack,Disassembly,我有两个不同的二进制文件,它们的main函数的分解如下: 80483d4: 55 push %ebp 80483d5: 89 e5 mov %esp,%ebp 80483d7: 83 e4 f0 and $0xfffffff0,%esp 80483da: 83 ec 20 sub $0x20,%esp 80483

我有两个不同的二进制文件,它们的
main
函数的分解如下:

 80483d4:   55                      push   %ebp
 80483d5:   89 e5                   mov    %esp,%ebp
 80483d7:   83 e4 f0                and    $0xfffffff0,%esp
 80483da:   83 ec 20                sub    $0x20,%esp
 80483dd:   8d 45 08                lea    0x8(%ebp),%eax
 80483e0:   89 44 24 1c             mov    %eax,0x1c(%esp)
另一个是:

 80483d4:   8d 4c 24 04             lea    0x4(%esp),%ecx            
 80483d8:   83 e4 f0                and    $0xfffffff0,%esp         
 80483db:   ff 71 fc                pushl  -0x4(%ecx)                
 80483de:   55                      push   %ebp                     
 80483df:   89 e5                   mov    %esp,%ebp    
...
 80483e6:   89 4d f0                mov    %ecx,-0x10(%ebp) 

第一个是在GNU/Linux 2.6.24下编译的,第二个是在GNU/Linux 2.6.9下编译的。在大多数情况下,我将返回地址理解为
0x4(%esp)
,将
0x8(%esp)
理解为第一个参数。显然,第一个二进制文件使用了
0x8(%ebp)
——与对齐之前的
0x8(%esp)
相同——作为第一个参数,而第二个二进制文件使用
0x4(%esp)
作为第一个参数,这让我搞不清楚它为什么会这样做。这是因为它们是在不同版本的GNU/Linux下编译的吗?

似乎两者都引用了第一个参数。第一个示例中的
8(%ebp)
与第二个示例中的
4(%esp)
之间位移差异的原因是一个发生在
ebp
保存之前,另一个发生在保存之后

要说清楚:

movl 4(%esp), %eax # here, the first argument is at esp + 4
push %ebp          # push has the effect of esp -= 4
movl %esp, %ebp
movl 8(%ebp), %eax # here, the first argument is at esp + 8 (or equivalently, ebp + 8)
另一个有趣的问题是,在将堆栈指针保存到一个二进制文件中的
ebp
之前,以及保存到另一个二进制文件中之后,都要对齐堆栈指针。这对我来说似乎很奇怪-我只能假设在后一种情况下,
esp
的旧值在main返回之前的某个点从
ecx
重新计算。

等待。。。我仍然失去了x(那么为什么esp+4会指向第一个参数,而之后…..啊ebp被推了!!!!!我明白了。我不知道为什么我错过了那一点!我是多么愚蠢。。