首页 > 解决方案 > x86 汇编:调用 malloc 不会将指向已分配内存的指针放在 EAX 寄存器中

问题描述

我试图通过在 x86 程序集(AT&T/Intel 语法)中调用外部 C 命令 malloc 在内存中分配 40 字节的空间。但是,当我调试程序时,调用malloc命令后EAX寄存器并没有改变(据我了解,使用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 $40, %edi
    call malloc
    
    ret

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

编译命令:

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

标签: linuxassemblyx86glibcatt

解决方案


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

推荐阅读