|
Листинг ассемблера на Фиг. 4.22 показывает
различные строковые
команды.Загрузка строки LODS и запись строки STOS являются
простейшими строковыми командами.Если программа указывает
байтовый операнд в команде LODS, то она
загружает в регистр AL
байт, на который указывает пара регистров
DS:SI.Затем она
изменяет регистр SI на единицу; он
увеличивается, либо уменьшается,
в зависимости от состояния флага
направления.Если команда LODS
указывает на слово, то она загружает
регистр AX и изменяет регистр
SI на 2.Команда STOS строго противоположна, и записывает байт из
регистра AL либо слово из регистра AX в
ячейку памяти.В случае
записи ячейка определяется парой регистров
ES:DI.Команда записи
изменяет регистр DI либо на единицу, либо
на 2, в зависимости от
типа операнда.
Программист может писать на ассемблере
команду LODS (а также и
все другие строковые команды) различными
способами. Тип операнда
можно указать частью кода операции, либо
ассемдлер может определить
тип элемента строки, основываясь на
операнде, присутствующем в
команде. Как показано на Фиг. 4.22,
команда
LODS EXBYTE
порождает команду загрузки строк байтов,
так же как и команда
LODSB.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:01:26
Фиг. 4.22 Команды обработки строк
Page1-1
PAGE,132
TITLEФиг. 4.22 Команды обработки строк
0000CODESEGMENT
ASSUMECS:CODE,DS:CODE,ES:CODE
0000EXBYTELABELBYTE
0000EXWORDLABELWORD
0000EXBYTE1 LABELBYTE
0000EXWORD1 LABELWORD
0000ACLODSEXBYTE; Загрузка AL из DS:SI
0001ADLODSEXWORD; Загрузка AX из DS:SI
0002ACLODSB; Загрузка AL из DS:SI
0003AASTOSEXBYTE; Сохранение AL в ES:DI
0004ABSTOSEXWORD; Сохранение AX в ES:DI
0005ABSTOSW; Сохранение AX в ES:DI
0006F3/ AAREPSTOSB; Сохранение AL в ES:DI в цикле CX раз
0008A4MOVSEXBYTE1, EXBYTE ;
Пересылка байта [ES:DI] <- [DS:SI]
0009A5MOVSEXWORD1, EXWORD ;
Пересылка слова [ES:DI] <- [DS:SI]
000AA4MOVSB; Пересылка байта [ES:DI] <- [DS:SI]
000BF3/ A5REPMOVSW; Пересылка CX слов [ES:DI] <- [DS:SI]
000DAESCASEXBYTE1; Сравнение AL с [ES:DI]
000EF3/ AEREPESCASB; Сравнение AL с [ES:DI] пока равно
0010F2/ AFREPNESCASW; Сравнение AX с [ES:DI] пока не равно
0012A7CMPSEXWORD, EXWORD1 ;
Сравнение слова [DS:SI] с [ES:DI]
0013F3/ A7REPECMPSW; Сравнение слов [DS:SI] с [ES:DI] пока
;равно
в цикле CX раз
0015F2/ A6REPNECMPSB; Сравнение байт [DS:SI] с [ES:DI] пока
;не
равно в цикле CX раз
0017CODEENDS
END
Фиг.4.22 Строковые команды
В первом случае ассемблер определяет, что
строка состоит из
байта, поскольку EXBYTE - переменная типа
BYTE. Во втором случае
программист непосредственно указывает, что
работает с байтами.
Собственно ассемблер не требует поля
операнда. Программисты чаще
используют вторую форму, так как не имеют
имени переменной,
связанной со строкой. Программа
динамически располагает строку в
памяти, для нее не существует
фиксированного места, и,
следовательно, нет и имени переменной.
Команда STOS аналогична.
Чтобы непосредственно указать строку слов,
а не байтов,
используются коды операций LODSW и STOSW.
Ассемблер должен знать,
для байтовой строки или строки слов
написана команда, поскольку
машинные команды различны для различных
типов строк. Эта разница
определяет значение, на которое надо
изменить индексный регистр.
Операнд в команде должен быть указан в том
случае, если в
программе используются основные формы
команд LODS и STOS. Если
программа не имеет удобной метки для
строки, она может использовать
формы LODSB и STOSB. Преимущество
использования основной формы LODS
и указания операнда заключается в том, что
ассемблер при этом
проверяет не только тип операнда, но и
возможность его адресации.
Так как команда LODS работает с объектами
только в сегменте DS,
оператор ASSUME должен соответственно
описывать расположение
сегмента поименованной переменной.
Аналогично, ассемблер проверяет
основную форму команды STOS на адресацию
сегмента ES. Любая форма
приемлема для ассемблера, но лучше
использовать основную форму,
чтобы позволить ассемблеру наилучшим
способом проверить наличие
ошибок в программе до выполнения.
|