2

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

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. 所以我的问题是:我应该减少什么%espmain?应该是12还是可能16

4

1 回答 1

0

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

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

andl $-16, %esp                ; Align 16
于 2017-04-10T11:38:28.003 回答