- •Содержание
- •1. Введение
- •2. Представление информации в эвм
- •2.1. Системы счисления
- •2.1.1. Основные понятия
- •2.1.2. Системы счисления, используемые в вычислительной технике
- •2.1.3. Перевод чисел из одной системы счисления в другую
- •2.2. Типы данных
- •2.2.1. Типы данных, используемых в эвм
- •2.2.2. Константы
- •2.2.3. Логические величины
- •2.2.4. Символьные величины
- •2.2.5. Целые числа
- •2.2.6. Вещественные числа
- •2.3. Форматы команд
- •3. Основы построения эвм
- •3.1. Немного истории
- •3.2. Особенности архитектуры современной вычислительной машины
- •3.2.1. Основные понятия
- •3.2.2. Структурная организация машины
- •3.3. Вариант структуры микроЭвм
- •3.3.1. Общая структура машины
- •3.3.2. Процессор
- •3.3.3. Оперативная память
- •3.3.4. Системная память
- •3.3.5. Система адресации
- •3.3.6. Виртуальная память
- •3.3.7. Таймер
- •3.3.8. Внешние устройства
- •3.3.9. Принципы обмена информацией с внешними устройствами
- •Некоторые вопросы программного обеспечения
- •4.1. О программном обеспечении
- •4.2. Процесс компиляции
- •4.3. Компиляция с языка Ассемблера
- •5. Особенности архитектуры эвм типа ibm-рс
- •5.1. Введение
- •5.2. Исторический обзор процессоров клона 80х86
- •5.3. Классификация процессоров Intel 80х86
- •5.4. Особенности периферийных устройств ibm-pc
- •5.5. Характеристики компьютера
- •5.6. Сегментная адресация
- •5.7. Особенности распределения адресного пространства в компьютерах ibm-pc
- •5.7.1. Стандартная оперативная память (Conventional memory)
- •5.7.2. Область верхней памяти (Upper Memory Area ‑ uma)
- •5.7.3. Область высшей памяти (High Memory Area ‑ hma)
- •5.7.4. Расширенная память (eXtended Memory Specification — xms)
- •5.7.5. Дополнительная память (Expanded Memory Specification — ems)
- •5.8. Обмен информацией с периферийными устройствами
- •5.8.1. Порты ввода/вывода
- •5.8.2. Использование адресного пространства памяти
- •5.8.3. Прямой доступ к памяти
- •5.9. Прерывания
- •5.10. Начальный запуск эвм
- •5.11. Регистры процессора
- •5.11.1. Регистры общего назначения
- •5.11.2. Указатель инструкций
- •5.11.3. Регистр флагов и управляющие регистры
- •5.11.4. Регистры сегментов и селекторов
- •5.11.5. Системные адресные регистры
- •5.11.6. Регистры отладки
- •5.11.7. Регистры тестирования и модельно-специфические регистры
- •6. Debug — средство непосредственной коррекции и отладки загрузочного кода программ
- •6.1. Введение
- •6.1.1. Команды без аргумента
- •Input I порт
- •6.1.2. Команды обращения к ячейкам
- •15D0:010c bfffff mov di,ffff
- •15D0:010f 57 push di
- •6.1.3. Команды запуска программы
- •6.1.4. Команды просмотра и модификации регистров
- •7. Методы адресации
- •7.1. Введение
- •7.2. Регистровый метод адресации
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •7.3. Непосредственный метод адресации
- •7.4. Прямая адресация
- •7.5. Косвенная регистровая адресация
- •159B:0100 not word ptr [bx]
- •159B:0102 e000 loopnz 0104
- •7.6. Адресация по базе
- •7.7. Косвенная регистровая адресация с индексированием
- •159B:0102 0e push cs
- •7.8. Адресация по базе с индексированием
- •7.9. Относительная адресация
- •7.10. Косвенная регистровая адресация с масштабированием
- •7.11. Адресация по базе с индексированием и масштабированием
- •8. Синтаксис ассемблера
- •8.1. Директивы определения данных
- •8.1.1. Определение переменных
- •Cимвольные строки
- •Числовые данные
- •Примеры:
- •8.2. Выражения
- •8.3. Непосредственные операнды
- •8.4. Структуры
- •8.5. Сегменты
- •8.6. Модели памяти и упрощенные директивы определения сегментов
- •8.7. Упрощенные директивы описания сегментов
- •8.8. Создание программы на ассемблере
- •8.9. Получение выполняемого файла
- •9. Система команд
- •9.1. Классификация команд по операндам
- •9.2. Классификация команд по действию
- •9.2.1. Команды пересылки данных
- •9.2.2. Арифметические команды
- •8.2.3. Команды манипуляции битами
- •9.2.4. Управление центральным процессором
- •9.2.4. Команды передачи управления
- •Iret, iretd
- •9.3. Краткий список команд с используемыми операндами
- •9.3.1. Условные обозначения:
- •9.3.2. Инструкции пересылки данных
- •9.3.3. Арифметические, логические и инструкции сдвига
- •9.3.4. Инструкции обработки строк
- •9.3.5. Инструкции передачи управления
- •9.3.6. Инструкции управления процессором
- •Литература
8.3. Непосредственные операнды
Непосредственные операнды — число, строка, имя или выражение, имеющие некоторое фиксированное значение.
Метка equ выражение
Директива equ присваивает метке значение, которое определяется как целочисленное значение. Результатом может быть целое число, адрес или любая строка символов.
Например:
t equ 1
mess equ ‘try again $’
v equ 4[si]
CMP ax,t ; CMP ax,1
Db mess ; db ‘try again $’
MOV ax,v ; MOV ax, 4[si]
= — эквивалентно equ, но определяемая им метка может принимать целочисленное значение, а метка, определенная равенством, может быть переопределена.
Метка $ — предопределенная метка, всегда соответствует текущему адресу.
8.4. Структуры
Директива STRUC позволяет определять структуру данных аналогично структурам в языках высокого уровня.
Последовательность директив определяет структуру:
Имя struc
«Поля»
Имя ends,
где поля представляют любой набор директив, определяющих переменные или структуры.
Для создания такой структуры в памяти ее необходимо инициализировать следующим образом:
[метка] имя <[значения]>
Пример:
pn struc
x dw 0
y dw 0
z dw 0 шаблон структуры
c26 db 3 dup (?)
pn ends
cr_pn pn <1,1,1,125,255,0> - инициализация структуры. Значения в угловых скобках не обязательны. Если их нет, то выбираются значения из шаблона. Т.е. может быть выражение вида: cr_pn pn < >. Можно задать часть значений. В этом случае значения в угловых скобках перечисляются через запятую. Доступ к элементу структуры осуществляется через оператор (точка). Cr_pn x - доступ к элементу х.
8.5. Сегменты
Каждая программа состоит из одного или нескольких сегментов, а именно сегмента кода, данных, стека.
Ассемблер позволяет изменять устройство программы, как ему угодно, т.е. можно использовать один сегмент для всего.
Сегмент программы описывается директивами
SEGMENT и ENDS
имя сегмента segment выравнивание тип разряд класс
…
имя сегмента ends
Выравнивание указывает ассемблеру и редактору связей, с какого адреса может начинаться сегмент:
byte |
– c любого адреса; |
word |
– с четного адреса; |
Dword |
– с адреса, кратного 4; |
Para |
– с адреса, кратного 16 (граница параграфа); |
Page |
– с адреса, кратного 256; |
Mempage |
– с адреса, кратного 4 Кбайта. |
По умолчанию используется выравнивание по границе параграфа.
Тип — указание для редактора связей, как комбинируются сегменты.
PUBLIC (синоним MEMORY) все сегменты с одинаковым именем, но разными классами будут объединены в один.
STACK — тоже самое, что и для предыдущего случая, но для сегментов стека. При загрузке программы сегмент, полученный объединением всех сегментов типа STACK, будет использоваться как стек.
COMMON — сегменты с одинаковыми именами объединяются в один, но не последовательно, а по одному и тому же адресу, и длина сегмента будет равна не сумме сегментов, а длине максимального сегмента.
АТ — сегмент располагается по фиксированному абсолютному адресу памяти. Адрес кратен 16, т.е. длине параграфа. Обычно такой сегмент содержит только метки, указывающие на области памяти, которые могут потребоваться программе.
PRIVATE (значение по умолчанию) — сегмент не объединяется с другими сегментами.
Разрядность: принимает значения USE16 и USE32. В первом случае размер сегмента не более 64 Кб. Все команды и адреса считаются 16-битными, но можно применять 32-битные и ссылаться на 32-битные данные. Во втором случае размер сегмента до 4Гб. Команды и адреса 32-битные.
По умолчанию используется USE16, если перед директивой MODEL не использовалась директива задания набора команд .386 и старше.
Класс сегмента — это любая метка, взятая в одинарные кавычки. Все сегменты с одинаковым классом, даже сегменты типа PRIVATE, будут расположены в исполняемом файле друг за другом.
Директива сегмент не содержит информации о назначении сегмента. Для определения назначения сегмента необходимо связать соответствующий сегментный регистр с сегментным адресом. Для этого используют директиву ASSUME.
Если в программе определено много сегментов, то их удобно объединить в группу, адресуемую с помощью одного сегментного регистра:
Имя группы group имя сегмента (список сегментов).
Common segment para common ‘data’
Common ends
Pdata segment para pablic ‘ddt’
Pdata ends
Имя группы можно использовать для получения сегментного адреса и для директивы.
ASSUME
Assume регистр: связь...
Assume cs: cod, DS: data, ss: STACK, ES: DATASG
Если связать, используя директиву, аssume и ключевое слово nothing (ничего), то в этом случае назначения регистров сегментов аннулируются:
Assume nothing
cs: cod, DS : d at, es: nothing