1

ここで MASM でメモリを動的に割り当てる方法を尋ねましたが、さらに 2 つの質問がありました。

バイトにメモリを割り当てるにはどうすればよいですか?

.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>

2 番目の質問です。マルチスレッド アプリケーションでメモリを割り当てるこの方法を使用できますか、それとも GlobalAlloc を使用する必要がありますか?

4

1 に答える 1

1

HeapAlloc関数は 3 つの引数を受け入れます。

hHeap- ヒープ オブジェクトのハンドル

flags- メモリの割り当て方法に関するフラグ

size- 必要なメモリ ブロックのサイズ

EAXこの関数は、割り当てられたメモリへのポインタである1 つのダブル ワードを返します。

GetProcessHeapHeapAllocを呼び出すたびに呼び出す必要はありません。

ポインターはダブルワード長 (eax) であるため、変数tabおよびはダブルワードでなければなりません。result

これらのポインタが指すメモリ ブロックは、必要なデータ サイズに関係なくアクセスできます。それらは単にメモリのブロックです。

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
于 2015-01-14T17:41:28.713 に答える