Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

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

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

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

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

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

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

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

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

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

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

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

.model tiny;модель памяти, в которой сегменты кода, данных и стека объединены.

.code;сегмент кода, который содержит данные.

org 100h; начало СОМ-файла

begin:;метка начала кода программы

label1:;создаем метку

mov ah,9;помещаем номер функции DOS «вывод строки» в регистр АН.

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; метка окончания кода программы

В результате работы программы будет зациклен блок строк между Label1 и jmp Label1.

Комбинированная работа команд dec и jnz уменьшает содержимое регистра cx на 1 и выполняет переход на метку, если в cx не равен нулю. Команда dec, кроме того, устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда jnz затем проверяет эту установку.

Аналогично командам jmp и loop операнд в команде jnz содержит значение расстояния между концом команды jnz и адресом перехода (label1), которое прибавляется к командному указателю. Это расстояние должно быть в пределах от -128 до +127 байт.

Следующий пример будет работать так же, как и предыдущая программа, только быстрее.

.model tiny; модель памяти, в которой сегменты кода, данных и стека объединены.

.code; сегмент кода, который содержит данные.

org 100h; начало СОМ-файла

begin:; метка начала кода программы

mov cx,10; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)

Label1:; создаем метку (Label - метка).

mov ah,9; помещаем номер функции DOS «вывод строки» в регистр АН.

mov dx,offset String;помещает в регистр DX смещение метки String относительно начала сегмента данных

int 21h; функция DOS "вывод строки"

dec cx; оператор DEC уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1

jnz Label1; условный переход на строку с меткой Label1

ret; функция DOS "завершить программу"

string db 'privet ',13,10, '$'; cтрока с содержащая выводимые данные

end begin; метка окончания кода программы

Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII.

Команда AND (Логическое И) осуществляет логическое (побитовое) умножение первого операнда на второй. Исходное значение первого операнда (приемника) теряется, замещаясь результатом умножения. В качестве первого операнда команды and можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Пример написания:

And ax, bx; ax=ax˄bx

Команда OR (логическое «включающее или») выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды OR могут быть байтами или словами. Пример написания:

Or al, dl; al= al˅dl

Команда ХОR (логическое «исключающее или») выполняет операцию логического (побитового) «исключающее или» над своими двумя операндами. Результат операции замещает первый операнд; второй операнд не изменяется. Каждый бит результата устанавливается в 1, если соответствующие биты операндов различны, и сбрасывается в 0, если соответствующие биты операндов совпадают. Проще говоря, совпадающие биты обнуляются, а несовпадающие остаются без изменений. Пример написания:

Xor si, di; si = (si˅di)

В качестве первого операнда команды ХОR можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами.

Команда NOT (NOT Инверсия, дополнение до 1, логическое отрицание) выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора. Пример написания:

Not al; al= al





Дата публикования: 2015-02-20; Прочитано: 401 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...