linux - 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
解决方案
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
推荐阅读
- java - 应用程序在 android webvew 中的 BackPressed 上出现 nullpointerexception 和其他错误而崩溃
- sql - 这些方法的优缺点是什么 SQL Server 繁琐的查询
- facebook-graph-api - 如何解读本 Facebook API 升级通知
- adsense - Adsense 不显示
- android - Android片段中的动态背景
- python - 逻辑回归的损失不收敛到 0
- python - python 结构中的填充字节
- r - 从R中的单个交易日期列中提取购买和销售日期
- python - Django 密钥泄露
- flutter - 尝试将样式主题添加到 BottomNavigationBarItem 中的标题时,我收到“无效的常量值”