MASM dll在多线程应用程序中的内存分配

时间:2015-01-14 16:12:37

标签: memory assembly masm heapalloc

我问过如何在MASM here中动态分配内存,但我还有两个问题。

如何为字节分配内存?

.data
tab DB ?
result DB ?

.code
invoke GetProcessHeap
; error here
mov tab, eax          ; I cannot do this because of wrong sizes, AL and AH are equal 0
INVOKE HeapAlloc, tab, 0,  <size>

invoke GetProcessHeap
mov result, eax          ; same here
INVOKE HeapAlloc, result, 0,  <size>

第二个问题,我可以在多线程应用程序中使用这种分配内存的方法,还是应该使用GlobalAlloc?

1 个答案:

答案 0 :(得分:1)

HeapAlloc函数接受3个参数:

hHeap - 堆对象的句柄

flags - 标志,关于如何分配内存

size - 您需要的内存块大小

该函数返回EAX中的一个双字,它是指向已分配内存的指针。

每次调用HeapAlloc时都不需要调用GetProcessHeap

变量tabresult必须是双字,因为指针是双字长(eax)

可以使用您需要的任何数据大小访问这些指针指向的内存块。 它们只是简单的记忆块。

Windows堆函数是线程安全的,您可以在多线程应用程序中使用它们。

这一切在装配中的表现如何:

    .data

tab    dd ?
result dd ?

    .code

    invoke GetProcessHeap
    mov    ebx, eax          ; the heap handle

    invoke HeapAlloc, ebx, 0, <size>
    mov    tab, eax     ; now tab contains the pointer to the first memory block     

    invoke HeapAlloc, ebx, 0,  <size>
    mov    result, eax          ; now result contains the pointer to the second block