- •Содержание
- •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. Инструкции управления процессором
- •Литература
15D0:010c bfffff mov di,ffff
15D0:010f 57 push di
15D0:0110 B454 MOV AH,54
15D0:0112 CD21 INT 21
15D0:0114 8BEC MOV BP,SP
15D0:0116 804E1601 OR BYTE PTR [BP+16],01
15D0:011A 58 POP AX
15D0:011B 5B POP BX
15D0:011C 59 POP CX
15D0:011D 5A POP DX
15D0:011E 5E POP SI
15D0:011F 5F POP DI
-
Аргументы «u» аналогичны «d», кроме случая, когда не указано количество просматриваемых ячеек. В этом случае выводится около 15 строк текста.
Команда «a» используется для ввода команд МП 8086, 8088. Ее единственный необязательный аргумент — адрес начала ввода, так же, как и у команды «e». Пример использования команды «a» мы рассмотрим в следующей главе.
6.1.3. Команды запуска программы
Команда «t» DEBUG позволяет выполнить одну или несколько команд процессора:
t [=адрес] [число],
здесь адрес – адрес выполняемой команды; если не указан, берется текущее значение IP. Число — количество выполняемых команд. Если не указано, предполагается равным 1. После исполнения этого количества команд DEBUG вернется к диалогу с вами.
Например, выполнить две команды с адреса 100:
-t =100 2
AX=002C BX=0000 CX=0000 DX=162C SP=4008 BP=0000 SI=0000 DI=0000
DS=0005 ES=15D0 SS=1656 CS=0000 IP=0101 NV UP DI PL NZ AC PO NC
0000:0101 EC IN AL,DX
AX=00FF BX=0000 CX=0000 DX=162C SP=4008 BP=0000 SI=0000 DI=0000
DS=0005 ES=15D0 SS=1656 CS=0000 IP=0102 NV UP DI PL NZ AC PO NC
0000:0102 00F0 ADD AL,DH
-
После выполнения каждой команды DEBUG выводит содержимое регистров, а также сегмент, смещение, код и мнемонику следующей команды.
Обратите внимание: попытка исполнить неизвестную DEBUG команду возможна и может иметь три различных финала:
корректная команда (для данного ЦП), не запрещенная в данной ОС, будет выполнена;
некорректная команда в ОС защищенного режима приведет к сообщению об ошибке в пользовательской программе;
некорректная команда в ОС реального режима без корректных обработчиков исключений приведет к неопределенному состоянию машины.
Попробуем сложить значение двух 32-битных регистров. Для этого воспользуемся следующей программой из трех команд:
смещение код операции мнемоника команды
00000000: 66B804000000 mov eax,00000004
00000006: 66BB08000000 mov ebx,00000008
0000000C: 6601D8 add eax,ebx
Эта программа заносит в регистры EAX и EBX числа 00000004 и 00000008, после чего складывает их. Результат — 0000000C — будет помещен в регистр EAX.
Так как ввести эту программа в мнемонической записи в DEBUG невозможно, введем ее цифровое представление:
-e 100
159C:0100 B8.66 03.b8 00.4 00.0 00.0 BB.0 05.66 00.bb
159C:0108 00.8 00.0 01.0 D8.0 BB.66 22.1 00.d8 BA.
Попробуем просмотреть дамп в виде команд:
-u 100
159C:0100 66 DB 66
159C:0101 B80400 MOV AX,0004
159C:0104 0000 ADD [BX+SI],AL
159C:0106 66 DB 66
159C:0107 BB0800 MOV BX,0008
159C:010A 0000 ADD [BX+SI],AL
159C:010C 66 DB 66
159C:010D 01D8 ADD AX,BX
159C:010F BA0100 MOV DX,0001
159C:0112 BF0100 MOV DI,0001
159C:0115 CD21 INT 21
159C:0117 7250 JB 0169
159C:0119 8BD8 MOV BX,AX
159C:011B B83400 MOV AX,0034
159C:011E 8B15 MOV DX,[DI]
Как видно, DEBUG не смог расшифровать (дизассемблировать) команды 32-битной арифметики. Но выполнить их, тем не менее, возможно:
-t =100 3
AX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=159C ES=159C SS=159C CS=159C IP=0106 NV UP EI PL NZ NA PO NC
159C:0106 66 DB 66
AX=0004 BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=159C ES=159C SS=159C CS=159C IP=010C NV UP EI PL NZ NA PO NC
159C:010C 66 DB 66
AX=000C BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=159C ES=159C SS=159C CS=159C IP=010F NV UP EI PL NZ NA PE NC
159C:010F BA0100 MOV DX,0001
-
DEBUG не умеет показывать значения регистров EAX и EBX, но регистры AX и BX являются их младшими частями, и на каждом шаге мы видели в них корректно изменяющиеся значения. Разумеется, этот пример может быть повторен на процессорах не ниже 80386.