Бесконечный цикл в рекурсивной процедуре сборки - PullRequest
1 голос
/ 10 июня 2019

При добавлении вызовов WriteDec и CRLF в рамках рекурсивной процедуры он входит в бесконечный цикл.

  1. Моя мотивация заключается в том, чтобы печатать каждый раз значения eax и crlf сразу после сдвига вправо.
  2. При достижении 0 кажется, что есть бесконечные рекурсивные вызовы, потому что он продолжает печатать 0.
  3. У меня сложилось впечатление, что это не должно быть так, поскольку ZF = 1 в первый раз, eax = 0, и поэтому он переходит к пропуску метки, которая завершает рекурсию.

Следующий код вызывает бесконечный цикл, когда EAX register = 0

 .code 
MAIN PROC

mov ecx, 10

L1:

push 10
call f1

call exitProcess
main ENDP

f1 PROC 

push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp+8]
shr eax, 1



call WriteDec
call CRLF

mov [ebp-4], eax
jz skip
call f1

skip:
mov eax, [ebp+8]
call WriteDec
call CRLF

; ** comment out ** mov ebp, [ebp]
mov esp, ebp
pop ebp
ret 4
f1 ENDP

END MAIN

Ожидаемый результат:

5
2
1
0
1
2
5 
10

1 Ответ

2 голосов
/ 10 июня 2019

Виновник здесь:

mov [ebp-4], eax
jz skip

В x86 инструкция MOV не устанавливает никаких флагов, поэтому JZ будет принимать состояние флага ZF, оставшегося после вызова этой функции выше.

Правильный код:

mov [ebp-4], eax
test eax, eax
jz skip
...