2016-03-11 6 views
-1

Я новичок в языке ассемблера, и мне нужна помощь с ошибкой, которую я постоянно испытываю, моя задача в классе - делать то, что я сделал ниже, все, что я сделал, правильно и как профессор хочет этого но я не могу остановить программу от бесконечного цикла, у меня есть правильный ответ, который равен 14, но как остановить цикл от бесконечности без использования специальных команд, таких как ret. Как остановить его?Язык ассемблера x86 бесконечные петли IRVINE

;Declare an array of words 
;Write a loop that adds all the elements of the array located in even places 
;Example 3,7,2,8,9 
;3+2+9=14 

INCLUDE Irvine32.inc 

.data 

val1 WORD 3,7,2,8,9 

.code 

main PROC 

mov eax, 0 

L1: 

mov ecx, (LENGTHOF val1)*(TYPE val1+2)-(TYPE val1+4) 
mov eax, ecx 

call writeDec 

loop L1 


    exit 
main ENDP 
END main 
+0

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

+0

Я не вижу проблемы. –

+0

Посмотрите на значение 'ecx' как одноэтапное. Помните, что 'loop' останавливает цикл, когда' ecx' достигает нуля. –

ответ

1

В нижней части цикла, то есть эта инструкция:

loop L1

, что означает "вернуться к L1."

Loop L1 - условный LOOP, основанный на значении в ECX. Реальная проблема - проблема со значением в ECX. LOOP сначала будет декремент ECX на 1 и сравните новое значение в ECX с нулем. Если он не равен нулю, он переходит к метке (L1). Если он равен нулю, он проваливается.

Посмотрите внимательно, где вы устанавливаете значение ecx. После уменьшения LOOP ecx на 1 и выполнение переходит к L1, что происходит?

+0

'Loop L1' является условным [LOOP] (http://x86.renejeschke.de/html/file_module_x86_id_161.html), который основан на значении в _ECX_. Реальная проблема - проблема со значением в _ECX_. _LOOP_ будет сначала уменьшать _ECX_ на 1 и сравнить новое значение в _ECX_ с нулем. Если он не равен нулю, он переходит к метке (_L1_). Если он равен нулю, он проваливается. –

+0

@MichaelPetch Aack, я забыл, что он работает так (слишком долго смотрел на PPC). Я исправлю свой ответ, чтобы отразить ваш комментарий. – Crashworks

+0

Так что же мне делать? Я все еще потерян. –

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