Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
C++ 通过在函数调用中从%esp中减去来分配多少空间?_C++_Assembly_Att - Fatal编程技术网

C++ 通过在函数调用中从%esp中减去来分配多少空间?

C++ 通过在函数调用中从%esp中减去来分配多少空间?,c++,assembly,att,C++,Assembly,Att,C++,ATT组件 我有以下汇编代码: push %ebp mov %esp, %ebp sub $0x28, %esp (...) 我的教科书声称,通过从%esp中减去0x28(作为堆栈形成的一部分),可以为变量分配12个字节。为什么从堆栈中减去十进制40会分配12个字节?我怀疑你可能误读了你的书,但如果你没有误读,在我看来,这本书在这方面似乎大错特错了 从堆栈指针中减去40将分配40个字节。这可能并不总是准确无误的,但任何偏离它的地方通常都非常小 例如,如果在32位代码中分配一个8字节

C++,ATT组件

我有以下汇编代码:

push %ebp
mov  %esp, %ebp
sub $0x28, %esp
(...)

我的教科书声称,通过从%esp中减去0x28(作为堆栈形成的一部分),可以为变量分配12个字节。为什么从堆栈中减去十进制40会分配12个字节?

我怀疑你可能误读了你的书,但如果你没有误读,在我看来,这本书在这方面似乎大错特错了

从堆栈指针中减去40将分配40个字节。这可能并不总是准确无误的,但任何偏离它的地方通常都非常小


  • 例如,如果在32位代码中分配一个8字节的对象,它可以分配一些额外的空间(总共12个字节),以便确保8字节对象具有8字节对齐。类似地,在32位代码中,通常只能以(至少)32位增量调整堆栈指针,因此具有一个
    char
    局部变量的函数通常仍会从堆栈指针中减去至少4,以腾出空间

  • 这将在堆栈上分配40个字节。但是,除了局部变量之外,它还有其他用途,所以我猜其余的用于对齐和将来函数调用的参数

    由于函数参数也在堆栈上传递,因此需要为该函数要传递给另一个函数的任何参数留出空间。使用
    push
    执行调用时,可以分配此空间,但通常在函数开始时分配一次空间,然后使用
    mov
    将数据放置到位。如果您的函数使用12个字节作为局部变量,那么以后将使用最多28个函数参数


    还可以为对齐分配一点额外的资源。除了Jerry提到的变量对齐外,许多系统还希望堆栈指针与某个值对齐,因此如果要进行函数调用,则需要保留该值。在32位系统上,这通常是8字节,但在这种情况下也可能是16字节。

    此外,如果使用GCC,默认情况下,GCC也会尝试将堆栈与16字节边界对齐(另请参见:。我使用的是GCC。这很有意义-我所关心的变量是从%ebp偏移的。分配的其余部分必须用于将来的参数。Thx@Jerry这就是我的意思。书中的函数将调用另一个函数,所以它需要空间。我的编辑是否让它更清晰了?这个解释很有道理-我得到了一些信息用于所有的空间和仅有的几个变量。该空间用于参数。Thx