我问过如何在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?
答案 0 :(得分:1)
HeapAlloc
函数接受3个参数:
hHeap
- 堆对象的句柄
flags
- 标志,关于如何分配内存
size
- 您需要的内存块大小
该函数返回EAX
中的一个双字,它是指向已分配内存的指针。
每次调用HeapAlloc时都不需要调用GetProcessHeap
。
变量tab
和result
必须是双字,因为指针是双字长(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