
- •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. Удаление макроопределений
2.2.2. Псевдооператор proc
Сегмент кода содержит одну или несколько процедур, которые определяются псевдооператором PROC.
Сегмент, содержащий только одну процедуру, имеет следующий вид:
имя_сегмента SEGMENT PARA
имя_процедуры PROC FAR
. . . . . . . .
RET
имя_процедуры ENDP
имя_сегмента ENDS
Псевдооператор ENDP определяет конец процедуры и имеет имя, аналогичное имени в псевдооператоре PROC.
Команда RET завершает выполнение процедуры.
Процедуре всегда приписан один из двух атрибутов дистанции. NEAR (близкая процедура) и FAR (далекая процедура). Он указывается в качестве операнда оператора PROC. Если операнд опущен, то подразумевается атрибут NEAR.
Процедура с атрибутом NEAR может быть вызвана только из того сегмента команд, в котором она определена.
Когда микропроцессор 8088 вызывает процедуру, то он помещает адрес возврата в стек. Этот адрес будет извлечен при выполнении команды RET.
Если процедура имеет атрибут NEAR, то при вызове в стек помещается только смещение (содержимое указателя команд IP). Если процедура имеет атрибут FAR, то при вызове в стек помещается и номер блока (содержимое регистра сегмента команд CS), и содержащееся в регистре IP смещение (в указанном порядке).
При трансляции программы Ассемблером каждая команда RET преобразуется в машинную команду, которая указывает микропроцессору 8088, сколько слов с адресами возврата понадобится извлечь из стека.
Команда RET в процедуре с атрибутом NEAR заставит микропроцессор извлечь из стека одно слово (содержимое регистра IP). Команда RET в процедуре с атрибутом FAR заставит его извлечь два слова (содержимое регистров IP и CS).
Программу можно вызвать из операционной системы DOS или из отладчика. Но так как и DOS, и отладчик размещены в сегментах команд, отличных от сегмента команд программы, то ее основная процедура должна иметь атрибут FAR.
2.2.3. Псевдооператор assume
Процессор использует регистр SS для адресации стека, регистр DS для адресации сегмента данных и регистр CS для адресации сегмента кода. Однако предыдущие рассмотренные описания не дают информации о том каково назначение каждого сегмента.
Псевдооператор ASSUME сообщает ассемблеру назначение каждого сегмента. Он имеет формат
ASSUME SS: имя_сегмента, DS: имя_сегмента,CS: имя_сегмента, ES: имя_сегмента
Например, CS: CSEG указывает, что ассемблер должен ассоциировать сегмент CSEG с регистром CS. Операнды могут записываться в любой последовательности. Если программа не использует какой-либо регистр, то его описание можно опустить.
2.2.4. Псевдооператор end
Если псевдооператор ENDS завершает сегмент, а псевдооператор ENDP завершает процедуру, то псевдооператор END полностью завершает всю программу:
END [имя процедуры]
Операнд может быть опущен, если программа не предназначена для выполнения. Например, если ассемблируются только определения данных, или эта программа должна быть скомпонована с другим (главным) модулем. Для обычной программы с одним модулем операнд содержит имя, указанное в директиве PROC, которое было обозначено как FAR.