分配内存(x64程序集)

时间:2015-05-06 11:42:29

标签: visual-studio-2012 memory assembly 64-bit allocation

如何在x64程序集中的堆中分配内存。我想存储sidt函数的值,但我似乎无法找到如何做到这一点的方法?

我使用Visual Studio 2012。

3 个答案:

答案 0 :(得分:1)

您将有两个选择(假设您在操作系统顶部的用户空间中运行)。

  1. 使用操作系统提供的任何内容来映射一些可写内存(在UNIX brk / sbrk / mmap中)
  2. 调用C标准库中的malloc库函数(将为您做(1))
  3. 我会选择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信息的结构的大小。