- •Применение системных функций в задачах программирования
- •Содержание
- •Использование программы dos debug для отладки и тестирования программ.
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Команды debug
- •2.2. Основные особенности программы debug.
- •2.2.1. Команда d (Display - показать) в программе debug
- •2.2.2. Упражнение 1: просмотр области данных bios
- •2.2.3. Проверка параллельных и последовательных портов
- •2.2.4. Проверка оборудования системы
- •2.2.5. Проверка состояния регистра клавиатуры (клавиша Shift)
- •2.2.6. Проверка состояния видеоустройства
- •2.2.7. Упражнение 2: Просмотр rom bios
- •2.2.8. Проверка даты производства bios
- •2.2.9. Упражнение 3: Использование непосредственных данных
- •2.2.10. Ввод инструкций программы
- •2.2.11. Выполнение инструкций программы
- •2.2.12. Просмотр содержимого памяти
- •2.2.13. Использование ранее определенных данных
- •2.2.14. Ввод инструкций и данных программы
- •2.2.15. Выполнение инструкций программы
- •2.2.16. Повторное выполнение инструкций
- •2.2.17. Сохранение программы в debug
- •2.2.18. Программа на языке Ассемблера
- •2.2.18.1. Команда a (Assemble)
- •2.2.18.2. Команда u
- •2.2.19.Использование инструкции int
- •2.2.20. Получение текущих значений даты и времени
- •2.2.21. Определение установленного оборудования
- •2.2.22. Использование int для вывода на дисплей
- •2.2.23. Использование int для ввода с клавиатуры
- •2.2.24. Использование оператора ptr
- •3. Порядок выполнения работы
- •4. Требования к отчету
- •5. Контрольные вопросы
- •Управление выводом текстовой информации на экран
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Текстовой (алфавитно-цифровой) режим
- •2.2. Вывод на экран средствами bios
- •2.2.1. Установка позиции курсора
- •2.2.2. Чтение текущей позиции курсора
- •2.2.3. Выбор активной страницы
- •2.3.4. Прокрутка экрана вверх
- •2.2.5. Прокрутка экрана вниз
- •2.2.6. Чтение символа и атрибута в текущей позиции курсора
- •2.2.7. Вывод символа и атрибута в текущую позицию курсора
- •2.2.8. Вывод символа в текущую позицию курсора
- •2.2.9. Вывод в режиме телетайпа
- •2.2.10. Выделение мерцанием и яркостью
- •2.2.11. Вывод символьной строки
- •2.2.12. Вывод символьной строки средствами dos
- •2.2.13. Вывод символов таблицы ascii
- •3. Порядок выполнения работы
- •4. Требования к отчету
- •5. Контрольные вопросы
- •Системные средства для вывода информации на экран в графическом режиме
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Режим средней разрешающей способности
- •2.2. Функции прерывания bios int 10h для графики
- •2.3. Вывод в цветном графическом режиме
- •3. Порядок выполнения работы
- •4 Требования к отчету
- •5. Контрольные вопросы
- •Программирование системных функций bios и dos для работы с клавиатурой
- •2.2.1.2. Справка о наличии символа
- •2.2.1.3 Определение текущего состояния клавиатуры
- •2.2.2 Системные функции dos для работы с клавиатурой
- •2.2.2.1 Ввод с клавиатуры с эхоотображением
- •2.2.2.2 Ввод символа без ожидания
- •2.2.2.3. Прямой ввод с клавиатуры без эхо
- •2.2.2.4. Проверка состояния клавиатуры
- •2.2.2.5. Получение строки символов
- •2.2.2.6. Очистка буфера клавиатуры и ввод символа
- •2.2.2.7. Установка позиции курсора
- •2.2.2.8. Очистка экрана
- •3. Порядок выполнения работы
- •4. Требования к отчету
- •5. Контрольные вопросы
- •Список литературы
- •Программа debug
- •I (Input)
- •Трансляция и компоновка программ
- •Применение системных функций в задачах программирования
- •450000, Уфа-центр, ул. К. Маркса, 12
I (Input)
Считывает и выводит на дисплей один байт из порта. Формат команды
I <адрес_порта>.
L(Load)
Загружает файл или данные из секторов диска в память. Файл можно указать одним из двух способов: указав имя файла в качестве аргумента при запуске DEBUG, или из запущенного DEBUG командой N (Name). Существует два формата команды L.
1. Загрузка уже указанного файла: l [<адрес>]. Параметр адрес указывает, по какому адресу загрузить в память файл. Если адрес не указан, файл загружается, начиная с адреса CS:100H. Чтобы загрузить файл, не указанный при запуске DEBUG, его необходимо предварительно указать (смотрите команду N):
N <имя_файла> ;Указать файл .
L ;Загрузить указанный файл, начиная с адреса CS:100H
Чтобы повторно загрузить файл, просто задайте команду L вновь, не указывая адреса. DEBUG вновь считает файл с диска и соответственно проинициализирует регистры.
2. Загрузка данных из секторов диска:
L [<адрес> [<диск> <начало> <количество>]].
-
Адрес указывает адрес в памяти, начиная с которого будут размещаться прочитанные данные (по умолчанию это адрес CS: 100).
-
Диск указывает номер диска (0 – А, 1 – В и т.д.).
-
Начало указывает шестнадцатеричный номер первого сектора, который нужно прочитать (относительному сектору 0 соответствует цилиндр 1, дорожка 0,сектор 1).
-
Количество - это шестнадцатеричное число, указывающее, сколько следующих друг за другом секторов нужно прочитать.
Приведенный ниже пример загружает в память, начиная с адреса CS:100, 15Н секторов, начиная с сектора 20Н, с диска А:
L 100 0 20 15
Команда L возвращает в пару регистров ВХ:СХ число прочитанных байтов. Для файла типа .EXE DEBUG игнорирует любой указанный адрес и использует адрес загрузки из ЕХЕ-заголовка. Он также стирает из памяти заголовок; чтобы сохранить его, перед вызовом DEBUG переименуйте файл, присвоив ему другое расширение.
М (Move)
Перемещает (точнее, копирует) содержимое ячеек памяти. По умолчанию используется регистр DS. Команду можно использовать, указывая длину или диапазон.
1. М <началъный_адрес> L<длина> <адрес_назначения>.
Пример:
М DS:50 L100 DS:400 ;Перемещаем фрагмент длиной 100Н байтов
2. М <начальный_адрес> <конечный_адрес> <адрес_назначения>.
Пример:
М DS:50 150 DS:400 ;Перемещаем байты с DS:50H no DS:150H
Обе команды выполняют одни и те же действия – перемещают байты с адресами от DS:050H до DS:150H по адресу DS:400H.
N (Name)
Задает имя программы или файла, которые нужно прочитать с диска или записать на диск. Команда используется как n <имя_файла>, например
N С:\SAM.COM
Операция сохраняет введенное имя по адресу CS:80H в PSP. Первый байт (по адресу CS:80H) содержит длину (0АН), за ним следует пробел и имя файла. Для чтения файла используется команда L (Load), для записи – W (Write).
О (Output)
Посылает байт в порт, указанный в команде в виде о <адрес_порта> <байт>.
Р (Proceed)
Выполняет инструкцию CALL, LOOP, INT или повторяемую строковую инструкцию (с префиксами REPnn), переходя к следующей инструкции. Формат команды P [=<адрес] [<значение>], где = адрес –- необязательный адрес начала, а значение – необязательное количество инструкций, которые нужно выполнить. Если адрес не указывается, используется текущий адрес из пары CS:IP, а если не указано значение, выполняется одна инструкция. Например, если нужно выполнить обработчик прерывания INT 10H, введите Р, и он выполнится вплоть до следующей инструкции в вашей программе. Смотрите также команды G и Т.
Q(Quit)
Завершает сеанс работы DEBUG. Операция не сохраняет файлы; для этого необходимо применять команду W.
R (Register)
Выводит на дисплей содержимое регистров и следующую инструкцию. Формат команды r [<имя_регистра>]. Вот примеры ее использования.
R Вывести значения из всех регистров.
R DX Вывести значение DX; DEBUG предоставит вам возможность нажать <Enter>, чтобы оставить содержимое регистра неизменным, или ввести от одной до четырех шестнадцатеричных цифр, которые будут записаны в DX.
R IP Вывести значение IP; можно ввести другое значение с клавиатуры.
R F Вывести состояние флагов; в начале этого приложения приведена таблица, содержащая расшифровку сокращений.
S (Search)
Ищет в памяти символы из списка. Если символы найдены, будет выведен их адрес, если нет - операция не выдаст никакого результата. По умолчанию используется регистр DS. Команду можно использовать, указывая длину или диапазон:
1. S <начальный адрес <длина> '<данные>'.
Например:
S 300 L2000 'VIRUS'
Эта команда будет искать строку "VIRUS" в 2000Н байтах, начиная с адреса DS:300H.
2. S <начальный адрес> <конечный адрес> '<данные>'.
Например:
S CS:100 400 51
Эта команда ищет символ с ASCII-кодом 51Н в байтах от CS:100H до CS:400H.
Т (Trace)
Пошагово выполняет программу. Для выполнения обработчиков прерываний INT лучше пользоваться командой Р (Proceed). По умолчанию используется пара регистров CS:IP. Формат команды T [=<адрес>] [<значение>]. Необязательный операнд =adpec указывает DEBUG, откуда начинать пошаговое выполнение, а значение – количество команд, которые необходимо выполнить. Если операнды отсутствуют, DEBUG выполняет одну инструкцию и выводит на дисплей значения из регистров. Вот два примера использования этой команды:
Т ;Выполнить одну следующую инструкцию
Т 10 ;Выполнить следующие 10Н (16) инструкций
Команда Т будет пытаться выполнить что угодно, и если по указанному адресу будет находиться непригодный к исполнению код, процессор может войти в состояние останова, после чего придется перезагружать компьютер.
U (Unassemble)
Дизассемблирует машинный код, то есть преобразует его в соответствующие символьные инструкции ассемблера. По умолчанию используются регистры CS:IP, а формат команды следующий:
U [<начальный_адрес>]
или
U [<начальный_адрес> <конечный_адрес>]
Указанная область памяти должна содержать корректный машинный код, и команда отобразит его в виде символьных инструкций. Вот три примера:
U 100 ;Дизассемблировать 32 байта, начиная с адреса CS:100
U ;Дизассемблировать 32 байта, начиная с адреса, на
;котором закончилась последняя команда U, если она была
U 100 140 ;Дизассемблировать команды из адресов от СS:100 до CS:140
DEBUG некорректно дизассемблирует некоторые инструкции условных переходов и инструкции, специфичные для процессоров 80286 и последующих, но они все равно выполняются корректно, хотя DEBUG и представляет их как выражения DB.
W (Write)
Записывает файл из DEBUG. Необходимо заранее задать имя файла (командой N), если он не был загружен. По умолчанию используется регистр CS. Формат команды
W [<адрес> [<диск> <начальный_сектор> <число_секторов>]]
Программы можно записывать только в виде файлов .СОМ. Чтобы изменить программу типа .ЕХЕ, необходимо временно изменить ее расширение. Записывать файлы из DEBUG можно в двух случаях.
1. Прочитав с диска существующую программу, необходимо изменить ее, а затем сохранить. Для этого выполните следующие действия.
• Загрузите программу на машинном языке в память под ее именем: DEBUG <имя файла>.
• С помощью команд D просмотрите программу, и с помощью команд Е внесите изменения.
• Командой W запишите на диск измененную программу.
2. С помощью DEBUG можно написать маленькую программу в машинных кодах и затем сохранить. Для этого необходимо следующее.
-
Используя команды A (Assemble) и Е, введите требуемые инструкции.
-
Введите имя программы командой N <имя.сом>. Расширение файла обязательно должно быть .СОМ.
-
Поскольку только вам известна длина всей программы, введите длину в байтах в пару регистров ВХ:СХ.
Рассмотрим такой пример:
хххх:0100 MOV CL,42
хххх:0102 MOV DL,2A
хххх:0104 ADD CL,DL
хххх:0106 JMP 100
Хотя вводятся символьные инструкции, DEBUG преобразует их в машинный код, и именно машинный код будет записан в файл. Поскольку длина последней инструкции, JMP 100, составляет два байта, размер программы равен 8 байтам (от 100Н до 107Н включительно).
-
С помощью команды R ВХ просмотрите значение в ВХ и введите 0, чтобы очистить его.
-
Командой R СХ просмотрите содержимое СХ. DEBUG выведет значение СХ на дисплей и запросит новое. Введите размер программы, 8.
-
Введите команду W <Enter>, чтобы записать программу на диск.
DEBUG выведет сообщение "Writing 8 bytes." Если указано число 0, возможно, вы некорректно ввели длину программы – попытайтесь еще раз. Внимательно определяйте размер программы, поскольку значение должно быть шестнадцатеричным, и последняя инструкция может быть длиннее одного байта. Размер программы можно определить, вычтя 100Н из смещения, показанного DEBUG после ввода последней команды программы и нажатия <Enter>. Например, в рассматриваемом примере после инструкции JMP 100 DEBUG выведет адрес хххх:0108. Значит, размер программы равен 108Н - 100Н = 8 байт.
Приложение 2