Ваш ecx
регистр сдувается вызовом printf
.
ecx
является изменчивым регистром в некоторых соглашениях о вызовах, и вполне вероятно, что ваш loop
поврежден тем, чтоprintf
уходит туда.
Для начала я бы следовал совету Рэймонда в комментарии, приложенном к вашему первоначальному вопросу, и прикрепил бы отладчик, чтобы засвидетельствовать это поведение самостоятельно.
Что касаетсяВ качестве решения вы можете попытаться сохранить ecx
и восстановить его после вызова, чтобы увидеть разницу:
; for example
mov edi,ecx
call printf
mov ecx,edi
Здесь может быть больше проблем (трудно знать наверняка, так как ваш код неполон ...но такие вещи, как распределение стеков, которые по какой-то причине не кажутся интересными), но это хорошее начало.
Питер оставил комментарий под моим ответом, чтобы указать, что вы можете удалитьпроблема и оптимизирует мое решение, просто не используя ecx
для вашего цикла вообще, а вместо этого сделайте это вручную, внеся изменения в код:
mov edi, eax
printNTimes:
push msgDig
call printf
add esp, 4
dec edi
jnz printNTimes