Вызов процедуры дважды приводит к сбою моей программы masm - PullRequest
0 голосов
/ 21 мая 2018

и спасибо, что нашли время.С некоторой помощью от stackoverflow и моего профессора мне удалось написать процедуру, которая рисует изображение 32 на 32 в окно, используя сборку masm и библиотеку canvas.lib.Однако, вернувшись домой, я понял, что, когда я звоню дважды, это сбивает мою маленькую игру.Вот определение процедуры.

drawimage proc
push ebp
mov ebp, esp
sub esp, 12
pusha

mov ecx, 0
outerloop:
cmp ecx, sprite_height
je done
mov ebx, 0

innerloop:
mov [ebp-8], ecx
mov [ebp-12], ebx
pusha
mov eax, [ebp-8]
mov ebx, sprite_width
mul ebx
add eax, [ebp-12]
shl eax, 2
mov esi, [ebp+8]
add esi, eax
push [esi]
pop [ebp-4]
mov eax, [ebp+20]
add eax, [ebp-8]
mov ebx, area_width
mul ebx
add eax, [ebp-12]
add eax, [ebp+16]
shl eax, 2
mov esi, [ebp+12]
add esi, eax
mov eax, [ebp-4]
mov dword ptr [esi], eax
popa

cmp ebx, sprite_height
je innerloopdone
inc ebx
jmp innerloop
innerloopdone:
inc ecx
jmp outerloop
done:
popa
mov esp, ebp
pop ebp
ret 12
drawimage endp

Определение функции будет выглядеть следующим образом: c

void drawimage(int* image, int* windowmatrix, int x, int y);

Я вызываю функцию здесь дважды, и программа вылетает.

draw proc
push ebp
mov ebp, esp

push 240
push 320
push area
push offset bomb
call drawimage
add esp, 16

push 32
push 32
push area
push offset bomb
call drawimage
add esp, 16

mov esp, ebp
pop ebp
ret
draw endp

Bomb - это матрица 32 x 32 из 32-битных пикселей, а область - это указатель на выделенную память 640 x 480 пикселей.Память, используемая для области, выделяется с помощью malloc, поэтому значение, хранящееся в области, фактически является указателем.Я предполагаю, что есть кое-что, что я не возвращаю к нормальному состоянию в функции, но я все еще не могу понять, почему вызов функции только один раз работает нормально.Есть идеи?

...