- •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. Удаление макроопределений
5. Команды передачи управления
5.1. Команды call и ret
Команды, обеспечивающие исполнение процедур, должны выполнять три функции:
1. Обеспечить сохранение содержимого регистров IP и CS.
2. Заставить микропроцессор начать исполнение процедуры.
3. Использовать сохраненное содержимое регистров IP и CS для возврата в программу и обеспечить продолжение ее исполнения с этого места.
Все эти функции выполняются двумя командами: CALL (вызвать процедуру) и RET (возвратиться из процедуры).
Команда CALL осуществляет функции запоминания адреса возврата и передачи управления процедуре. Она помещает в стек адрес возврата, занимающий 16 битов, если процедура определена с атрибутом NEAR, и 32 бита, если она определена с атрибутом FAR. Вспомним, что процедуры с атрибутом NEAR могут быть вызваны только из того сегмента, в котором они находятся. Процедуры с атрибутом FAR могут быть вызваны и из другого сегмента.
Команда CALL имеет формат
CALL имя
где имя – имя вызываемой процедуры (т.е. метка ее начала).
Если процедура имя имеет атрибут NEAR, то команда CALL помещает смещение адреса следующей команды в стек. Если процедура имя имеет атрибут FAR, то команда CALL помещает в стек содержимое регистра CS, а затем смещение адреса.
После сохранения адреса возврата команда CALL загружает смещение адреса метки имя в указатель команд IP. Если процедура имеет атрибут FAR, то команда CALL загружает также номер блока метки имя в регистр CS.
Команда RET заставляет микропроцессор 8088 возвратиться из процедуры в программу, вызвавшую эту процедуру. Делается это "откатом" всего, что сделала команда CALL. Команда RET обязательно должна быть последней командой процедуры, исполняемой микропроцессором 8088.
Команда RET извлекает из стека адрес возврата. Если процедура имеет атрибут NEAR (т.е. находится в том же сегменте команд, что и команда CALL), то команда RET извлекает из стека одно слово и загружает его в указатель команд IP. Если процедура имеет атрибут FAR (т.е. находится в другом сегменте команд), то команда RET извлекает из стека два слова: сначала смещение адреса для загрузки в указатель команд IP, а затем номер блока для загрузки в регистр CS.
Можно осуществлять косвенный вызов процедуры через регистр или ячейку памяти. При косвенных вызовах через ячейку памяти микропроцессор извлекает значение указателя команд IP для процедуры из сегмента данных, если только не используется регистр ВР или не производится замена сегмента. Если для адресации ячейки памяти используется регистр ВР, то микропроцессор извлечет значение указателя команд IP из сегмента стека.
Можно вызвать процедуру с атрибутом NEAR через регистр, например:
CALL ВХ
В данном случае регистр ВХ содержит смещение адреса процедуры относительно регистра сегмента CS. При исполнении этой команды микропроцессор копирует содержимое регистра ВХ в указатель команд IP, затем передает управление команде, адресуемой парой регистров CS : IP.
Процедуру с атрибутом NEAR можно вызвать косвенно, используя переменную размером в слово, например:
CALL WORD PTR [ ВХ ] ; косвенная регистровая
CALL WORD PTR [ BX ] [ SI ] ; по базе с индексированием
CALL WORD PTR VARIABLE_NAМE
CALL WORD PTR VARIABLE_NAME [ BX ] ; прямая с
; индексированием
CALL MEM_WORD
CALL WORD PTR ES : [ BX ] [ SI ] ; по базе с индексированием
Операция указателя PTR позволяет изменить у операнда атрибут типа (BYTE, WORD, DWORD) или атрибут дистанции (NEAR или FAR). В данном случае эта операция используется для доступа к словам.
Последняя команда CALL получает адрес процедуры из ячейки дополнительного сегмента. Это осуществляется благодаря операции замены сегмента ES:.
Процедуру с атрибутом FAR можно вызвать косвенно, используя переменную размером в двойное слово, например:
CALL DWORD PTR [ BX ]
CALL MEM_DWORD
CALL DWORD PTR SS : VARIABLE_NAME [ SI ]
Здесь первые две команды CALL извлекают адреса процедур из сегмента данных, а последняя – из сегмента стека.
Процедура может сама вызывать другие процедуры. Таким образом возможно использование вложенных процедур. Так как каждая команда CALL помещает в стек два или четыре байта адреса, то число уровней вложения ограничено только размером сегмента стека.
