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

Memory 多线程应用程序中的MASM dll内存分配,memory,assembly,masm,heapalloc,Memory,Assembly,Masm,Heapalloc,我问过如何在MASM中动态分配内存,但我还有两个问题 如何为字节分配内存 .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 GetProces

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

如何为字节分配内存

.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>
.data
tabdb?
结果数据库?
.代码
调用GetProcessHeap
; 这里出错
mov标签,eax;我不能这样做,因为尺寸不对,AL和AH等于0
调用HeapAlloc,选项卡,0,
调用GetProcessHeap
mov结果,eax;彼此彼此
调用HeapAlloc,结果为0,

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

HeapAlloc
函数接受3个参数:

hHeap
-堆对象的句柄

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

size
-所需内存块的大小

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

您不需要在每次调用HeapAlloc时调用
GetProcessHeap

变量
选项卡
结果
必须是双字,因为指针是双字长的(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
.data
标签dd?
结果dd?
.代码
调用GetProcessHeap
mov-ebx,eax;堆句柄
调用HeapAlloc,ebx,0,
mov标签,eax;现在选项卡包含指向第一个内存块的指针
调用HeapAlloc,ebx,0,
mov结果,eax;现在,结果包含指向第二个块的指针

我如何与您联系?我只是想问你们一些关于这个答案的问题,因为我在第行中得到了内存冲突异常:invoke HeapAlloc,result,0,写评论,你们可以联系我。另外,请参见我的个人资料。当然,我的回答有错误。这就是为什么会出现例外情况。:)“我现在就把它修好。”问:啊,分析你读到的东西很有用。从我在源代码之前写的内容和源代码本身中很容易发现我的错误。是的,我注意到了,但它仍然在同一行中导致“System.AccessViolationException”:invoke HeapAlloc,ebx,0。第一个HeapAlloc工作正常。@Asker HeapAlloc不会更改ebx,因此异常是由于其他原因造成的。在我的测试中,这段代码运行得很好(当然我用实数更改了
,是吗?),因此,请在调试器中一步一步地执行代码,并找出错误所在。OllyDbg是一个很棒的工具,只适合你。