
- •В.А. Афанасьев
- •Часть 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. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
9.2.5. Вопросы построения многомодульных программ
Модульный подход в программировании позволяет как упростить разработку задачи, так и произвести её модернизацию в процессе эксплуатации. Кроме того, модульный подход при разработке сложных программ создаёт идеальные условия для совместной работы коллектива авторов.
Каждая из программ лабораторной работы может быть структурно разделена на следующие функционально законченные блоки (модули):
преобразование чисел с произвольным основанием (8-,10-,16-теричное), представленных в ASCII-формате, в двоичное число (в дальнейшем будем применять более короткое выражение "ASCII-число с основанием P");
преобразование двоичного числа в ASCII-число с P основанием;
вычислительный модуль или модуль преобразования введённых данных по заданному алгоритму.
Каждый такой модуль оформляется в виде подпрограммы или процедуры, допускающей автономное ассемблирование (трансляцию в объектный код). В результате после трансляции будут получены объектные модули, которые объединяются в единую многомодульную программу с помощью "системообразующего" главного модуля, по ходу исполнения которого осуществляется передача управления на обработку информации от одного модуля к другому. Укажем на три основных синтаксических отличия в организации главного модуля. Только в главном модуле выполняется:
инициализация сегмента стека директивой Stack;
инициализация сегмента данных
Start: mov ax,@data
mov ds,ax
каждый из модулей заканчивается директивой End, но только в главном модуле после этой директивы должна помещаться метка первой команды программы Start, с которой начинается её исполнение.
Исходный текст модуля должен иметь заголовок, в котором указывается:
назначение и особенности функционирования модуля;
описание входных данных;
описание выходных данных.
Все имена, описанные в модуле, локализуются в нём. Это значит, что в разных модулях программы можно пользоваться одинаковыми именами и никаких конфликтов из-за этого не будет. В то же время некоторые идентификаторы переменных или процедур могут быть общими для некоторых модулей. Через эти общие идентификаторы и осуществляется интерфейс модулей в процессе исполнения программы.
Каждый модуль может оперировать двумя типами идентификаторов: внутренними и внешними, которые определены или инициализированы в другом модуле. Все внешние имена переменных и процедур вводятся директивой
Extrn <имя>:<тип>,…,<имя >:<тип>.
Перечислим возможные значения типов.
Для переменных: byte, word, dword, … tbyte
Для числовых констант: abs (определяются через директиву присваивания =)
Для меток: near,far
Для процедур: proc
Однако, все внешние переменные (процедуры) для данного модуля, должны быть определены в каком-то другом модуле в качестве общедоступных с помощью директивы
Public <имя>, …,<имя>
В качестве примера рассмотрим структуру многомодульной программы, реализующей ввод с клавиатуры десятичного знакового числа с последующим выводом на экран соответствующего ему 16-разрядного двоичного кода и восстановленного из последнего десятичного числа. В начале приводятся вспомогательные модули, в тексте которых отражается лишь их функциональное назначение.
%Title "#dec_bin.asm"
;Модуль ввода 10-тичного ASCII- числа с последующим его преобразованием в 16- разряд-
;ный двоичный дополнительный код.
;Вход: Вводимое с клавиатуры по запросу программы ASCII-число с основанием "10" в
;диапазоне от -32768 до 32767. Число вводится старшими разрядами вперёд с вводом знака "-
;" для отрицательных чисел. Ввод числа заканчивается спецификатором d.
;Выход: АХ- 16- разрядный двоичный дополнительный код,
; CF- ошибка ввода: выход из диапазона -32768...32767, либо ввод ошибочного символа.
Ideal
Model small
Dataseg
In_buf db 8,?,8 dup(?) ;5- разрядов +"знак "+ "спецификатор "+"CR"
Codeseg
public ASCIIdec_bin
proc ASCIIdec_bin
……………..
ret
endp ASCIIdec_bin
End
%Title "Bin_#bin.asm"
;Модуль для преобразования дополнительного кода двоичного числа из рег. АХ в ASCII-
;строку двоичных символов.
;Вход: АХ- дополнительный код двоичного числа.
;Выход: АХ- дополнительный код двоичного числа,
; Буфер Bin_buf – 16 байтная ASCII- строка двоичных символов.
Ideal
Model small
Dataseg
public Bin_buf
Bin_buf DB 16 dup(?)
Codeseg
public Bin_ASCIIbin
proc Bin_ASCIIbin
……………..
endp Bin_ASCIIbin
End
%Title "Bin_#dec.asm"
;Модуль для преобразования дополнительного кода двоичного числа в ASCII- число с
;основанием "10" и спецификатором d.
;Вход: АХ- дополнительный код двоичного числа.
;Выход: АХ- дополнительный код двоичного числа,
; 7-байтный буфер Dec_buf с восстановленным из рег. АХ десятичным числом (знак +
;5цифр + спец-тор).
Ideal
Model small
Dataseg
public Dec_buf
Dec_buf db 7 dup(?) ;Буфер с пробелами
Codeseg
public Bin_ASCIIdec
proc Bin_ASCIIdec
……………….
endp Bin_ASCIIdec
End
Ниже приводится один из возможных вариантов главного модуля, использующего вышеприведённые вспомогательные модули. В программе используется простой экранный интерфейс, основанный на материале лабораторной работы № 2. Вы можете его усовершенствовать на основе использования функций BIOS. Кроме того, с целью облегчения понимания работы программы объединены в одну две различные ошибки ввода – переполнение и неправильно введённый разряд числа.
%Title"#10bin10.asm"
;Демонстрационная программа ввода и преобразования десятичных знаковых чисел
;(диапазон -32768...32767) в двоичные и их обратное восстановление. Особенности
;работы с программой регламентируются сообщениями, выводимыми программой на экран.
Ideal
Model small
Stack 256
%nomacs ;Исключить из листинга макрорасширения
Macro out_str$ mes ;Макрос вывода строки mes
……………..
Endm out_str$
Macro out_buf buf,number ;Макрос вывода содержимого buf с числом байтов
;number
……………………..
Endm out_buf
Dataseg
extrn Bin_buf:byte:16, Dec_buf:byte:7
mes1 DB 13,10,'Введите знаковое десятичное число со специфика-'
DB 13,10,'тором d в диапазоне от -32768d до 32767d: $'
mes2 DB 13,10,'Ошибка ввода: переполнение или недопустимый символ $'
mes3 DB 13,10,'Преобразованное двоичное число в дополнительном коде:$'
mes4 DB 13,10,'Восстановленное из двоичного кода десятичное число: $'
mes5 DB 13,10,'Продолжаем работу <F1>, или выходим <F10>? $'
Codeseg
extrn ASCIIdec_bin:proc, Bin_ASCIIbin:proc, Bin_ASCIIdec:proc
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных
call screen ;Очистка экрана с установкой курсора
;в левый верхний угол (см. лаб. раб. №3)
Again: out_str$ mes1 ;Вывод сообщения mes1
call ASCIIdec_bin ;Ввод десятичного числа с последующим преобразо-
;ванием его в двоичный дополнительный код
jc Abort ;Допущена ошибка при вводе?
call Bin_ASCIIbin ;Нет. Преобразовать двоичный код в ASCII- строку ;из двоичных цифр
out_str$ mes3 ;Вывод сообщения mes3
out_buf Bin_buf,16 ;Вывод на экран двоичного кода введённого числа
call Bin_ASCIIdec ;Преобразовать двоичный код в ASCII- строку из ;десятичных цифр
out_str$ mes4 ;Вывод сообщения mes4
out_buf Dec_buf,7 ;Вывод на экран восстановленного из двоичного кода ;десятичного числа
;Блок управления программой. Продолжение работы – <F1>, выход -<F10>.
…………………
Exit mov ax,4C00h ;Функция DOS 4Сh: выход из программы
int 21h ;Вызов DOS. Останов
Abort: out_str$ mes2 ;Вывод сообщения mes2
jmp Again ;Повторим ввод
END Start ;Конец программы/точка входа