1

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

4

3 回答 3

2

最简单的解决方案是编写一个简单的 C 程序,该程序调用 malloc 并执行一些您可以轻松跟踪结果的事情(例如将其存储在外部变量中),编译它,然后查看生成的汇编代码。

例如:

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.

于 2012-11-04T22:03:21.710 回答
0

malloc是一个 C 库函数,所有 C 函数都遵循所谓的调用约定。这描述了如何传入参数,以及如何返回结果。

如果您从程序集中调用 C 函数,您应该真正知道 C 代码使用什么调用约定。

不同的编译器/库有不同的调用约定,但最常见的都是eax在 x86 上的寄存器中返回整数/指针值(至少cdecl在 Linux/gcc 和syscallWindows API 上如此)。

下面是一个调用mallocusing的例子cdecl

push 24       ; Push the number of bytes we want to allocate    
call _malloc  ; Call malloc
add esp, 4    ; Undo the push

mov dword ptr [eax], 10   ; Set the first dword of the block to 10
mov dword ptr [eax+4], 5  ; Set the second dword of the block to 5
于 2012-11-13T21:32:54.313 回答
0

如果您使用的是 Win32,它看起来像是在 EAX 中返回它(抓取了我几年前编写的一些旧代码,这就是宏返回它的样子)。

于 2012-11-05T20:56:43.057 回答