Команди порівняння та умовні переходи

ЦИКЛИ З ВИКОРИСТАННЯМ ассемблерного вставок

  1. Цикл з умовою поста (еквівалент do<>while)
loop_start: / * початок циклу * / / * ось тут знаходиться тіло циклу * / cmpl. / * Щось з чимось порівняти для прийняття рішення про вихід з циклу * / je loop_end / * підібрати відповідну команду умовного переходу для виходу з циклу * / jmp loop_start / * інакше повторити цикл знову * / loop_end:
  1. Цикл з передумовою (еквівалент while ()<>)
loop_start: / * початок циклу * / cmpl. / * Щось з чимось порівняти для прийняття рішення про вихід з циклу * / je loop_end / * підібрати відповідну команду умовного переходу для виходу з циклу * / / * ось тут знаходиться тіло циклу * / jmp loop_start / * перейти до перевірки умови циклу * / loop_end:

§ зменшити значення регістра% ecx на 1;

§ якщо% ecx = 0, передати управління наступній за loop команді;

§ якщо% ecx ≠ 0, передати управління на мітку.

Напишемо програму для обчислення суми чисел від 1 до 10 (звичайно ж, скориставшись формулою суми арифметичної прогресії, можна переписати цей код і без циклу - але ж це тільки приклад).

Команди порівняння та умовні переходи. безумовний перехід

Команда loop неявно порівнює регістр% ecx з нулем. Це досить зручно для організації циклів, але часто цикли бувають набагато складніше, ніж ті, що можна записати при помощіloop. До того ж потрібен еквівалент конструкції if ()<>. Ось команди, що дозволяють виконувати довільні порівняння операндів:

cmp операнд_2. операнд_1

Команда cmp виконує віднімання операнд_1 - операнд_2 і встановлює прапори. Результат віднімання ніде не запам'ятовується.

Порівняли, встановили прапори, - і що далі? А у нас є ціле сімейство jump-команд, які передають управління іншим командам. Ці команди називаються командами умовного переходу. Кожній з них поставлено у відповідність умова, яке вона перевіряє. синтаксис:

Команди jcc не існує, замість cc потрібно підставити мнемонічне позначення умови.

Схожі статті