如何在x64程序集中的堆中分配内存。我想存储sidt函数的值,但我似乎无法找到如何做到这一点的方法?
我使用Visual Studio 2012。
答案 0 :(得分:1)
您将有两个选择(假设您在操作系统顶部的用户空间中运行)。
brk
/ sbrk
/ mmap
中)malloc
库函数(将为您做(1))我会选择2号,因为它更简单,更便携。
类似于以下内容应该可以解决问题:
movq $0x10, %rdi
callq malloc
; %rax will now contain the pointer to the memory
假设ADM64(System V AMD64 ABI)调用约定,那将调用malloc(16)
,它应该返回一个指向16字节内存块的指针。调用返回后,地址应位于%rax
寄存器中(如果内存不足,则应为0
。)
编辑:维基百科说微软显然使用不同的调用约定x86-64 calling conventions(首先在RCX
注册而不是RDI
)。因此,您需要将movl $0x10, %rdi
修改为movl $0x10, %rcx
。
答案 1 :(得分:0)
根据您的环境判断,我猜你在Windows中编写汇编代码。您需要使用Windows等效于sbrk
系统调用。您可能会发现this MSDN reference有用!
答案 2 :(得分:0)
编写代码以在C中调用malloc,然后让编译器生成一个程序集列表,它将显示用于malloc的名称(在Microsoft编译器的情况下可能是_malloc),以及如何调用它。
另一种选择是从堆栈中分配空间,从esp中减去,等于保存sidt信息的结构的大小。