- •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.3. Инициализация программы
Существует два основных типа загрузочных программ: ЕХЕ и СОМ. Рассмотрим загрузочные программы типа ЕХЕ.
Система DOS имеет четыре требования для инициализации ассемблерной ЕХЕ-программы. Для этого необходимо:
1) указать ассемблеру, какие сегментные регистры должны соответствовать сегментам,
2) сохранить в стеке адрес, находящийся в регистре DS, когда программа начнет выполнение,
3) записать в стек нулевой адрес,
4) загрузить в регистр DS адрес сегмента данных.
Пример.
STACKSEG SEGMENT PARA STACK 'STACK'
DB 64 DUP(?)
STACKSEG ENDS
DSEG SEGMENT PARA PUBLIC 'DATA'
SOURCE DB 10
DEST DB ?
DSEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
BEGIN PROC FAR
ASSUME CS:CSEG, DS:DSEG, SS:STACKSEG
PUSH DS ; записать DS в стек
SUB AX, AX ; установить ноль в AX
PUSH AX ; записать ноль в стек
MOV AX, DSEG ; занести адрес
MOV DS, AX ; DSEG в DS
MOV AL, SOURCE ; скопировать значение
MOV DEST, AL ; SOURCE в DEST
RET ; возврат в DOS
BEGIN ENDP
CSEG ENDS
END BEGIN
1. Псевдооператор ASSUME устанавливает соответствие между конкретными сегментами и сегментными регистрами; в данном случае CSEG соответствует CS, DSEG – DS и т.д.
2. Загрузочному модулю в памяти непосредственно предшествует 256-байтовая (100Н) область, которая называется префиксом программного сегмента PSP. Когда программа загружается на выполнение регистр DS указывает на начальную точку PSP. Пользовательская программа должна сохранить этот адрес, поместив его в стек. Позже команда RET возьмет этот адрес из стека для возврата в DOS.
3. В системе требуется, чтобы следующее значение в стеке являлось нулевым адресом (точнее, смещением). Для этого команда SUB очищает регистр АХ, вычитая его из этого же регистра АХ, а команда PUSH заносит это значение в стек.
4. Загрузчик DOS устанавливает правильные адреса стека в регистре SS и сегмента кодов в регистре CS. Поскольку программа загрузчика использует регистр DS для других целей, необходимо инициализировать регистр DS двумя командами MOV.
5. Команда RET обеспечивает выход из пользовательской программы и возврат в DOS.
3. Команды пересылки данных
3.1. Команда mov
Команда MOV (move – переслать) пересылает байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также пересылать непосредственно адресуемое значение (константу) в регистр или в ячейку памяти.
Напомним, что команда MOV имеет следующий формат:
MOV приемник, источник
В ней допустимо большинство из возможных сочетаний операндов.
В команде MOV исключаются следующие сочетания операндов:
1. Нельзя осуществить непосредственную пересылку данных из одной ячейки памяти в другую. Чтобы выполнить такую пересылку, данные источника надо загрузить в регистр общего назначения, а затем запомнить содержимое этого регистра в приемнике.
2. Нельзя загрузить непосредственно адресуемый операнд в регистр сегмента. Как и в случае 1, сначала надо загрузить его в регистр общего назначения.
Например, загрузка номера блока сегмента данных (DSEG) в регистр DS осуществляется следующим образом:
MOV АX, DSEG
MOV DS, AX
3. Нельзя непосредственно переслать значение одного регистра сегмента в другой. Подобные пересылки также делаются через регистр общего назначения.
Например, чтобы регистр DS указывал на тот же сегмент, что и регистр ES, можно воспользоваться командами
MOV AX, ES
MOV DS, AX
4. Нельзя использовать регистр CS в качестве приемника в команде пересылки.
