Ассемблер и программирование для IBM PC



         

ГЛАВА 11. Команды обработки строк - часть 3


MOVS: ПЕРЕСЫЛКА СТРОК ------------------------------------------------------------

На рис.7.5 была показана программа для пересылки девяти байтового поля. Программа включала три команды для инициали зации и пять команд для цикла. Команда MOVS с префиксом REP и длиной в регистре CX может выполнять пересылку любого числа символов более эффективно. Для области, принимающей строку, сегментным регистром, является pегистр ES, а регистр DI содержит относительный адрес области, передающей строку. Сегментным регистром является регистр DS, а регистр SI содержит относительный адрес. Таким образом,в начале программы перед выполнением команды MOVS необходимо инициализировать регистр ES вместе с регистром DS, а также загрузить требуемые относительные адреса полей в регистры DI и SI. В зависимости от состояния флага DF команда MOVS производит увеличение или уменьшение на 1 (для байта) или на 2 (для слова) содержимого регистров DI и SI. Приведем команды, эквивалентные цепочечной команде REP MOVSB:

JCXZ LABEL2 LABEL1: MOV AL,[SI] MOV [DI],AL INC/DEC DI ;Инкремент или декремент UNC/DEC SI ;Инкремент или декремент LOOP LABEL1 LABEL2: ...

В программе на рис. 11.1 процедура C10MVSB использует команду MOVSB для пересылки содержимого десятибайтового поля NAME1 в поле NAME2. Первая команда CLD сбрасывает флаг направления в 0 для обеспечения процесса пересылки слева направо. В нормальном состоянии флаг DF обычно имеет нулевое значение и команда CLD используется из предосторожности.

Ассемблер для IBM PC. Глава 11 244

Две команды LEA загружают регистры SI и DI относительными адресами NAME1 и NAME2 соответственно. Так как регистры DS и ES были ранее инициализированы адресом DATASG, то полные адреса полей NAME1 и NAME2 будут в регистрах ES:DI и DS:SI. (COM программа автоматически инициализирует регистры ES и DS). Команда MOV заносит в регистр CX значение 10 - длину полей NAME1 и NAME2. Команда REP MOVSB выполняет следующее:

ъ Пересылает самый левый байт из поля NAME1 (адресованно го pегистрами ES:DI) в самый левый байт поля NAME2 (адресованного регистрами DS:SI). ъ Увеличивает на 1 адреса в регистрах DI и SI для следующего байта. ъ Уменьшает CX на 1. ъ Повторяет перечисленные действия (в данном случае 10 раз), пока содержимое регистра CX не станет равным нулю.




Содержание  Назад  Вперед