Графические устройства

         

Смена сегмента источника



Смена сегмента источника

Очевидным недостатком строковых операций ЭДяются фиксированные сегменты операндов источника и приемника, -егмент приемника менять нельзя, а вот сегмент источника можно изменить. Для этого у имени операции отбрасывается последняя буква (ь, w ли а) и явно описывается сегмент операнда источника. Имя регистра, содержащего адрес (смещение) операнда, в этом сегменте изменить нельзя, у
источника это регистры si или esi. Вот пример корректной записи строковых операций:

lods byte ptr gs:[si] ; загрузка байта al = gs:[si]
movs dword ptr es: [di], fs : [si] ; копирование двойного слова
stos word ptr es:[di] ; эквивалентна stosw es:[di] = ax

Из этого примера видно, что в записи операнда источника можно указать любой сегментный ре-гистр (в данном случае gs или fs), но в записи операнда приемника может быть указан только регистр es. Если вы укажете у приемника другое имя сегментного регистра, то Макроассемблер просто использует имя es, не выдавая сообщение об ошибке.

При отсутствии пятой буквы в имени инструкции Макроассемблер не может определить размер (тип) операнда исходя из текста программы. Поэтому обязательно используется оператор ptr, перед которым указывается размер операнда — byte, word или dword. При отсутствии явного описания типа операнда Макроассемблер выдаст сообщение об ошибке.

Следует отметить, что смену сегмента операнда источника допускают все строковые операции, а не только перечисленные в табл. 3.2.

Направление пересылки. После выполнения строковой операции адрес, находящийся в индексном регистре (или в двух регистрах), увеличивается или уменьшается на размер операнда (на 1, 2 или 4). В первом случае принято говорить о пересылке в прямом направлении, а во втором — в обратном.

Перед коррекцией адреса микропроцессор проверяет состояние флага направления (direction flag), который хранится в седьмом разряде регистра флагов. Если этот разряд очищен, то содержимое индексных регистров увеличивается на размер операнда, а если он установлен, то уменьшается.

Состояние седьмого разряда регистра флагов изменяют две специальные команды eld и std. Первая (eld) очищает разряд, разрешая тем самым пересылку в прямом направлении. Вторая (std), наоборот, устанавливает разряд, разрешая пересылку в обратном направлении. Обе команды не имеют операндов. Обычное состояние флага направления — очищенное.

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

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

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

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



Содержание раздела