- •Содержание
- •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. Инструкции управления процессором
- •Литература
Input I порт
load L [адрес] [диск] [первый_сектор] [число]
move M диапазон адрес
name N [путь] [список_аргументов]
output O порт байт
proceed P [=адрес] [число]
quit Q (выход)
register R [регистр]
search S диапазон список
trace T [=адрес] [значение]
unassemble U [диапазон]
write W [адрес] [диск] [первый_сектор] [число]
выделение памяти EMS XA [число страниц]
освобождение памяти EMS XD [дескриптор]
сопоставление страниц EMS XM [Lстраница] [Pстраница] [дескриптор]
вывод состояния памяти EMS XS
Итак, команда «?» — вывод справки. Вторая команда без аргументов — «q» — выход. Для ее выполнения на приглашение DEBUG наберите:
-q<enter>
здесь «-», как и выше (и в последующем), — приглашение DEBUG к диалогу. После выполнения этой команды Вы вернетесь в вызвавшую DEBUG программу, например в Norton Commander или COMMAND.COM.
6.1.2. Команды обращения к ячейкам
К этому типу команд относятся команды:
просмотр дампа памяти в шестнадцатеричном и ASCII-модифицирован-ном формате — «d»;
редактирование памяти в шестнадцатеричном формате — «e»;
просмотр дамба памяти в формате команд МП 8086, 8088 — «u»;
ввод данных в формате команд МП 8086, 8088 — «a».
Для просмотра дампа (фрагмента) памяти введите команду «d»:
-d [адрес1 или смещение1] [адрес2 или смещение2] <enter>
Будет выведен дамп памяти от адреса1 или смещения1 до адреса2 или смещения2. Пропуск адреса1 и смещения1 говорит о том, что нужно выводить от последнего, выведенного командой d адреса; пропуск адреса2 и смещения2 что нужно вывести 8 строк (128 ячеек) дампа.
Если в любой позиции указано вместо адреса только смещения, номер сегмента будет взят из регистра DS.
Мы нигде в примерах не будем задавать номера сегментов, так как в начале работы DEBUG установит во всех сегментных регистрах номера свободных сегментов.
Дамп состоит из трех колонок: в первой колонке указывается номер сегмента и смещение в сегменте, во второй — данные в шестнадцатеричном формате, в третьей — данные в ASCII- модифицированном формате (вид символа зависит от того, как он описан в знакогенераторе дисплея), т. е. если у Вас, например, загружен русификатор дисплея — кодировка будет соответствовать т.н. «расширенной таблице ASCII», при отсутствии какого-либо внешнего драйвера на машинах западной сборки Вы увидите классическую ASCII и т.д., кроме того, DEBUG выводит только символы с кодами от 32 до 127, прочие заменяет точками. Таким образом, Вы увидите лишь специальные символы, цифры и все латинские буквы. Русские буквы и прочее будет заменено на точки.
Например, распечатать значения 128 ячеек сегмента, на который указывает DS со смещениями от 100:
-d 100 <enter>
159B:0100 FC 80 3E E7 04 00 75 03-E9 9A 00 BE E7 04 E8 41 ..>...u........A
159B:0110 02 80 3E 3C 04 00 74 6A-2E A1 2D E4 34 00 8A 15 ..><..tj..-.4...
159B:0120 01 00 BF 01 00 CD 21 72-50 8B D8 B8 00 44 CD 21 ......!rP....D.!
159B:0130 F6 C2 80 75 68 B8 02 42-B9 FF FF 8B D1 CD 21 0E ...uh..B......!.
159B:0140 1F B8 00 3F B9 01 00 BA-0D D5 CD 21 72 2B 3B C1 ...?.......!r+;.
159B:0150 75 17 80 3E 0D D5 1A 8E-1E 3A D0 75 40 B8 01 42 u..>.....:.u@..B
159B:0160 B9 FF FF 8B D1 CD 21 EB-34 2E 8E 1E 3A D0 B8 00 ......!.4...:...
159B:0170 42 33 C9 8B D1 CD 21 EB-24 3D 05 00 F9 75 03 E9 B3....!.$=...u..
Распечатать значения ячеек сегмента, на который указывает DS со смещениями от 100 до 120:
-d 100 120
159C:0100 66 B8 04 00 00 00 66 BB-08 00 00 00 66 01 D8 BA f.....f.....f...
159C:0110 01 00 BF 01 00 CD 21 72-50 8B D8 B8 34 00 8B 15 ......!rP...4...
159C:0120 F6 .
-
Распечатать значения ячеек 2732 сегмента со смещениями от 2FF9 до 3005:
-d 2732:2ff9 3005
2732:2FF0 00 00 00 00 00 00 00 .......
2732:3000 00 00 00 00 00 00 ......
-
Команда «e» позволяет вводить значения в память в шестнадцатеричном формате. Формат команды:
e <адрес или смещение> [новые значения, разделенные пробелами] <enter>
Существует два варианта ввода значений:
1. Введите команду:
e <адрес или смещение> <enter>
DEBUG выдаст следующее:
1002:0100 20.
Здесь в первой колонке указан сегмент и смещение редактируемой ячейки, затем, отделенное пробелом, старое значение ячейки.
Далее Вы можете:
модифицировать старое значение, вводя шестнадцатеричные цифры (не более двух), завершив это нажатием <enter> для выхода из редактирования или нажатием <space> для перехода к следующей ячейке;
не модифицировать старое значение, нажав <enter> или <space>.
2. Введите команду:
e <адрес или смещение> <новые значения, разделенные пробелом> <enter>
При этом по указанному и последующим адресам будут занесены новые значения. В обоих случаях при указании в позиции <адрес или смещение> только смещения номер сегмента будет взят из DS.
Команда «u» позволяет выдать содержимое памяти в формате команд МП 8086, 8088. Например: вывести значения ячеек сегмента DS со смещением от 100 (примерно 15 строк):
-u 100
15D0:0100 83E71F AND DI,+1F
15D0:0103 81C79600 ADD DI,0096
15D0:0107 80FC39 CMP AH,39
15D0:010A 7303 JNB 010F