На главную Назад
Добро пожаловать, уважаемый посетитель!

Листинг ассемблера на Фиг. 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. Любая форма

приемлема для ассемблера, но лучше использовать основную форму,

чтобы позволить ассемблеру наилучшим способом проверить наличие

ошибок в программе до выполнения.


 

Mail.ru