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>

1 ответ

Решение

Ваш метод доступа к памяти, которую вы выделили HeapAlloc это неверно. Когда вы делаете add edx, offset tab вы не получаете адрес выделенной памяти; вы получите адрес tab, а также tab это просто DWORD, Чтобы добавить адрес вашей выделенной памяти, вы должны использовать add edx,tab,


Кстати, эти строки:

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

можно упростить до:

lea edx,[esi*2]
Другие вопросы по тегам