2015-01-22 2 views
0

내 MASM 코드와 관련하여 도움이 필요합니다. 배열에 동적 할당을 사용하면 배열에 몇 가지 요소를 추가 한 후에 다른 변수가 값을 변경합니다.배열 동적 할당과 같은 MASM 벡터

.686 
.387 
.model flat, stdcall 
.xmm 

include include\kernel32.inc 
includelib lib\kernel32.lib 

.data 

szyfr DB 9, 15, 19, 2 
;tab DD 4 dup (?) - it works fine 
;wynik DD 4 dup (?) - it works fine 

tmp DD 0 
j DD 0 
t DD 0 
x DD 2 
tmpa DD 0 
tmpb DD 0 
dlText DD 0 
tab DD ? 
wynik DD ? 

.code 
invoke GetProcessHeap 
mov ebx, eax 
INVOKE HeapAlloc, ebx, 0, 4  - it doesn't work 
mov tab, eax 
INVOKE HeapAlloc, ebx, 0, 4  - it doesn't work 
mov wynik, eax 

배열에 쓰기 :

xor edx, edx     
mov eax, esi     ; esi = iterator = i   
mul x       ; x = 2 
mov edx, eax    
add edx, j     
add edx, offset tab   
mov eax, t      ; t = number <0, 26> 
mov dword ptr [edx], eax  ; tab[i][j] = number <0, 26> 
+0

당신은 당신이 실제로 당신이 할당 된 메모리에 아무것도를 작성하는 방법 우리를 표시하지 않았습니다. – Michael

+0

그건 그렇고,'DD 4 dup (?)'은 4 DWORD의 공간을 예약합니다. HeapAlloc, ebx, 0,4는 4 바이트, 즉 _one DWORD를 할당합니다. – Michael

+0

@ 마이클 내 질문 업데이트, HeapAlloc, ebx, 0, 100 또는 심지어 더 큰 시도했지만 아무것도 변경됩니다. – Asker

답변

2

HeapAlloc 당신이 할당 한 메모리를 액세스 귀하의 방법이 올바르지 않습니다. add edx, offset tab을하면 할당 한 메모리의 주소를 얻지 못합니다. 주소는 tab이고 tabDWORD입니다. 할당 된 메모리 주소를 추가하려면 add edx,tab을 사용해야합니다. 그런데


,이 라인 :

xor edx, edx     
mov eax, esi     ; esi = iterator = i   
mul x       ; x = 2 
mov edx, eax 

단지로 단순화 할 수는 :

lea edx,[esi*2] 
+0

감사합니다 !!! 모든 것이 잘 작동합니다! 나는 너에게 큰 맥주를 빚지고있다;) – Asker