- •Содержание
- •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.9. Получение выполняемого файла
Следующим этапом после завершения написания программы (ее кодирования), является этап ассемблирования и выполнения. То есть необходимо перевести программу, написанную на языке ассемблера, в последовательность инструкций, понимаемых процессором.
У существующих реализаций ассемблера нет интегрированной среды, подобной интегрированным средам Turbo Pascal или Visual C++. Для ввода кода программы, ее трансляции и отладки необходимо использовать отдельные служебные программы.
Рассмотрим работу с пакетом ассемблера фирмы Borland — TASM 3.0 или выше. На этапе трансляции программы формируется объектный модуль, который включает в себя представление исходной программы в машинных кодах и некоторую другую информацию, необходимую для отладки и компоновки его с другими модулями. Формат командной строки для запуска TASM.EXE следующий:
TASM [опции] имя_исходного_файла [, имя_объектного файла] [,имя_файла_листинга] [,имя_файла_пререкрестных_ссылок]
Получить справку о формате командной строки и значениях параметров можно, запустив tasm.exe без аргументов. Командная строка запишется:
TASM.ЕХЕ prog1.asm, prog1.obj, prog1.lst, prog1.crf
Обязательным аргументом командной строки является только имя_ исходного_файла. Если последующие аргументы не заданы, то соответствующие файлы не будут созданы. Если имена файлов листинга, объектного и перекрестных ссылок совпадают с именем исходного файла, то нужно просто поставить запятые вместо имен этих файлов, и они будут созданы по умолчанию:
tasm.exe prg_1 , , , ,
Если имена не должны совпадать, то нужно явно указать имена соответствующих файлов:
tasm.exe prоg1 , ,prg_lst, ,
Будут созданы файлы prg_1.obj, prg_lst.lst, prg_1.crf.
При необходимости выборочного созданий файлов вместо ненужных файлов необходимо подставить параметр «nul».
После того, как вы ввели программу, необходимо ее оттранслировать. В результате на экране вы получите последовательность строк. Самая первая из них будет информировать вас о номере версии пакета TASM, который использовался для трансляции. Далее идет строка, содержащая имя транслируемой программы. Если ваша программа содержит ошибки, то транслятор выдаст на экран строки сообщений, начинающиеся словами «Error» и «Warning».
Наличие строки с «Error» говорит о том, что у вас в программе есть недопустимая, с точки зрения синтаксиса, комбинация символов. Наличие строки «Warning» означает, что конструкция синтаксически правильна, но не соответствует некоторым соглашениям языка, и это может послужить источником последующих ошибок.
Для устранения ошибки необходимо определить место ее возникновения и проанализировать ситуацию. Место ошибки легко определяется по значению в скобках в сообщении об ошибке. В них указывается номер строки, содержащей ошибку. Запомнив его, необходимо перейти в файл с исходной программой и по номеру строки найти ошибку.
Вторым способом определения места возникновения ошибки является использование информации из создаваемого транслятором файла листинга. Этот файл имеет расширение *.lst .
Ниже приведен файл листинга для написанной выше программы.
[файл листинга]
Файл листинга содержит код ассемблера исходной программы. Для каждой команды указывается ее машинный код и смещение в кодовом сегменте. В конце листинга формируются таблицы, которые содержат информацию о метках и сегментах, используемых в программе. Если есть ошибки или сомнительные участки кода, то сообщения о них включаются в конец листинга. Эти же сообщения включаются в текст листинга непосредственно после ошибочной строки.
Строки в файле листинга имеют следующий формат:
<глубина_вложенности><номер_строки><смещение><маш._код><исходный_код>,
где глубина_вложенности — уровень вложенности включаемых файлов или макрокоманд в файле;
номер_строки — номер строки в файле листинга. Он не всегда совпадает с номером строки в исходном файле;
смещение смещение в байтах текущей команды относительно начала сегмента кода. Смещение вычисляет транслятор для адресации в сегменте кода;
машинный_код — машинное представление команды ассемблера, представленной в поле <исходный_код>;
исходный_код — строка кода из исходного файла.
После получения сообщения о том, что ваша программа содержит ошибки, необходимо обнаружить и исправить несколько из них, после чего перетранслировать программу. Затем приступайте к устранению следующих ошибок. Не нужно пытаться устранить все ошибки сразу, так как некоторые из них могут исчезнуть после устранения начальных ошибок.
После устранения ошибок и получения объектного модуля необходимо создать исполняемый файл или, как еще говорят, скомпоновать программу. Главная цель этого процесса — преобразование кода и данных в объектном файле в их перемещаемое выполняемое отображение. Процесс создания исполняемого модуля разбит на два шага — трансляцию и компоновку для получения возможности объединения нескольких моделей, написанных на одном или нескольких языках программирования, в единую исполняемую программу.
Формат командной строки для запуска компоновщика следующий:
TLINK [опции] список_объектных_файлов [,имя_загрузочного_модуля] [,имя_файла_карты] [,имя_файла_библиотеки],
где опции — необязательные параметры, управляющие работой компилятора;
список_объектных_файлов — обязательный параметр, содержащий список компонуемых файлов с расширением *.obj . Имена файлов должны быть разделены пробелами или знаками «+»;
имя_загрузочного_модуля — необязательный параметр, обозначающий имя целевого исполняемого файла. Если оно не указано, то имя исполняемого файла будет совпадать с именем первого указанного объектного файла;
имя_файла_карты — необязательный параметр, наличие которого обязывает компоновщик создать специальный файл с картой загрузки, в которой перечисляются имена, адреса загрузки и размеры всех сегментов, входящих в программу;
имя_файла_библиотеки — необязательный параметр, содержащий имя библиотеки. При помощи утилиты tlib.exe можно объединить часто используемые процедуры в виде объектных модулей в один файл и в дальнейшем указывать его в командной строке компоновщика.
Для получения полного списка параметров компоновщика необходимо запустить его без аргументов.
В результате получим исполняемый модуль с расширением *.exe . Однако отсутствие сообщений об ошибках на этапах трансляции и компоновки еще не гарантирует правильную и безошибочную работу программы. Поэтому обязательным этапом процесса разработки программы является отладка.
На этапе отладки выполняется контроль правильности функционирования как отдельных участков кода, так и всей программы в целом.
Для отладки программы применяется отладчик Turbo Debugger, входящий в комплект TASM.
Данный отладчик позволяет решить две главные задачи: определить место логической ошибки; определить причину логической ошибки.
К основным возможностям TD относятся: выполнение трассировки программы в прямом направлении, то есть последовательное пошаговое (по одной команде за раз) исполнение программы; выполнение трассировки в обратном направлении; просмотр и изменение состояния ресурсов микропроцессора во время покомандного выполнения программ.
Запуск программы на исполнение в отладчике возможен в одном из 4-х режимов:
режим безусловного исполнения;
выполнение по шагам;
выполнение до текущего положения курсора;
выполнение с установкой точек прерывания.
Для начала процесса отладки необходимо в качестве аргумента утилиты td.exe указать имя исполняемого модуля:
td имя_исполняемого_модуля ,
Вы попадете в рабочее окно Turbo Debugger. После отладки программ запустите ее на исполнение и получите результаты ее работы.