我的问题是我必须编写一个使用汇编语言调用 malloc 的程序。但是我不知道如何检索分配区域的地址。它将它存储在某个地方的内存中,如果是,我如何找到它?
问问题
1493 次
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 和syscall
Windows API 上如此)。
下面是一个调用malloc
using的例子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 回答