К изучению языка Ассемблер учащиеся подходят, как правило, имея начальные знания в области программирования. Поэтому им проще будет понять, как реализуются основные алгоритмические структуры в Ассемблере, если при изложении нового материала преподаватель будет проводить аналогию с изученным ими ранее языком программирования (например, Turbo Pascal).
Алгоритмическая структура “цикл”, как известно, обеспечивает выполнение некоторой последовательности действий, которая называется телом цикла.
Выделяется три типа циклов: цикл “ДЛЯ”, цикл “ПОКА”, цикл “ДО”. Друг от друга различные типы циклов отличаются в основном лишь способом проверки окончания цикла.
Рис. 1
В языке программирования Паскаль для реализации каждого типа цикла имеются специальные операторы, но любой из этих трех типов можно организовать при помощи условного оператора и оператора безусловного перехода.
Рис. 2
Рис. 3
Рис. 4
Система команд языка Ассемблер тоже позволяет организовать циклическое выполнение некоторого фрагмента программы, к примеру, используя команды условной передачи управления или команду безусловного перехода JMP.
Рис. 5
Рис. 6
Рис. 7
Как и в языке Паскаль, в Ассемблере существует специальная команда, которая позволяет сокращать листинг циклической программы.
Это команда LOOP <метка>.
Данная команда выполняет следующие функции:
- Автоматически уменьшает значение счетчика.
- Выполняет проверку на выход из цикла.
- Выполняет переход на начало тела цикла.
Команда 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
…..