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
我试图通过调用 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