两次调用程序会导致我的masm程序

时间:2018-05-21 19:31:45

标签: function assembly x86 procedure masm

并感谢您抽出宝贵时间。 在stackoverflow和我的教授的帮助下,我设法编写了一个程序,使用masm程序集和一个名为canvas.lib的库,将32 x 32的图像绘制到窗口。 然而,回到家里,我意识到,当我两次打电话时,它会让我的小游戏崩溃。 这是程序定义。

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

炸弹是32位像素的32 x 32矩阵,区域是指向640 x 480像素的分配内存的指针。用于区域的内存是用malloc分配的,因此存储在区域中的值实际上是一个指针。 我的猜测是有一些东西我没有在函数中恢复正常,但我仍然看不出为什么只调用一次函数才能正常工作。有什么想法吗?

0 个答案:

没有答案