
- •В.А. Афанасьев
- •Часть 1 Лабораторный практикум
- •Предисловие
- •1. Краткая характеристика операционной среды ms-dos в компьютерах с операционной системой Windows
- •2. Составные части ms-dos и её инициализация
- •3. Взаимодействие Ассемблерной программы с ms-dos и аппаратными средствами Компьютера
- •4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде ms-dos
- •Распределение первого мегабайта памяти компьютера
- •Содержание некоторых полей области данных bios
- •5. Программная модель 32-разрядных процессоров i80x86
- •Назначения сегментных регистров
- •6.2.2. Путь выполнения команды
- •6.2.3. Трансляция программы. Опции командной строки
- •6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •Сегменты упрощенной модели памяти Small
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •6.2.5. Работа с отладчиком Turbo Debugger (td)
- •6.2.6. Форматы машинных команд и их кодирование
- •Определение эффективного адреса
- •Косвенные виды адресации
- •6.2.6.2. Использование 32-битных регистров
- •6.2.7. Работа над синтаксическими ошибками при ассемблировании программы
- •6.3. Задание к работе. Порядок выполнения
- •6.4. Контрольные вопросы
- •Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
- •Машинные коды команд базового процессора i8086
- •П.1.2. Демонстрационные файлы
- •П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
- •А) Листинг prog_com. Lst
- •Содержимое префикса программы psp
- •А) Листинг prog_exe.Lst
- •Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
- •Формат заголовка исполняемого .Exe – файла на диске
- •7.2.2. Ввод с клавиатуры символьной информации
- •7.2.2.1. Буфер ввода данных с клавиатуры
- •7.2.2.2. Системные функции dos ввода данных с клавиатуры
- •Сравнительная характеристика функций dos ввода с клавиатуры
- •7.2.3. Функции dos вывода данных на экран
- •7.2.4. Расширенные коды ascii и управление программой с клавиатуры
- •Расширенные коды для функциональных клавиш
- •7.2.5. Строковые команды. Общая характеристика
- •Команды обработки строк
- •7.3. Задания к работе. Подготовка и выполнение
- •7.4. Контрольные вопросы
- •Приложения к лабораторной работе № 2 Приложение п.2.1. Примеры реализаций типового задания
- •Приложение п.2.2. Esc-последовательности
- •Параметры Esc-последовательности
- •Приложение п.2.3. Таблица символов в кодировке ascii
- •8.2.2. Прямое программирование видеобуфера в текстовом режиме
- •8.2.3. Справочные данные по функциям bios
- •8.2.3.1. Прерывание int 10h. Видеофункции bios
- •Текстовые видеорежимы и страницы в стандарте vga, поддерживаемые современными видеоконтроллерами
- •8.2.3.2. Рекомендации по использованию видеосервиса bios
- •8.2.3.3. Прерывание int 16h
- •8.2.3.4. Задержка программных операций
- •Int 15h, функция 86h
- •8.3. Варианты индивидуального задания
- •8.4. Контрольные вопросы
- •Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры
- •П.3.2. Листинг 3.5. Демонстрационная программа использования функций bios для работы с экраном и клавиатурой
- •9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •Представление чисел в 16- разрядном компьютере
- •9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •9.2.4. Задание к работе. Порядок выполнения
- •Варианты заданий 1-7
- •Варианты заданий 8-14
- •9.2.5. Вопросы построения многомодульных программ
- •9.2.6. Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •9.3. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
%Title "Имя exe-файла программы"
Ideal ;Переводит Turbo Assembler в режим Ideal
Model small ;Директива описания модели памяти. Вводит упрощенные директивы
;управления сегментами
P486N ;Разрешает инструкции старших поколений процессоров. При её
;отсутствии действует по умолчанию P8086. Разрешает использование
;32 – разрядных регистров для адресации и хранения данных
Stack 256 ;Резервирует пространство для стека программы (значение в байтах,
;следующее за директивой)
;1. Здесь следует располагать макроопределения EQU и =
;2. Вставьте здесь директиву Include "filename"
Dataseg ;Начало сегмента инициализированных данных. Допускается также
;расположение здесь и неинициализированных данных, начальные
;значения которых неизвестны на момент запуска программы
;1. Здесь описываются переменные с помощью директив DB,DW и т. п.
;2. Здесь опишите все переменные типа Extrn
Codeseg ;Начало сегмента кода, т.е. части программы, содержащей команды
; процессора.
;Здесь определите все подпрограммы типа Extrn
Start: mov ax, @data ;Точка начала исполнения программы
mov ds,ax ;Установка в регистре DS адреса сегмента данных
;Здесь располагается программа, вызовы подпрограмм и т. п.
Exit: mov ax,4C00h ;Функция DOS: Выход из программы
int 21h ;Вызов DOS. Останов программы
End Start ;Директива конца программы/точки входа. Текст,
;расположенный после этой строки будет игнорироваться ассемблером.
Рис. 1.1. Шаблон структуры программы типа .exe
Образ программы в памяти [Л: 4, 12, 13, 14], представленный на рис. 1.24, начинается с префикса программного сегмента PSP (Program Segment Prefix). PSP всегда имеет размер 256 байтов и содержит данные, используемые операционной системой в процессе исполнения программы. Вслед за PSP располагаются сегменты программы. Сегментные регистры es и ds автоматически инициализируются на начало PSP. Это даёт возможность, при сохранении значения одного из регистров, обращаться к PSP в случае необходимости. В указатель команд ip загружается относительный адрес точки входа в программу (операнд директивы END), а в указатель стека sp -смещение конца сегмента стека. Таким образом, после загрузки программы в память, адресуемыми являются все сегменты, кроме сегмента данных. Использование директивы Model, делает доступным ассемблеру несколько служебных идентификаторов, к которым можно обращаться во время работы программы, чтобы получить информацию об адресах используемых сегментов. Например:
@code – 16-разрядный адрес сегмента кода,
@data – 16-разрядный адрес сегмента данных типа near,
@stack – 16-разрядный адрес сегмента стека.
Объём памяти, занимаемый программой: (138B-1373)*10h+100h=280h=640 байт
Рис. 1.2. Образ программы hello.exe в памяти, загруженной командой Td hello.exe
Вот поэтому-то имя предопределённого идентификатора @data и используется в первой паре команд кодового сегмента для загрузки сегмента данных.
Завершение программы означает передачу управления командному процессору DOS – Command.com, который выводит на экран системный запрос в ожидании следующей команды от оператора. Делается это с помощью функции DOS (ah = 4Ch). Эта функция требует единственного параметра – кода возврата, который и помещается программой в регистр al. Если этот код равен нулю, то исполнение программы прошло корректно, в противном случае была допущена ошибка в предшествующих обращениях программы к другим системным функциям DOS.
В некоторых случаях для создания компактных программ (прежде всего это резидентные программы) бывает удобным не дробить программу на отдельные сегменты. Этой цели в наибольшей мере отвечают программы типа .com, которые состоят лишь из одного сегмента, включающего все компоненты программы.
Шаблон программы типа .com приведён на рис. 1.3. При компоновке программы необходимо использовать опцию /t, которая указывает на создание файла .com вместо .exe.
Образ памяти программы типа .com показан на рис. 1.4. После загрузки программы в память все 4 сегментных регистра указывают на начало единственного сегмента – PSP. Указатель стека автоматически инициализируется числом 0FFFEh. Таким образом, независимо от фактического размера программы, ей выделяется 64 Кбайт адресного пространства, нижнюю часть которого занимает стек.