我的问题是我必须编写一个使用汇编语言调用malloc的程序。但是我不知道如何检索分配区域的地址。它会将它存储在某个地方的内存中,如果存在,我该如何找到它?
答案 0 :(得分:2)
最简单的解决方案是编写一个简单的C程序来调用malloc并执行一些可以轻松跟踪结果的内容(例如将其存储在外部变量中),编译它,然后查看生成的汇编代码。 / p>
例如:
extern void * somePointer;
extern int someInt;
void callMalloc(void)
{
somePointer = malloc(someInt);
}
在Linux上编译,x86_64给出:
movslq someInt(%rip), %rdi
call malloc
movq %rax, somePointer(%rip)
这正是您需要做的 - 将字节数放在%rdi
中,调用malloc
,然后从%rax
复制结果。
答案 1 :(得分:0)
如果您正在使用Win32,它看起来像是在EAX中返回它(抓住了几年前我写的一些旧代码,这就是宏看起来像它返回的那样)。
答案 2 :(得分:0)
malloc
是一个C库函数,所有C函数都遵循所谓的calling convention。这描述了如何传入参数,以及如何返回结果。
如果你从汇编中调用C函数,你应该真正知道C代码使用了什么调用约定。
不同的编译器/库具有不同的调用约定,但最常见的是在x86上的eax
寄存器中返回整数/指针值(对于Linux / gcc上的cdecl
至少为true,{{1对于Windows API)。
以下是使用syscall
调用malloc
的示例:
cdecl