Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_lek_OAiP_Meleshko.docx
Скачиваний:
0
Добавлен:
23.01.2020
Размер:
377.68 Кб
Скачать

Организация циклов

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

Например, подсчитаем количество нулевых байтов в области mas.

model small

.stack 100h

.data

len equ 10 ;количество элементов в mas

mas db 1,0,9,8,0,7,8,0,2,0 ;инициализируем массив

.code

start :

mov ax,@data

mov ds, ax

mov сx, len ;длину поля mas в сх

xor ax,ax ;обнуляем ax

xor si,si ;обнуляем si

cycl :

jcxz exit ;проверка сх на 0, если 0, то выход

cmp mas[si],0 ;сравнить элемент mas с 0

jne ml ;если не равно 0, то на ml

inc al ;в al - счетчик нулевых элементов

ml:

inc si ;перейти к следующему элементу

dec сх ;уменьшить сх на 1

jmp cycl ;переход на метку cycl

exit :

mov ax,4c00h

int 21h

end start

Цикл организован тремя командами, JCXZ, DEC и JMP . Команда JCXZ выполняет здесь две функции: предотвращает выполнение «пустого» цикла (когда счетчик цикла в СХ равен нулю) и отслеживает окончание цикла после обработки всех элементов поля mas. Команда DEC после каждой итерации цикла уменьшает значение счетчика в регистре СХ на 1.

Команда LOOP также позволяет организовать циклы (loops), подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Синтаксис команды:

loop метка_перехода

Команда реализует описанные далее действия.

1. Декремент регистра СХ.

2. Сравнение регистра СХ с нулем:

  • если (СХ) > 0, то управление передается на метку перехода;

  • если (СХ) = 0, то управление передается на следующую после LOOP команду.

Команды LOOPE и LOOPZ (Loop still сх <> 0 or Zero flag = 0 — повторить цикл пока СХ <> 0 или ZF = 0) — абсолютные синонимы. Синтаксис команд:

loope/loopz метка_перехода

Команды реализуют описанные далее действия.

1. Декремент регистра СХ.

2. Сравнение регистра СХ с нулем и анализ состояния флага нуля ZF:

  • если (СХ) > 0 и ZF = 1, управление передается на метку перехода;

  • если (СХ) = 0 или ZF=0, управление передается на следующую после LOOP команду.

Команды LOOPNE и LOOPNZ (Loop still ex <> 0 or NonZero flag = 0 — повторить цикл, пока СХ <> 0 или ZF = 1) также абсолютные синонимы. Синтаксис команд:

loopne/loopnz метка_перехода

Команды реализуют описанные далее действия.

1. Декремент регистра СХ.

2. Сравнение регистра СХ с нулем и анализ состояния флага нуля ZF:

  • если (СХ) > 0 и ZF = 0, управление передается на метку перехода;

  • если (СХ) = 0 или ZF = 1, управление передается на следующую после LOOP команду.

Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ по принципу своей работы являются взаимнообратными. Они расширяют действие команды LOOP тем, что дополнительно анализируют флаг ZF. Это дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора. Типичное применение этих команд связано с операцией поиска определенного значения в последовательности или со сравнением двух чисел.

