x86 程序集:调用 malloc 不会将指向已分配内存的指针放在 EAX 寄存器中

x86 Assembly: Calling malloc does not place the pointer to the allocated memory in the EAX register

我试图通过调用 x86 程序集中的外部 C 命令 malloc(AT&T/Intel 语法)在内存中分配 40 个字节的 space。但是,当我调试我的程序时,EAX寄存器在调用malloc命令后并没有改变(据我了解,使用malloc的过程是将你想要分配的字节数放入EDI寄存器,然后执行call malloc将指针指向 EAX 寄存器中分配的内存块)。下面是我的 x86 汇编代码:

.extern malloc

.text
.global main
main:
    movl %esp, %ebp #for correct debugging
    # write your code here
    xorl  %eax, %eax
    
    movl , %edi
    call malloc
    
    ret

我在 Linux 上使用 32 位约定(不是 64 位)。

编译命令:

gcc -m32 -Wall -g -c -o program.o program.s
call malloc

我的推送呢?

push %edi
call malloc
add  %esp, 4 ; caller cleans up the stack

所以他们告诉我现代 glibc 现在正在强加字节堆栈对齐。我无法证实这一点,但你必须这样做。现在看起来像这样:

sub  %esp, 8
push %edi
call malloc
add  %esp, 12 ; caller cleans up the stack