Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Организация цикла с помощью команды JMP (Второй способ)




ЛАБОРАТОРНА РОБОТА №6

КОМАНДИ ПЕРЕСИЛКИ ДАНИХ. ОЗНАЙОМЛЕННЯ З РОБОТОЮ ЦИКЛІВ

 

Цель работы: ознакомиться со структурой и реализацией циклов в программе.

 

Краткие теоретические сведения

Циклы, позволяющие выполнить некоторый участок программы многократно, в любом языке являются одной из наиболее употребительных конструкций. В системе команд МП 86 циклы реализуются, главным образом, с помощью команды loop (петля), хотя имеются и другие способы организации циклов. В большинстве случаях число шагов в цикле определяется содержимым регистра СХ, поэтому максимальное число шагов составляет 64 К.

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

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

 

Организация цикла с помощью команды LOOP (Первый способ)

Команда loop (анг. петля) выполняет декремент содержимого регистра СХ (счетчик), и если оно не равно 0, осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне - 128... + 127 байт. Обычно метка помещается перед первым предложением тела цикла, а команда loop является последней командой цикла. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536 (если перед входом в цикл СХ=0). Команда не воздействует на флаги процессора.

Команда Назначение Процессор
LOOP метка Организация циклов  

Простейший пример организации циклического перехода (со счетчиком в регистре cx) на языке Assembler:

. model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит и данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov cx,10 ; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)
Label1: ; создаем метку (Label - метка).
mov ah,9 ; помещаем номер функции DOS "вывод строки (9)" в регистр АН.
mov dx,offset String помещает в регистр DX смещение метки String относительно начала сегмента данных
int 21h ; функция DOS "вывод строки"
loop Label1 ; оператор loop уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1 (строка 6)
ret ; функция DOS "завершить программу"
string db 'privet $' ; cтрока с содержащая выводимые данные.
end begin ; метка окончания кода программы

 

В строке (5) загружаем в CX количество повторов (отсчет будет идти от 10 до 0). В строке (6) создаем метку (Label - метка). Далее (строки (7) - (9)) выводим сообщение. И в строке (10) оператор loop уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1 (строка (6)). Таким образом, строка будет выведена на экран десять раз. Когда программа перейдет на строку (11), регистр CX будет равен нулю.

Организация цикла с помощью команды JMP (Второй способ)

Команда jmp передает управление в указанную точку того же или другого программного сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.

Команда jmp имеет пять разновидностей:

1. переход прямой короткий (в пределах - 128... + 127 байтов);

2. переход прямой ближний (в пределах текущего программного сегмента);

3. переход прямой дальний (в другой программный сегмент);

4. переход косвенный ближний;

5. переход косвенный дальний.

Все разновидности переходов имеют одну и ту же мнемонику jmp, хотя и различающиеся коды операций. Во многих случаях транслятор может определить вид перехода по контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные операторы (short - прямой короткий переход; near ptr - прямой ближний переход; far ptr - прямой дальний переход; word ptr - косвенный ближний переход; dword ptr - косвенный дальний переход).

 

Команда Назначение Процессор
JMP метка Безусловный переход  

 

. model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
label1: ; создаем метку
mov ah,9 ; помещаем номер функции DOS "вывод строки (9)" в регистр АН.
mov dx,offset String помещает в регистр DX смещение метки String относительно начала сегмента данных
int 21h ; функция DOS "вывод строки"
jmp Label1 ; переход на строку с меткой Label1
add cx,12 ; прибавить к значению регистра cx число 12 (данная команда не выполняется)
dec cx ; уменьшить значение регистра cx на 1 (данная команда не выполняется)
ret ; функция DOS "завершить программу"
string db "PRIVET",13,10,'$' ; cтрока с содержащая выводимые данные.
end begin ; метка окончания кода программы

 

В результате работы программы будет зациклен блок строк (6) - (10) (Вывод строки PRIVET многочисленное количество раз) Строки (10) - (11).

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...