Команды для манипуляции с точками
Смена сегмента источника
Очевидным недостатком строковых операций являются фиксированные сегменты операндов источника и приемника, – сегмент приемника менять нельзя, а вот сегмент источника можно изменить. Для этого у имени операции отбрасывается последняя буква (b, 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), наоборот, устанавливает разряд, разрешая пересылку в обратном направлении. Обе команды не имеют операндов. Обычное состояние флага направления – очищенное.
Таким образом, выражение "пересылка в прямом направлении" означает, что операнды записываются в память или считываются из нее в порядке увеличения их адресов. Соответственно, выражение "пересылка в обратном направлении" означает обработку операндов в порядке уменьшения их адресов.