gpt4 book ai didi

c - 在汇编中为局部变量留出空间

转载 作者:太空狗 更新时间:2023-10-29 12:41:13 25 4
gpt4 key购买 nike

所以我必须编写一个调用 extern C 函数的汇编程序。所以我编写了简单的 pow 函数,我用这个 C 代码编译了我的汇编程序。一切正常。但是正如我从 gcc-S 命令中看到的那样,编译器为局部变量留出了空间。我以为它会是这样的:

int func(int number)
{
int a = 10;
int b = 5;
int c = 0;
}

我们有 3 个局部变量,所以编译器会 subl $12, %esp。但它适用于 subl $16, %esp。即使我在这里只留下一个数字,它仍然会减少 16。现在我有了我的代码:

main.s:

.section .data
.XD:
msg: .ascii "%d\n"
msg_len = . - msg

.text
.globl _pow
.globl main

main:
pushl %ebp
movl %esp, %ebp
movl $5, %eax #like int a = 5;
pushl %eax
call _pow #_pow(a);
movl %eax, -8(%ebp)
pushl -8(%ebp)
pushl $.XD
call printf #printf("%d\n", _pow(a));
movl $0, %eax
leave
ret

func.c:

int _pow(int number)
{
return number * number;
}

它按预期工作,./main 打印出 25。但是现在,我不会subl %esp 中的任何内容。我的意思是我可以添加这一行,但它不会改变任何东西。我在互联网上搜索过,我发现也许我的代码工作只是偶然,通常我应该减少 %esp。所以我的问题是:我应该将 main 中的 %esp 递减多少?应该是 12 还是 16

最佳答案

由于您正在调用 32 位 C 函数,因此您必须遵循 C calling convention .与 64 位系统不同,没有明确的堆栈对齐顺序。我找不到关于何时应该进行这种对齐的声明。推送参数后堆栈可能“未对齐”。

如果你想对齐堆栈,你可以在保存后简单地执行 AND -16 (movl %esp, %ebp):

andl $-16, %esp                ; Align 16

关于c - 在汇编中为局部变量留出空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43321592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com