2014-01-07 3 views
0

Я просто пытаюсь напечатать элементы массива. Из вывода я вижу, что цикл выходит за пределы выделенной памяти моего массива.Почему это петли бесконечно?

.386 ; 386 Processor Instruction Set 

.model flat,stdcall 

option casemap:none 
include \masm32\include\masm32rt.inc 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

.data 

array DWORD 72,50,22,0 
asd DWORD ? 

start: 

mov ecx, 4 
mov edi, 0 
//-- loop start--// 
loop_start: 

mov eax, [array + edi * 4] 

push offset asd 
push eax 
call dwtoa 


Invoke StdOut, addr asd 

inc edi //incrementing edi 
dec ecx // decrementing ecx 
cmp ecx,0 // comparing ecx against 0 


jne loop_start // if not equal loop again 
//--loop end--// 


invoke ExitProcess, 0 
end start 

Вот выход http://s7.directupload.net/images/140107/2nxsljtc.png http://s7.directupload.net/images/140107/snpycplx.png

EDIT: пытались добавить в конце

cmp ecx,0 
je loop_end 


loop_end: 
Invoke ExitProcess,0 

ни один из них работал.

Заранее спасибо.

+1

Это выглядит как-то прикасается ECX между loop_start и DEC ECX? Вы пробовали нажать его перед CALL, а затем после этого выскочить? –

+0

Вы имеете в виду, push ecx, dec ecx, pop ecx, ? – ddacot

+0

'dec' и' inc' влияет на ZF, поэтому вы можете уменьшить инструкцию compare-with-0 –

ответ

2

кажется, что эти две команды изменения ecx регистра:

call dwtoa 
Invoke StdOut, addr asd 

Мое предположение было бы на dwtoa может вернуться длина массива асках возвращается в ecx регистре.

Попробуйте это:

loop_start: 

mov eax, [array + edi * 4] 

push ecx // saving ecx before call 

push offset asd 
push eax 
call dwtoa 


Invoke StdOut, addr asd 

pop ecx // restore the ecx from before the calls. 

inc edi //incrementing edi 
dec ecx // decrementing ecx 
cmp ecx,0 // comparing ecx against 0 


jne loop_start // if not equal loop again 
+0

В этом была проблема, спасибо! – ddacot

Смежные вопросы