2011-01-13 5 views
1

Моя сага с сборкой 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, так как она увеличивается в каждой итерации

+4

Что-то подсказывает, что вы повторно используете/переназначаете ecx в разделе do_stuff ... –

+0

do_stuff делает некоторые вызовы printf, по-видимому, он изменяет регистры. Я этого не ожидал. –

ответ

0

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

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

1

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

+0

нет,% edi не изменен и не является% ecx –

+0

Я просто звоню в printf. savind ecx и edi в стеке перед вызовом и их всплытие, похоже, дает правильный результат. странно, я этого не ожидал. –

+0

@void: Вызывающее соглашение разрешает 'ecx' изменять вызываемую функцию вместе с' eax' и 'edx'. Остальное нужно сохранить. Таким образом, вам не нужно сохранять 'edi' по вызову' printf'. Обратите внимание, что это относится и к вашей функции. – Jester

0

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

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

отпуск

RET

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