2013-03-29 3 views
-1

Как вы отличаетесь от цикла while и оператора if в сборке x86? Say моя программа получает эту x86 ассамблею:while vs if in x86 assembly

jmp .L2    # jump to test at end 
    .L4: 
     movl -4(%ebp), %eax # eax = A 
     cmpl -12(%ebp), %eax # compare A to C 
     jge .L3    # skip next statement if A >= C 
     addl $1, -4(%ebp)  # A++ 
    .L3: 
     subl $1, -8(%ebp)  # B-- 
    .L2: 
     cmpl $0, -8(%ebp)  # compare B to 0 
     jns .L4    # restart code if B >= 0 

    Say х находится на -8 (% EBP), В нижней части .L2 почему это время цикла?

          почему: while(x >= 0){jump to .L4}

          и нет: if(x >= 0){ jump to .L4} ??

+0

Я не понимаю ваш вопрос. Что заставляет вас думать, что .L2 функционирует как цикл while? Он сравнивает, а затем либо прыгает, либо не работает, как оператор if. – kronion

ответ

1

Потому что это переход обратно в код. Другими словами, прыжок вверх (выберите свою любимую ментальную модель).

Значение, что выполнение достигнет этого условного перехода снова и снова, пока условие не выйдет как ложное. Это определение цикла while. Теперь сборка не содержит встроенного понятия циклов (кроме префикса rep, но давайте не будем туда туда). Да, это условный прыжок - формально if с корпусом goto. Но он реализует схему управления потоком цикла.

Регулярные if заявления, с другой стороны, обычно реализуются как условный переход вперед (вниз).

+0

Невероятно, большое вам спасибо. –

+2

x86 имеет конкретные инструкции по циклу ('LOOP',' LOOPNE' и 'LOOPE'), поэтому я бы сказал, что * * имеет встроенное понятие циклов, но в настоящее время они довольно не используются. (Для разных причины). – Necrolis

+0

Также обратите внимание на префиксы 'REP'. Они также могут действовать как цикл над строкой или любым другим массивом. –