
- •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. Удаление макроопределений
Языки программирования и методы трансляции.
Программирование на языке ассемблера
1. Внутренние регистры
Внутри микропроцессора информация содержится в группе 16-битовых элементов, называемых регистрами. Всего имеется 14 регистров: 12 регистров данных и адресов и в дополнение к ним указатель команд (регистр адреса команд) и регистр состояния (регистр флагов). Можно подразделить 12 регистров данных и адресов на три группы по четыре регистра, а именно на регистры данных, регистры указателей и индексов и регистры сегментов.
1.1. Регистры данных
Имеется четыре 16-битовых регистра данных. Они имеют имена АХ, ВХ, СХ, DX и используются, если необходимо оперировать 16-битовыми словами. Однако, если необходимо оперировать 8-битовыми байтами, регистры данных можно рассматривать как восемь 8-битовых регистров. При этом считается, что каждый из 16-битовых регистров образован из двух 8-битовых регистров AL, АН, BL, ВН, CL, СН, DL и DH. Буквы L и Н означают соответственно младшие и старшие байты 16-битовых регистров.
Всеми этими регистрами можно пользоваться при программировании, но следует учитывать, что ряд команд использует их неявным образом.
Регистр AX (аккумулятор) является основным сумматором и применяется для всех операций ввода-вывода, некоторых операций над строками и некоторых арифметических операций: умножения, деления и сдвига.
Регистр ВХ (базовый) использоваться при адресации данных в памяти.
Регистр СХ (счетчик) необходим для управления числом повторении циклов и для операций сдвига влево или вправо. Регистр СХ используется также для вычислений.
Регистр DX (регистр данных) применяется для некоторых операций ввода-вывода и операций умножения и деления над большими числами, которые используют два регистра DX:AX.
Заметим, что только регистры данных могут использоваться и как 16-битовые, и как 8-битовые. Все регистры остальных групп – 16-битовые.
1.2. Регистры сегментов
В ЭВМ, сконструированных на базе микропроцессора 8088, программы и данные хранятся в отдельных областях памяти. Эти области называются сегментами. Сегменты могут располагаться в любом месте памяти и иметь размер до 64 Кбайт.
Микропроцессор 8088 может использовать одновременно четыре сегмента. Начальные адреса этих сегментов содержатся в его четырех регистрах сегментов. Эти регистры выполняют следующие функции:
Регистр сегмента команд CS указывает на сегмент, содержащий текущую исполняемую программу.
Регистр сегмента стека SS указывает на текущий сегмент стека. Стек представляет собой область памяти, используемую для временного хранения данных и адресов. Микропроцессор 8088 использует стек для хранения адреса возврата из текущей подпрограммы, но стек можно использовать также для восстановления содержимого регистров, изменяемых при работе программы.
Регистр сегмента данных DS указывает на текущий сегмент данных, обычно содержащий используемые в программе переменные.
Регистр дополнительного сегмента ES указывает на текущий дополнительный сегмент, который используется при выполнении операций над строками.
Микропроцессор 8088 использует 20-битовые адреса ячеек оперативной памяти. Адрес каждой ячейки задается двумя числами: номером блока и смещением. Физический адрес образуется путем добавления 16-битового смещения к номеру блока, умноженному на 16. Номер блока извлекается из регистра сегмента. Таким образом,
физический адрес = смещение + 16 • (регистр сегмента).
В действительности микропроцессор 8088 вместо умножения на 16 использует содержимое регистра сегмента так, как если бы оно имело четыре дополнительных нулевых бита.
Например:
0000 0000 0001 0000 (смещение)
+ 0010 0000 0000 0000 (0000) (номер блока)
0010 0000 0000 0001 0000 (физический адрес).
Имея в своем распоряжении 20-битовый адрес, микропроцессор 8088 может адресовать 1 Мбайт.