Алгоритмическая структура "Цикл" в языке Ассемблер

Разделы: Информатика


К изучению языка Ассемблер учащиеся подходят, как правило, имея начальные знания в области программирования. Поэтому им проще будет понять, как реализуются основные алгоритмические структуры в Ассемблере, если при изложении нового материала преподаватель будет проводить аналогию с изученным ими ранее языком программирования (например, Turbo Pascal).

Алгоритмическая структура “цикл”, как известно, обеспечивает выполнение некоторой последовательности действий, которая называется телом цикла.

Выделяется три типа циклов: цикл “ДЛЯ”, цикл “ПОКА”, цикл “ДО”. Друг от друга различные типы циклов отличаются в основном лишь способом проверки окончания цикла.

Приложение

Рис. 1

В языке программирования Паскаль для реализации каждого типа цикла имеются специальные операторы, но любой из этих трех типов можно организовать при помощи условного оператора и оператора безусловного перехода.

Рис. 2

Рис. 3

Рис. 4

Система команд языка Ассемблер тоже позволяет организовать циклическое выполнение некоторого фрагмента программы, к примеру, используя команды условной передачи управления или команду безусловного перехода JMP.

Рис. 5

Рис. 6

Рис. 7

Как и в языке Паскаль, в Ассемблере существует специальная команда, которая позволяет сокращать листинг циклической программы.

Это команда LOOP <метка>.

Данная команда выполняет следующие функции:

    1. Автоматически уменьшает значение счетчика.
    2. Выполняет проверку на выход из цикла.
    3. Выполняет переход на начало тела цикла.

Команда LOOP может быть использована лишь в случае цикла с известным числом повторений, т.е. цикла “ДЛЯ”. Количество повторений цикла должно быть присвоено регистру СХ до начала цикла.

Рис. 8

Таким образом, команда LOOP заменила тройку команд:

  • DEC CX
  • CMP CX , 0
  • JNE A2

Рассмотрим использование этой команды на практике.

Пример: Составим программу, которая выводит на экран 1000 нулей.

(1) prg segment para public 'code'
(2) assume cs:prg,ss:prg,es:prg,ds:prg
(3) org 100h
(4) start: jmp go
(5) go:
(6) mov ax, 0600h
(7) mov bh,07
(8) mov cx, 0000
(9) mov dx,184fh
(10) mov cx,1000
(11) Zero:
(12) mov ah,02
(13) mov dl,30h
(14) int 21h
(15) loop Zero
(16) ret
(17) prg ends
(18) end start

Строки с (1) по (10) и с (16) по (18) вы уже знаете.

Строка (11) – это метка (начало цикла). Строка (15) – конец цикла. Все, что находится в пределах строк (11) – (15), является циклом. Сам цикл будет повторяться 1000 раз, для чего мы и заносим в СХ число 1000 (строка (10)).

В строке (12) заносим в регистр ah число 02 (запрос функции вывода одного символа).

В строке (13) в регистр dl заносим код выводимого символа (код символа “0” – 30h).

В строке (14) вызываем прерывание int 21h.

Теперь на экране появится первый ноль. Остается уменьшить счетчик (СХ) на 1 и повторить. Что мы и делаем в строке (15).

Задача 1 для практики: Составить фрагмент программы на языке Ассемблер, подсчитывающий сумму первых 10 натуральных чисел (результат записать в АХ).

Решение:

…..
mov cx,10
mov ax,00
summa:
add ax,cx
loop summa
…..

Задача 2 для практики: Составить фрагмент программы на языке Ассемблер, вычисляющий значение выражения: (результат записать в АХ).

Решение:

…..
mov BX,00
mov CX,05
sum:
mov AX,02
mul CX
add BX,AX
loop sum
…..

Задача 3 для практики: Составить фрагмент программы на языке Ассемблер, вычисляющий факториал заданного числа К (К – от 0 до 8).

Решение:

…..
mov ax, 1
mov cx, К
F: mul cx
loop F
…..

Приложение

26.07.2009