检索程序集中的内存位置

时间:2012-11-04 21:48:51

标签: assembly x86

我的问题是我必须编写一个使用汇编语言调用malloc的程序。但是我不知道如何检索分配区域的地址。它会将它存储在某个地方的内存中,如果存在,我该如何找到它?

3 个答案:

答案 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