- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •1. Введение для кого написано это учебное пособие.
- •2. Предварительные сведения или азы, которые необходимо знать!
- •2.1. Ассемблер, что это такое?
- •2.2. Как писать ассемблерную программу, и какие программы нужны для ее последующей трансляции.
- •2.3. Системы счисления
- •2.4. Оперативная память.
- •2.5. Стек
- •Сегментация памяти.
- •Программная модель процессора.
- •Система команд.
- •Inc word ptr [bx]
- •2.9 Выделение памяти под переменные и массивы
- •2.10 Exe и com программы
- •2.11 Трансляция ассемблерной программы
- •Passes: 1
- •Примеры программирования на ассемблере.
- •3.1. Наша первая программа.
- •3.2. Работа с клавиатурой и экраном.
- •Прерывания dos для работы с клавиатурой.
- •Функция 7 прерывания int 21h
- •Функция 6 прерывания int 21h.
- •Функция 0ah прерывания int 21h.
- •Прерывания bios для работы с клавиатурой
- •1. Функция 0 прерывания int 16h
- •Входные параметры: нет
- •2. Функция 1 прерывание int 16h
- •Входные параметры: нет
- •Прерывания dos для работы с экраном
- •1. Функция 2 прерывания int 21h
- •2. Функция 9 прерывание int 21h
- •Прерывания bios для работы с экраном
- •Функция 1 прерывание int 10h
- •Функция 2 прерывание int 10h
- •Функция 3 прерывание int 10h
- •Функция 6 прерывание int 10h
- •Функция 9 прерывание int 10h
- •Функция 0eh прерывания int 10h
- •Задания к лабораторной работе «Клавиатура и экран»
- •Работа с гибкими дисками.
- •Inc nomber
- •3.4. Перехват прерываний и создание резидентных программ
- •Inst: mov ah, 9
- •Inst: mov ah,9
- •3.5. Работа со звуком.
- •Отладка программ.
- •Приложение
- •Сервисные прерывания dos.
- •Сервисные прерывания bios.
- •Int 10h, функция 07h. Инициализация или прокрутка окна вниз.
- •Int 10h, функция 08h. Чтение символа и атрибута в позиции курсора.
- •Int 10h, функция 09h. Запись символа и атрибута в позицию курсора.
- •Int 10h, функция 0ah. Запись символа в позицию курсора.
- •Int 10h, функция 0eh. Запись символа в режиме телетайпа.
- •Int 10h, функция 10h, подфункция 03h. Переключение бита «мерцание/яркость».
- •Int 10h, функция 13h. Запись строки в режиме телетайпа.
- •Int 15h, функция 86h. Программная задержка на заданное число микросекунд.
- •Int 16h, функция 00h (10h). Чтение символа с клавиатуры.
- •Int 16h, функция 01h (11h). Чтение символа с клавиатуры.
- •Int 16h, функция 02h (12h). Получение статуса клавиатуры.
- •Int 1ah, функция 0h. Число тиков таймера.
- •Коэффициенты пересчета для нот
- •Значение цветов в байте атрибута
- •Буфер клавиатуры.
- •Литература
- •7. Содержание
Отладка программ.
Очень часто при написании ассемблерных программ приходится сталкиваться с ситуацией, когда программа работает не так, как нам этого хочется. Найти при этом ошибку в алгоритме или его реализации никак не удается. В этом случае приходится привлекать к работе специальную программу, называемую отладчиком. Отладчик позволяет выполнить нашу программу в «пошаговом режиме», команда за командой, причем после выполнения любой команды мы можем следить, как меняется информация в памяти, в стеке, в регистрах и на экране. Это дает возможность локализовать ошибку и, в дальнейшем, ее устранить.
Существует много различных отладчиков, однако программисты чаще всего используют отладчик td.exe (Turbo Debugger). Именно на нем мы и остановимся. Этот отладчик предоставляет программисту мощный инструментарий для отладки ассемблерных программ. Мы не будем здесь описывать весь этот инструментарий, а ограничимся минимальным набором, достаточным для начинающего программиста.
Turbo Debugger позволяет производить отладку программ в двух режимах: режим Module и режим CPU. Программист выбирает конкретный режим в зависимости от своих привычек. Авторы предпочитают режим CPU, именно его мы и опишем. Обычно, когда мы попадаем в Turbo Debugger окно CPU (оно светло зеленое) уже открыто. Если это не так, зайдите в меню View и выберите в нем пункт CPU.
Окно CPU состоит из пяти подокон, как показано на рис. 4.1.
-
окно программы
окно регистров
окно флагов
окно данных
окно стека
Рис. 4.1
В окне программы располагается отлаживаемая программа. Окно регистров и окно флагов отображает текущее состояние регистров и флагов. Окно стека показывает содержимое вершины стека и близлежащих ячеек памяти. В окне данных отображается текущее состояние какой-то области памяти. Все числа во всех окнах, кроме окна флагов, выводятся в шестнадцатеричной системе.
Окно, в котором в настоящий момент находится курсор, является активным. Перемещать курсор между окнами, меняя тем самым активное окно, можно, например, с помощью клавиши TAB. Внутри любого окна можно перемещаться (перемещать курсор) с помощью клавиш – стрелок, PgUp и PgDn. Увеличить (уменьшить) размер окон можно с помощью клавиши F5. Для активного окна можно вызвать контекстное меню, нажав ALT – F10.
Сама отладка программы (ее пошаговое выполнение) производится, когда активным является окно программы. При этом нажатие клавиши F8 или F7 приводит к выполнению одной очередной команды. Выполниться при этом необязательно та команда, на которой стоит курсор. Очередной командой, которая и будет выполнена, является команда, на которую указывает пара cs:ip (содержимое этих регистров отражено в окне регистров). Разница между клавишами F7 и F8 заключается в обработке таких команд как loop (цикл), call (вызов подпрограммы) и int n (вызов обработчика прерывания). При нажатии F8 весь цикл (или подпрограмма, или…) выполняется как одна единственная команда, то есть мы не попадаем внутрь цикла, подпрограммы или обработчика, а вот по клавише F7 мы туда попадаем и выполняем цикл или подпрограмму пошагово (даже если после этого мы жмем F8). Рекомендуем всегда использовать клавишу F8, а клавишей F7 пользоваться, только если надо посмотреть что происходит внутри цикла или подпрограммы. Не советуем нажимать F7 на командах int n, Вы попадете внутрь обработчика (который написан не Вами и ничего полезного Вам не даст) и вряд ли оттуда выберетесь.
Иногда нам надо посмотреть, что происходит при выполнении конкретной команды программы. Если при этом выполнять все предыдущие команды пошагово, это может занять слишком много времени. Установите курсор на нужную команду и нажмите F4, все команды программы, предваряющие интересующую нас команду, будут выполнены, а далее можно жать F8.
Часто при отладке необходимо посмотреть, а что наша программа вывела на экран или где находится курсор. Мы можем в любой момент увидеть текущее состояние экрана, нажав ALT – F5.
Иногда нужно вручную изменить содержимое некоторого регистра. Сделайте активным окно регистров (клавишей TAB), установите курсор на нужный регистр и начинайте набирать новое содержимое. На экране автоматически появится окно (Enter new value), в которое Вы введете нужную информацию, после чего жмите ENTER. Не забудьте, информация вводится в шестнадцатеричной форме и если вводимое число начинается с буквы, перед буквой должен быть введен ноль.
Исходно в окне регистров отображается содержимое 16 разрядных регистров (ax, cx,…). А что если мы работаем с 32 разрядными регистрами (eax, ecx, …), как посмотреть их содержимое? Переходим в окно регистров (TAB), вызываем контекстное меню (ALT – F10), находим в нем пункт Registers 32 - bit No, подгоняем на него курсор и жмем ENTER.
Если надо вручную поменять значение какого-то флага, переходим в окно флагов, устанавливаем курсор на нужный флаг и жмем ENTER.
Очень часто в окне данных высвечивается совсем не та информация, которая нас интересует (хотим наблюдать, как меняются значения наших переменных, а отладчик показывает нам начальную область PSP). Переходим в окно данных, вызываем контекстное меню (ALT – F10), выбираем в нем пункт Go To, появляется окно (Enter address to position to), в которое мы вводим ds:100h (для СОМ программы) или ds:0 (для EXE программы). После чего жмем ENTER. Отметим, что для EXE программы данную операцию надо делать, после того как ds настроен на начало сегмента данных, то есть после выполнения команд
mov ax, data
mov ds, ax
Изменить вручную значение любого байта в окне данных можно, например, следующим образом. Переходим в окно данных, устанавливаем курсор на нужном байте, начинаем вводить новое значение. Появляется окно Enter new data bytes. Вводим в это окно нужное число и жмем ENTER. Не забудьте, информация вводится в шестнадцатеричной форме и если вводимое число начинается с буквы, перед буквой должен быть введен ноль.
Вот, собственно говоря, и все. Теперь у Вас в распоряжении имеется минимальный инструментарий, с помощью которого можно вполне успешно производить отладку программ.
Остался неосвещенным только один важный вопрос: а как загрузить в отладчик нашу СОМ (или EXE) программу? Проще всего поступить следующим образом. Поместить отладчик и нашу программу (пусть, для определенности, она называется lab1.com) в одну директорию, а затем набрать в командной строке:
td.exe laba1.com
после чего нажать ENTER. Выполнив эти действия, мы попадаем в Turbo Debugger, причем наша программа уже загружена в окно программы. Кроме того, на экране, скорее всего, мы увидим надпись Program has no symbol table. Не обращайте на нее внимания, жмите ESC и можете выполнять отладку программы.