- •1. Внутренние регистры
- •1.1. Регистры данных
- •1.2. Регистры сегментов
- •1.3. Регистры указателей и индексов
- •1.4. Регистр командного указателя
- •1.5. Флаговый регистр
- •2. Структура и процесс разработки программы на языке ассемблера
- •2.1. Команды
- •2.2. Псевдооператоры
- •2.2.1. Псевдооператор segment
- •2.2.2. Псевдооператор proc
- •2.2.3. Псевдооператор assume
- •2.2.4. Псевдооператор end
- •2.2.5. Псевдооператоры определения данных
- •2.3. Инициализация программы
- •3. Команды пересылки данных
- •3.1. Команда mov
- •3.2. Команды push и рор
- •4. Режимы адресации
- •4.1. Регистровая и непосредственная адресация
- •4.2. Исполнительный адрес
- •4.3. Прямая адресация
- •4.4. Косвенная регистровая адресация
- •4.5. Адресация по базе
- •4.6. Прямая адресация с индексированием
- •4.7. Адресация по базе с индексированием
- •5. Команды передачи управления
- •5.1. Команды call и ret
- •5.2. Команда безусловного перехода jmp
- •5.3. Команды условной передачи управления
- •5.4. Команды управления циклами
- •6. Команды обработки строк
- •6.1. Команды пересылки строк movs, movsb, movsw
- •6.2. Префиксы повторения
- •6.3. Команды сравнения строк. Команда cmps.
- •6.4. Команды сканирования строк
- •6.5. Команды загрузки и сохранения строки
- •7. Взаимодействие языков Си и Ассемблера
- •7.1. Внутренняя структура программы на языке Си для ibm pc
- •7.2. Использование функций на языке Ассемблера
- •7.2.1. Основы взаимодействия языков Си и Ассемблера
- •7.2.2. Передача управления в подпрограмму и обратно
- •7.2.3. Использование глобальных данных
- •7.2.4. Использование аргументов функции
- •7.2.5. Возвращение значения через имя подпрограммы
- •7.2.6. Использование аргументов
- •7.3. Вызов функций на языке Си из программ на языке Ассемблера
- •7.4. Использование локальных данных
- •8. Арифметические команды
- •8.1. Форматы хранения десятичных чисел
- •8.2. Команды сложения
- •8.3. Коррекция результата сложения для bcd-форматов
- •8.4. Команда приращения значения приемника на единицу
- •8.5. Команды вычитания
- •8.6. Коррекция результата вычитания для bcd-форматов
- •8.7. Команда уменьшения содержимого приемника на единицу
- •8.8. Команда обращения знака
- •8.9. Команды умножения
- •8.10. Коррекция результатов умножения
- •8.11. Команды деления
- •8.12. Коррекция результатов деления
- •8.13. Команды расширения знака
- •9. Команды манипулирования битами
- •9.1. Логические команды and, or и xor
- •9.2. Команда логического отрицания nот
- •9.3. Команда проверки test
- •9.4. Команды сдвига и циклического сдвига
- •9.4.1. Команды сдвига
- •9.4.2. Команды циклического сдвига
- •10. Команды работы с флагами
- •10.1. Команды управления флагами
- •10.2. Команды пересылки флагов
- •11. Псевдооператоры определения идентификаторов и операции
- •11.1. Псевдооператоры определения идентификаторов
- •11.2. Операции
- •11.2.1. Арифметические операции
- •11.2.2. Логические операции
- •11.2.3. Операции отношения
- •11.2.4. Операции, возвращающие значения
- •11.2.5. Операции присваивания атрибутов
- •12. Условные псевдооператоры
- •13. Макроопределения
- •13.1. Сравнение макроопределений и процедур
- •13.2. Состав макроопределений
- •13.3. Псевдооператоры макроассемблера
- •13.3.1. Псевдооператор local
- •13.3.2. Псевдооператоры повторения
- •13.3.3. Условные псевдооператоры
- •13.3.4. Псевдооператор eхiтм
- •13.4. Операции в макроопределениях
- •13.5. Задание макроопределений в исходных программах
- •13.5.1. Использование библиотеки макроопределений
- •13.5.2. Указания для задания макроопределений
- •13.5.3. Считывание библиотеки макроопределений в программу
- •13.5.4. Удаление макроопределений
6.3. Команды сравнения строк. Команда cmps.
Команда сравнения строк CMPS сопоставляет операнд-источник с операндом-приемником и возвращает результат через флаги. Команда не изменяет значения операндов. Команда имеет формат
CMPS строка_приемник, строка_источник
Команда CMPS сравнивает операнды с помощью их вычитания, а именно вычитается операнд-приемник из операнда-источника.
Для сравнения нескольких элементов команду CMPS надо использовать с префиксом повторения. В данном случае префикс REP не имеет смысла, поскольку при его применении во флагах будет возвращен лишь результат сравнения двух последних элементов. С командой CMPS надо использовать префиксы REPE (REPZ) или REPNE (REPNZ).
С префиксом REPE строки сравниваются до тех пор, пока либо значение регистра СХ не станет равным нулю, либо не будет найдена пара несовпадающих элементов. Например, команды
CLD
MOV СX, 100
REPE CMPS DEST, SOURCE
будут сравнивать до 100 пар элементов строк SOURCE и DEST с целью найти два несовпадающих элемента.
С префиксом REPNE строки сравниваются до тех пор, пока либо значение регистра СХ не станет равным нулю, либо не будет найдена пара совпадающих элементов. Например, команды
CLD
MOV СХ, 100
REPNE СМРS DEST, SOURCE
будут сравнивать до 100 пар элементов строк SOURCE и DEST с целью найти два совпадающих элемента.
Повторение операций сравнения может завершиться в двух случаях:
1) значение регистра СХ стало равным 0,
2) флаг ZF стал равен 0 (префикс REPE), либо 1 (префикс REPNE).
При этом может понадобиться узнать, какой из случаев имел место. Выяснить причину прекращения сравнений можно путем использования после команды CMPS команды условной передачи управления, проверяющей значение флага ZF. Об этих командах мы поговорим позже.
Ассемблер преобразует команду CMPS либо в команду CMPSB (при сравнении байтов), либо в команду CMPSW (при сравнении слов).
6.4. Команды сканирования строк
Команды сканирования строк позволяют осуществить поиск заданного значения в строке. При сканировании строки байтов искомое значение должно находиться в регистре AL, а при сканировании строки слов – в регистре АХ.
Основная команда группы команд сканирования строк SCAS (scan string – сканировать строку) имеет формат
SCAS строка_приемник
Операнд позволяет определить, что представляет собой искомое значение – байт в регистре AL или же слово в регистре АХ.
Строка находится в дополнительном сегменте. Смещение адреса первого элемента строки должно быть помещено в регистр DI.
Для выполнения действий более чем над одним элементом строки надо воспользоваться префиксами повторения REPE (REPZ) или REPNE (REPNZ).
Если искомый элемент обнаружен, то смещение адреса следующего за ним элемента возвращается в регистре DI, а флаг нуля ZF полагается равным 0. С помощью команд условного перехода можно определить, найден такой элемент или не найден.
Ассемблер преобразует команду SCAS либо в команду SCASB (при поиске байта), либо в команду SCASW (при поиске слова).
6.5. Команды загрузки и сохранения строки
Данные команды служат для того, чтобы загрузить элемент строки в регистр или изменить его.
Команда загрузки LODS (load string – загрузить строку) имеет формат
LODS строка_источник
Команда LODS пересылает операнд строка_источник в регистр AL (при пересылке байта) или в регистр АХ (при пересылке слова). Как всегда операнд находится в сегменте данных и адресован регистром SI. После выполнения команды регистр SI изменяется так, чтобы указывать на следующий элемент строки.
Команда LODS имеет сокращенные формы LODSB (load byte string – загрузить строку байтов) и LODSW (load word string – загрузить строку слов).
Команда сохранения строки STOS (Store string – сохранить строку) имеет формат
STOS строка_приемник
Она пересылает байт из регистра AL или слово из регистра АХ в элемент операнда строка-приемник. Операнд находится в дополнительном сегменте и адресуется регистром DI. После выполнения команды регистр DI изменяется так, чтобы указывать на следующий элемент строки.
Будучи повторяемой, команда STOS удобна для заполнения строки заданным значением.
