2015-01-14 3 views
1

동적으로 MASM here에서 메모리를 할당하는 방법을 물었지만 질문이 2 개 더 있습니다.멀티 스레딩 응용 프로그램에서 MASM dll 메모리 할당

어떻게 메모리를 바이트에 할당 할 수 있습니까?

.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을 사용해야합니까? 메모리가

size 할당하는 방법에 대한 플래그 - - 힙 오브젝트의 핸들

flags - 당신이 필요로하는 메모리 블록의 크기

hHeap :

답변

1

HeapAlloc 기능은 3 개 인수를 받아

이 함수는 할당 된 메모리에 대한 포인터 인 EAX에 하나의 더블 워드를 반환합니다.

HeapAlloc을 호출 할 때마다 GetProcessHeap에 전화 할 필요가 없습니다. 포인터가이 포인터가 가리키는

메모리 블록은 당신이 필요로하는 어떤 데이터 크기에 액세스 할 수있는 더블 워드 길이 (EAX) 때문에

변수 tabresult는 더블 워드해야합니다. 그들은 단순히 메모리 블록입니다.

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 
+0

어떻게 당신과 연락 할 수 있습니다 :이 모든 어셈블리에 어떻게 보일지

? 난 그냥 메모리 위반 예외가 발생하기 때문에이 답변에 대해 뭔가 묻고 싶다. HeapAlloc, result, 0, Asker

+0

당신이 나와 접촉 할 수있는 코멘트를 작성한다. 또한, 내 프로필을 참조하십시오. 물론 내 대답에는 실수가있다. 그래서 예외가 생기는 이유입니다. :) 나는 그것을 지금 고칠 것이다. – johnfound

+0

@Asker Ah, 읽고 읽은 것을 분석하는 것이 유용합니다. 필자의 실수는 소스 코드와 소스 코드 이전에 작성한 내용에서 쉽게 발견 할 수있었습니다. – johnfound