Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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
Macos “sub rsp,16”如何在Mac OSX上对齐堆栈?_Macos_Assembly_Stack_X86 64_Memory Alignment - Fatal编程技术网

Macos “sub rsp,16”如何在Mac OSX上对齐堆栈?

Macos “sub rsp,16”如何在Mac OSX上对齐堆栈?,macos,assembly,stack,x86-64,memory-alignment,Macos,Assembly,Stack,X86 64,Memory Alignment,我目前正在使用nasm在Mac OSX上学习x64 asm 我遇到了对齐堆栈的问题,这是一些系统调用(如malloc)的必要步骤,通过以下指令完成: push-rbp mov rbp,rsp 副rsp,16 有人能解释一下prolog函数是如何对齐堆栈的吗?我的意思是,如果它不是16的倍数,为什么sub-rsp,16会纠正它 假设esp=0x35,在子rsp之后,16,esp=0x25对吗?所以esp在sub之前没有对齐16的倍数,sub也没有对齐它,所以我想我还不太明白“对齐堆栈”是什么意思

我目前正在使用nasm在Mac OSX上学习x64 asm

我遇到了对齐堆栈的问题,这是一些系统调用(如malloc)的必要步骤,通过以下指令完成:

push-rbp
mov rbp,rsp
副rsp,16

有人能解释一下prolog函数是如何对齐堆栈的吗?我的意思是,如果它不是16的倍数,为什么
sub-rsp,16
会纠正它

假设
esp=0x35
,在
子rsp之后,16
esp=0x25
对吗?所以esp在sub之前没有对齐16的倍数,sub也没有对齐它,所以我想我还不太明白“对齐堆栈”是什么意思


有人能告诉我当我读到“堆栈需要在16字节边界上对齐”时应该理解什么吗?

它没有对齐,正如您所说,它只是保持对齐。显然,只有当您想为1-15字节的局部变量分配空间时,才需要
子rsp,16
。假设堆栈已对齐,则应确保所需空间上方的数字为16的下一个倍数。请注意,返回地址和帧指针加起来也多达16个字节,如果不使用帧指针,也需要考虑这一点


一般来说,调用约定要求它在进入所有函数时以特定的方式对齐,因此您只需维护它。通常情况下,唯一不属于这种情况的地方可能是在进程或线程启动时,但通常由系统库负责。

好的,谢谢,这就是我所想的,sub-rsp,16只为局部变量或函数(如malloc)节省了一些空间,而malloc要求堆栈指针比基指针长16字节(至少在OSX上)虽然我不在mac电脑上,但我见过编译器对堆栈变量进行对齐,但没有使用
sub
。这里有一些讨论:如果堆栈在函数入口对齐,则push rbp将使其对齐。正如在另一个线程中所述,使用|和rbp,-16 |将使其对齐。您能详细说明一下吗?当push指令完成时,stack向下移动了8个字节(64位),不是吗?为什么子rsp,16对齐它?它不应该是子rsp,8吗?