【问题标题】:FASM: Dynamic arrayFASM:动态数组
【发布时间】:2012-02-18 20:31:29
【问题描述】:

如何将变量存储在数组中,该数组的大小仅在运行时才知道?如何访问此数组的元素?我认为这应该很容易,但我看不到办法。

我的意思是像 C 中的动态数组。

【问题讨论】:

标签: assembly fasm


【解决方案1】:

您没有说明是哪个操作系统,但在 Windows 下,VirtualAlloc 是一种分配粗略内存块的简单方法。它返回一个指针,您可以将其加载到寄存器中并用作基地址。

invoke  VirtualAlloc,NULL,size,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
mov     [eax],something

【讨论】:

    【解决方案2】:

    您还可以在函数开始时在堆栈上分配静态大小的内存:

    proc yourFunction stdcall param1:DWORD
    local yourData[256]:BYTE
      ;...
    endp
    

    它的缺点是具有静态大小(在上面的示例中为 256 字节),但您不必调用特定于平台的 API,例如 VirtualAlloc,并且在您离开函数时它会被清理(无需跟踪您分配的数据并调用 VirtualFree())。

    【讨论】:

    • 或者您可以sub rsp, rax 保留运行时可变数量的堆栈空间,就像您从 C 编译器获得的具有本地 C99 可变长度数组的函数一样。
    【解决方案3】:

    对于 WinAPI,这可能是这样的:

    invoke HeapAlloc, hHeap, flags, size
    mov    [pointer], eax
    

    有关更多信息,请参阅此 (HeapAlloc)
    https://docs.microsoft.com/en-us/windows/win32/api/heapapi/nf-heapapi-heapalloc
    还有这个(Windows 中的堆)
    https://docs.microsoft.com/en-us/windows/win32/api/heapapi/

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 1970-01-01
      • 2012-04-28
      • 2012-11-15
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多