- •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.1. Команды пересылки строк movs, movsb, movsw
Команда MOVS копирует байт или слово из одной части памяти в другую. Она имеет формат
MOVS строка_приемник, строка_источник
Здесь строка_источник – строка в сегменте данных, а строка_приемник – строка в дополнительном сегменте.
Команда MOVS копирует один элемент сегмента данных, адрес которого находится в регистре SI, в ячейку дополнительного сегмента, адрес которой находится в регистре DI.
После пересылки элемента команда MOVS изменяет указатели строки-источника SI и строки-приемника DI. Если флаг DF равен 0, то микропроцессор 8088 увеличивает значения регистров SI и DI после пересылки и тем самым адресуется к следующим элементам памяти. Если флаг DF равен 1, то микропроцессор уменьшает значения регистров SI и DI после пересылки и тем самым адресуется к предыдущему элементу памяти.
Команды MOVSB и MOVSW выполняют аналогичные действия. При этом первая команда оперирует элементами длиной в байт, а вторая – элементами длиной в слово. В этих командах не требуются операнды. Они имеют следующий формат:
MOVSB, MOVSW.
Аналогично все остальные примитивы также представлены тремя разными командами. Первая из них имеет один или два операнда (например, MOVS имеет два операнда), а две остальные не имеют операндов (например, MOVSB и MOVSW). Микропроцессор 8088 может исполнять только те команды обработки строк, которые не имеют операндов. При трансляции программы Ассемблер всегда преобразует команду с операндами в одну из команд без операндов.
Как узнает Ассемблер, что пересылается командой MOVS – байты или слова? Он определяет это по типу меток источника и приемника, указанных в поле операнда.
Если эти метки были определены с помощью псевдооператоров DB, то Ассемблер преобразует MOVS в команду MOVSB. Если они были определены с помощью псевдооператоров DW, то Ассемблер преобразует MOVS в команду MOVSW.
Так как размер элементов – единственная полезная информация, извлекаемая Ассемблером из команды MOVS, то применение команд MOVSB и MOVSW предпочтительнее, поскольку в этом случае Ассемблеру нет необходимости выяснять размер операндов.
6.2. Префиксы повторения
Можно сделать так, чтобы одна команда обработки строк обработала группу последовательных элементов памяти. Для этого перед ней надо указать префикс повторения REP.
Он представляет собой не команду, а однобайтовый модификатор, который заставляет микропроцессор 8088 выполнить аппаратные повторения команды обработки строк. Это значительно сокращает время на обработку длинных строк по сравнению с программно-организованными циклами.
Число повторений извлекается из регистра СХ. После очередного выполнения команды значение в регистре СХ уменьшается на единицу.
Например, последовательность команд
МOV СХ, 500
REP MOVS DEST, SOURCE
заставит микропроцессор 8088 выполнить команду MOVS 500 раз.
Префиксы повторения REPE/REPZ и REPNE/REPNZ используются при "решении" о продолжении или прекращении повторений флаг нуля ZF. Они используются только с командам сравнения строк и поиска значения в строке, которые воздействуют на флаг ZF.
Префикс REPE (повторять, пока равно), имеющий синоним REPZ (повторять, пока нуль), повторяет команду, пока флаг ZF равен 1 и значение регистра СХ не равно 0.
Действия префикса REPNE (повторять, пока не равно), имеющего синоним REPNZ (повторять, пока не нуль), противоположно действию префикса REPE. Иначе говоря, префикс REPNE обеспечивает повторение модифицированной им команды, пока флаг ZF равен 0 и значение регистра СХ не равно 0.
