Иллюстрированный самоучитель по SVGA

Команды для манипуляции с точками

Программные циклы

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

Для управления циклом по счетчику предназначена специальная команда loop – она имеет два параметра, но явно в команде указывается только один из них – метка, на которую передается управление (обычно это метка начала цикла). Неявно loop использует счетчик повторов, которым является содержимое регистра сх. При каждом выполнении команды содержимое сх уменьшается на 1, и если результат отличен от нуля, то управление передается на указанную в команде метку. В противном случае будет выполняться команда, расположенная после loop.

В примере 3.1 показан простой цикл очистки полного сегмента памяти, т. е. 65 536 байтов. Код очищаемого сегмента должен находиться в регистре ев. Для ускорения при каждом повторе очищаются 4 байта.

Пример 3.1. Очистка сегмента с использованием команды mov.

хоr еах, еах очистка регистра еах
хоr di, di di = 0, адрес начала сегмента
mov сх, 16384 сх = 16384, счетчик повторов
Ips: mov es: [di], еах запись 4-х байтов в сегмент
add di, 04 di = di + 4, коррекция адреса
loop Ips управление повторами цикла

В примере 3.1 цикл очистки имеет имя ips и состоит из трех команд. Первая из них очищает 4 байта памяти, вторая увеличивает хранящийся в регистре di адрес на 4, а третья повторяет цикл 16 384 раза.

Важнo
Команда loop может передать управление на метку, которая отстоит от нее не далее чем на 128 байтов. Если это условие нарушено, то при компиляции Макроассемблер выдаст сообщение об ошибке
.

Для многократного повторения одной строковой операции предназначена команда rep, которую называют префиксом повторения. Так же, как команда loop, она использует счетчик повторов, хранящийся в регистре сх. В примере 3.2 показано применение строковой операции для очистки сегмента.

Пример 3.2. Микропрограммный цикл очистки сегмента памяти i.

еах, еах; очистка регистра еах
di, di; di = 0, адрес начала сегмента
сх, 16384; сх = 16384, счетчик повторов
stosd; очистка сегмента, указанного в ES

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

Инструкции rep и loop различаются способом работы со счетчиком повторов. Rep сначала проверяет содержимое регистра сх и, если оно отлично от нуля, выполняет строковую операцию и потом уменьшает содержимое сх на 1. Loop сначала уменьшает содержимое сх на 1 и в зависимости от результата повторяет или прекращает выполнение цикла. Это различие проявляется, если при входе в цикл регистр сх очищен. В таком случае указанная после rep операция не выполнится ни разу, в то время как команда loop будет повторять выполнение цикла 65 536 раз!

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.