Бесконечный цикл сборки

Моя эпопея со сборкой x86 продолжается, я зацикливаюсь на этом куске кода и немного озадачен.

movl $1, %ecx
movl $4, %edi

do_loop:
   cmpl %edi, %ecx
   je do_exit
   .........
   do_stuff
   .........
   incl %ecx
   jmp do_loop
do_exit:

Я ожидаю перехода к do_exit:, когда %ecx достигнет 4, так как он увеличивается на каждой итерации.


person Community    schedule 13.01.2011    source источник
comment
Что-то мне подсказывает, что вы повторно используете/переназначаете ecx в разделе do_stuff...   -  person lc.    schedule 13.01.2011
comment
do_stuff делает несколько вызовов printf, очевидно, он изменяет регистры. Я не ожидал этого.   -  person    schedule 13.01.2011


Ответы (3)


Как уже упоминалось, будьте осторожны с использованием регистра в do_stuff. И на самом деле вам нужны соглашения о вызовах, и особенно эта строка:

Регистры EAX, ECX и EDX доступны для использования в функции.

person ruslik    schedule 14.01.2011

Нет отладчика? Изменяет ли do_stuff %edi? Попробуйте закомментировать do_stuff.

person Jeff    schedule 13.01.2011
comment
я просто звоню в printf. savind ecx и edi в стеке перед вызовом и их всплывающее окно после, кажется, дает правильный результат. странно, я не ожидал этого. - person ; 13.01.2011
comment
@void: соглашение о вызовах позволяет изменять ecx вызываемой функцией вместе с eax и edx. Остальное надо сохранить. Таким образом, вам не нужно сохранять edi при вызове printf. Обратите внимание, это относится и к вашей функции. - person Jester; 13.01.2011

Я не знаю, следуют ли за do_exit пробелы, и я понятия не имею, как вы выполняете ассемблерный код...

но попробуйте добавить следующее после do_exit:

оставлять

рет

person Syntax_Error    schedule 13.01.2011