Недостаток команд организации цикла LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ заключается в том, что они реализуют только короткие переходы (от -128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду JMP

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

model small

.stack 100h

.data

len equ 10 ;количество элементов в mas

mas db 1,0,9,8,0,7,8,0,2,0

.code

start:

mov ax,@data

mov ds,ax

mov сx,len

xor ax,ax

xor si,si

jcxz exit

cycl:

cmp mas[si],0

jne ml

inc al

ml:

inc si

loop cycl

exit:

mov ax,4c00h

int 21h

end start

У команды JCXZ осталась только одна функция – не допустить выполнения «пустого» цикла, поэтому несколько изменилось ее место в тексте программы: теперь она стоит перед меткой начала цикла cycl. Изменение и контроль содержимого регистра СХ в процессе выполнения каждой итерации выполняет команда LOOP.

Принципы организации вложенных циклов.

Основная проблема, которая при этом возникает, – как сохранить значения счетчиков в регистре СХ для каждого из циклов. Для временного сохранения счетчика внешнего цикла на время выполнения внутреннего доступно несколько способов: задействовать регистры, ячейки памяти или стек. В следующем фрагменте программы имеется три цикла, вложенные один в другой. Этот фрагмент можно рассматривать как шаблон для построения других программ с вложенными циклами.

mov сх,100 ;количество повторений цикла cycl_l

cycl_l :

push сх ;счетчик цикла cycl_l в стек

….. ;команды цикла cycl_l

mov сх,50 ;количество повторений цикла cycl_2

cycl_2:

push сх ;счетчик цикла cycl_2 в стек

..... ;команды цикла cycl_2

mov сх,25 ;количество повторений цикла cycl_3

cycl_3:

..... ;команды цикла cycl_3

loop cycl_3

... ;команды цикла cycl_2

pop сх ;восстановить счетчик цикла cycl_2

loop cycl_2

... ;команды цикла cycl_l

pop сх ;восстановить счетчик цикла cycl_l

loop cycl_l

Пример фрагмента программы, которая обрабатывает специальным образом некоторую область памяти. Область памяти рассматривается как совокупность пяти полей, содержащих 10 однобайтовых элементов. Требуется заменить все нулевые байты в этой области значением 0ffh.

model small

.stack 100h

.data

mas db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

db 1 0,9,8,0,7,8,0,2,0

db 1,0,9,8,0,7,8,0,2,0

. code

start:

mov ax,@data

mov ds,ax

xor ax, ax

lea bx, mas

mov сx, 5

cycl_l:

push сx

xor si, si

mov cx, 10

cycl_2:

cmp byte ptr [bx+si] ,0

jne no_zero

mov byte ptr [bx+si] ,0ffh

no_zero:

inc si

loop cycl_2

pop cx

add bx, 10

loop cycl_l

exit:

mov ax, 4c00h

int 21h

end start

ЛИТЕРАТУРА

  1. Юров, В.И. Assembler. Учебник для вузов / В. И. Юров. – 2-е изд. – СПб. : Питер, 2006. – 637 с.

  1. Голубь, Н. Г. Искусство программирования на Ассемблере / Н. Г. Глубь. – СПб. : ООО «ДиаСофтЮП», 2002. – 656 с.

  1. Калашников, О.А. Ассемблер? Это просто! Учимся про­грамми­ровать / О. А. Калашников. – СПб. : БХВ-Петербург, 2005. – 384 с.

  2. Финогенов, К.Г. Основы языка Ассемблера / К.Г.Финогенов. – М.: Радио и связь, 1999. – 28S с.

  3. Абель, П. Язык Ассемблера для IBM PC и приложения / П.Абель. – М. : «Радио и связь», 1991. – 447 с.

  1. Скэплон, Л. Персональные ЭВМ IBM PC и XT. Программирова­ние на языке Ассемблер / Л. Скеплон. – М. : «Радио и связь», 1989. – 336 с.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ 3

ЭТАПЫ РАЗВИТИЯ ЭВМ 4

МАШИННО-ОРИЕНТИРОВАННЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ 6

АРХИТЕКТУРА ЭВМ 8

МИКРОПРОЦЕССОРЫ INTEL 9

НАБОР РЕГИСТРОВ 12

ОРГАНИЗАЦИЯ ПАМЯТИ 17

ТИПЫ ДАННЫХ 19

ФОРМАТ КОМАНД 22

ОБРАБОТКА ПРЕРЫВАНИЙ 24

СИНТАКСИС АССЕМБЛЕРА 29

ДИРЕКТИВЫ СЕГМЕНТАЦИИ 31

ДИРЕКТИВЫ РЕЗЕРВИРОВАНИЯ И ИНИЦИАЛИЗАЦИИ ДАННЫХ 37

СПОСОБЫ ЗАДАНИЯ ОПЕРАНДОВ 41

ОПЕРАТОРЫ 45

ФУНКЦИОНАЛЬНАЯ КЛАССИФИКАЦИЯ МАШИННЫХ КОМАНД 49

КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ 49

АРИФМЕТИЧЕСКИЕ КОМАНДЫ 61

ЛОГИЧЕСКИЕ КОМАНДЫ 69

КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ 72

ОРГАНИЗАЦИЯ ЦИКЛОВ 77

ЛИТЕРАТУРА 83

1. Юров, В.И. Assembler. Учебник для вузов / В. И. Юров. – 2-е изд. – СПб. : Питер, 2006. – 637 с. 83

1. Калашников, О.А. Ассемблер? Это просто! Учимся про­грамми­ровать / О. А. Калашников. – СПб. : БХВ-Петербург, 2005. – 384 с. 83

2. Финогенов, К.Г. Основы языка Ассемблера / К.Г.Финогенов. – М.: Радио и связь, 1999. – 28S с. 83

3. Абель, П. Язык Ассемблера для IBM PC и приложения / П.Абель. – М. : «Радио и связь», 1991. – 447 с. 83

2. Скэплон, Л. Персональные ЭВМ IBM PC и XT. Программирова­ние на языке Ассемблер / Л. Скеплон. – М. : «Радио и связь», 1989. – 336 с. 83

Учебное издание

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]