- •Щемелева т.К.
- •Архитектура и программирование реального режима микропроцессоров фирмы intel
- •Учебное пособие
- •Пермь 2001
- •Содержание
- •1.2.Переводы между позиционными системами счисления
- •1.3.Система кодирования символов ascii
- •1.4. Преобразование строки ascii-кодов в двоичное и шестнадцатеричное число
- •1.5. Применение систем счисления в эвм
- •1.6. Контрольные вопросы и задания
- •Тема 2. Представление данных на языке ассемблера и их хранение в памяти пк
- •2.1. Биты, байты и слова
- •2.3. Размещение различных типов данных в памяти пк
- •2.4. Отрицательные числа
- •2.5. Контрольные вопросы и задания
- •Тема 3. Элементы архитектуры персонального компьютера: сегментная память и регистровая структура микропроцессора
- •3.1. Понятие сегмента
- •3.2. Способ адресации ячеек сегментированной памяти
- •3.4. Программистская модель мп i8086. Назначение регистров.
- •Регистры общего назначения
- •Регистры сегментов и указатель команд
- •3.5. Контрольные вопросы и задания
- •Тема 4. Создание программы в ехе-формате
- •4.1. Программы на языке транслятораMasm.
- •4.1.1. Определение сегментов и данных.
- •4.1.2. Структура программы.
- •4.2. Программы на языке транслятораTasm.
- •4.2.1. Особенности транслятора.
- •4.2.2. Определение сегментов и данных .
- •4.2.3. Директива model.
- •4.2.4. Директивы упрощенного описания сегментов.
- •4.2.5. Структура программы.
- •4.2.6. Директивы startupcode и exitcode.
- •4.3. Контрольные вопросы и задания
- •Тема 5. Способы адресации данных в командах языка ассемблер
- •5.1. Регистровая адресация
- •5.2. Непосредственная адресация.
- •5.3. Прямая адресация.
- •5.4. Косвенная регистровая.
- •5.5. Адресация по базе.
- •5.6. Индексная адресация.
- •5.7. Адресация по базе с индексированием.
- •5.8. Контрольные задания.
- •Тема 6. Основные команды языка Ассемблер
- •6.1. Команды пересылки.
- •1) Пересылка данных
- •2) Пересылка адресов
- •4) Пересылка в стек и из стека
- •6.2. Арифметические операции.
- •2) Арифметические операции над двоичными кодами.
- •3) Команда сравнения:
- •6.3. Команды корректировки.
- •6.4. Команды логических операций.
- •1) Поразрядные логические операции:
- •2) Команды сдвига
- •6.5. Команды передачи управления.
- •6.6. Команды организации цикла.
- •6.7. Команды вызова процедур и возврата из них.
- •6.8. Команды прерываний и возврата из них.
- •6.8.1. Функции ввода/выводаDos.
- •6.8.2. ФункцииBios управления экраном.
- •Тема 7. Стек
- •7.1.Стек и сегмент стека
- •7.2.Стековые команды
- •7.3. Доступ к элементам стека
- •Тема 8. Практическая работа на пк.
- •Тема 9. Создание линейных программ
- •9.1 Создание линейной программы.
- •9.1.1. Составление текста программы.
- •9.1.2 Трансляция.
- •9.1.3. Создание исполняемого файла
- •9.1.4.Отладка программы в turbo debugger’е
- •9.2. Контрольные вопросы и задания
- •Тема 10. Организация ветвлений.
- •10.1.Флаги и их назначение.
- •10.2 Команда безусловного перехода jmp
- •10.3 Команды условных переходов
- •10.4. Создание разветвленной программы.
- •10.4.1. Составление текста программы.
- •10.4.2.Трансляция.
- •10.4.3. Создание исполняемого файла.
- •10.5. Контрольные вопросы и задания
- •Тема 11. Организация циклов
- •11.1. Команды управления циклом
- •11.2.Создание циклической программы.
- •11.2.1.Составление текста программы.
- •11.2.2.Трансляция.
- •11.2.3.Создание исполняемого файла
- •11.2.4.Отладка программы в turbo debugger’е
- •11.3. Контрольные вопросы и задания
- •Тема 12. Циклическая разветвленная программа
- •12.1.Создание программы.
- •12.1.1.Составление программы
- •12.1.2.Трансляция.
- •12.1.3.Создание исполняемого файла.
- •12.1.4. Отладка программы в turbo debugger’е
- •12.2.Контрольные вопросы
- •12.3. Контрольные задания
- •Тема 13. Связь ассемблера с языкомPascal.
- •13.1 Общие положения
- •13.2 Организация связи
- •13.3 Передача аргументов (и возврат результата в случае функции)
- •13.4 ДирективаArg
- •13.5 Использование операндов директивыmodel
- •13.6 Передача данных остальных типовPascal
- •13.7 Возврат значения в программу наPascal
- •13.8 КомандыEnter иLeave
- •13.9 Итоги
- •Листинг 1.2. Ассемблерное представление.
- •Тема 16. Рекомдации начинающему программисту
- •Тема 17. Контрольная работа
- •Список литературы
- •Приложение 1 Инструкция по работе с программой Turbo Debugger.
- •Приложение 2 Практическая работа на пк
- •Приложение 3 ключи командной строкиtasmиtlink
6.8. Команды прерываний и возврата из них.
Таблица 6.3.
Мнемоника |
Формат |
Комментарий |
INT |
INT номер_прер |
Выполнить прерывание |
INTO |
INTO |
Выполнить прерывание по переполнению |
IRET |
IRET |
Вернуться из прерывания |
INT При исполнении в стек загружается содержимое регистра флагов F, затем CS, затем IP. По коду прерываний (байт) из таблицы прерываний, хранимой в ОЗУ читается полный указатель прерывающей программы, (адрес загружается в СS и IP). После этого процессор начинает исполнять вызванную программу. Обработчик прерываний всегда в качестве последней содержит команду IRET.
INTO – условное прерывание и выполняется
IRET - команда возврата из прерывающей программы в основную. После исполнения из стека возвращаются СS, IP, F; т.к. для компьютера это немного, подпрограммы каждой из этих программ указываются программистом через регистр АН. С помощью команды INT программист обращается к любым аппаратным средствам компьютера, вместо того, чтобы писать программы обращения в ПУ.
Рис. 6.2. Схема работы команды INT
6.8.1. Функции ввода/выводаDos.
Все функции DOS вызываются прерыванием 21h, при этом в AH содержится номер функции. Ниже везде, где есть слова "стандартный ввод", под ними подразумевается клавиатура, однако ввод может быть переопределен (например, из файла). Аналогично, "стандартный вывод" – экран, но вывод также может быть переопределен (например, в файл).ASCIIZ-строка (нуль-терминированная строка) – это строка символов, заканчивающаяся нулевым символом (код 00h).
Ввод символа с отображением.Прерывание 21h функция 01h. Вызов: AH=01h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) и выводит его на стандартный вывод (экран). Если ввод был перенаправлен, то невозможно обнаружить EOF.
если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Вывод символа. Прерывание 21h функция 02h. Вызов: AH=02h; DL=выводимый символ. Возвращает: ничего. Действие: выводит символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.
если Ctrl+C после вывода символа, то вызавается прерывание 23h;
если стандартный вывод не был перенаправлен, то символ Backspace (08h) перемещает курсор влево на одну позицию.
Прямой консольный ввод/вывод. Прерывание 21h функция 06h. Вызов: AH=06h; DL=действие: если DL=00h-FEh, то вывод; если DL=FFh, то ввод. Возвращает:
если вызов с DL=00h-FEh, то ничего;
если вызов с DL=FFh, то: если есть символ – ZF=0, AL=введенный символ
если нет символа – ZF=1.
Действие: используется, если нужно прочитать или записать все возможные символы и управляющие коды без действий ОС. Читает символ со стандартного ввода или записывает символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить EOF или что нет места на диске.
Никакой реакции на Ctrl+C;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Ввод символа без отображения.Прерывание 21h функция 07h. Вызов: AH=07h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.
Никакой реакции на Ctrl+C. Нужно использовать функцию 08h, если реакция требуется;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Ввод символа без отображения.Прерывание 21h функция 08h. Вызов: AH=08h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.
если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h. Нужно использовать функцию 08h, если реакции не требуется;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Вывод строки.Прерывание 21h функция 09h. Вызов: AH=09h, DS:DX=сегмент:смещение строки. Возвращает: ничего. Действие: посылает строку символов на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.
Строка должна заканчиваться на символ $(код 24h), который не выводится. Любые другие символы ASCII, включая управляющие, могут содержаться в строке. Для перевода курсора на начало новой строки нужно вывести строку, содержащую символы "перевод строки"/"возврат каретки":
string DB 10,13,'$'
или использовать прерывание 10h функцию 02h (см. 6.8.2.).
Если Ctrl+C нажата на клавиатуре, то вызывается прерывание 23h.
Буферизованный ввод с клавиатуры.Прерывание 21h функция 0Ah. Вызов: AH=0Ah, DS:DX=сегмент:смещение буфера. Возвращает: ничего. Действие: читает строку символов со стандарного ввода, до появления символа возврата каретки (0Dh) и помещает в буфер (включая завершающий 0Dh). Символы отображаются на стандартном выводе. Если ввод был перенаправлен, то невозможно обнаружить EOF.
Буфер, используемый этой функцией, имеет формат(см. табл. 6.4.):
Таблица 6.4.
Байт |
Описание |
0 |
Максимальное количество символов (устанавливается перед вызовом) |
1 |
Количество реально прочитанных символов (устанавливается функцией после ее вызова) |
2 и след. |
Прочитанная строка, заканчивающаяся 0Dh |
Если буфер заполнился (больше символов, чем максимум), последующий ввод игнорируется и подается сигнал до тех пор, пока не нажата клавиша ENTER;
Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.
Проверка состояния ввода. Прерывание 21h функция 0Bh. Вызов: AH=0Bh. Возвращает: AL=00h, если нет символа; AL=FFh, если есть один или более символовhр. Действие: проверяет, есть ли в буфере стандартного ввода символ.
Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.
Если есть символ, эта функция будет возвращать FFh, пока символ не считан функциями ввода (01h, 07h, и т.д.).
Очистка буфера и ввод. Прерывание 21h функция 0Ch. Вызов: AH=0Ch; AL=номер фунции, которая вызывается после очистки буфера; для AL=0Ah –DS:DX=сегмент:смещение буфера. Возвращает: если вызов с AL=01h, 07h, 08h то AL=прочитанный символ; если вызов с AL=0Ah, то ничего. Действие: очищает буфер стандартного ввода, затем вызывает одну из функций ввода (заданную в AL).
Реакция на Ctrl+C (игнорирует или нет) зависит от вызываемой функции;
Вызов с AL отличным от 01h, 06h, 07h, 08h, 0Ah просто очищает буфер.
Запись в файл или устройство. Прерывание 21h функция 40h. Действие: берет корректный дескриптор файла (от предыдущей операции создания или открытия файла), адрес буфера, длину в байтах, передает данные из буфера в файл и затем обновляет положение указателя в файле. Вызов: AH=40h; BX=дескриптор файла; CX=количество байт, которое надо записать; DS:DX=сегмент:смещение буфера. Возвращает: если нет ошибки: CF=0, AX=количество реально переданных байт; иначе – CF=1, AX=код ошибки.
Если CF=0, но AX<CX, то часть буфера была записана или была ошибка. Это может быть из-за символа 1Ah (Ctrl+Z) в данных, если приемник – символьное устройство в режиме обработки символов, или из-за отсутствия места на диске, если приемник – файл;
Если вызов с CX=0, то файл усекается или расширяется до текущей позиции указателя в файле;
Чтение из файла или устройства. Прерывание 21h функция 3Fh. Действие: берет корректный дескриптор файла (от предыдущей операции создания или открытия файла), адрес буфера, длину в байтах, передает данные из текущей позиции указателя в файле в буфер и затем обновляет положение указателя в файле. Вызов: AH=3Fh; BX=дескриптор файла; CX=количество байт, которое надо прочитать; DS:DX=сегмент:смещение буфера. Возвращает: если нет ошибки: CF=0, AX=количество реально переданных байт; иначе – CF=1, AX=код ошибки.
Если CF=0, но AX<CX, то часть данных была прочитана до конца файла или была ошибка;
Если CF=0, но AX=0, указатель в файле уже был в конце;
Если читали с символьного устройства (например, с клавиатуры) в режиме обработки символов, то максимум одна строка может быть прочитана (т.е. до символа 0Dh или достижения указанной длины, что встретится раньше).
Установка указателя в файле. Прерывание 21h функция 42h. Действие: Устанавливает указатель в файле относительно начала, конца, или текущей позиции. Вызов: AH=42h; AL=код метода: 00h-относительно начала файла, 01h-относительно текущей позиции, 02h-относительно конца файла; BX=дескриптор файла; CX=старшая половина смещения; DX=младшая половина смещения. Возвращает: если нет ошибки: CF=0, DX=старшая половина новой позиции; AX=младшая половина новой позиции; иначе – CF=1, AX=код ошибки.
Используется 32-битное значение смещения, чтобы установить новое значение указателя. Следующая операция записи/чтения будет производится с новой позиции указателя;
Вызов с AL=02h со значением смещения может использоваться для получения размера файла;
Используя методы 01h или 02h, можно установить указатель ДО начала файла, и ошибки не будет. Однако, при попытке записи/чтения будет зафиксирована ошибка;
Вне зависимости от метода, DX и AX всегда содержат новое положение относительно начала файла.
Создание файла. Прерывание 21h функция 3Ch. Действие: берет путь в формате ASCIIZ, создает новый файл в указанном или текущем каталоге на указанном или текущем диске. Если файл существует, он усекается до нулевой длины. В любом случае, файл открывается и возвращается дескриптор, который может быть использован для последующего доступа к файлу. Вызов: AH=3Ch; CX=атрибуты файла (биты могут комбинироваться) см. табл. 6.5; DS:DX=сегмент смещение ASCIIZ-строки:
Таблица 6.5.
-
Бит
Атрибут файла
0
только чтение
1
Скрытый
2
Системный
3
метка тома
4
зарезервирован, должен быть 0
5
Архирный
6-15
зарезервирован, должен быть 0
Возвращает: если нет ошибки: CF=0, AX=дескриптор; иначе – CF=1, AX=код ошибки.
Открытие файла. Прерывание 21h функция 3Dh. Действие: берет путь в формате ASCIIZ, открывает файл в указанном или текущем каталоге на указанном или текущем диске. Возвращается дескриптор, который может быть использован для последующего доступа к файлу. Вызов: AH=3Dh; AL=атрибуты доступа (биты могут комбинироваться) см. табл. 6.6; DS:DX=сегмент смещение ASCIIZ-строки:
Таблица 6.6
-
Бит
Атрибут файла
0-2
режим доступа:
000=чтение
001=запись
010=запись/чтение
3
Зарезервирован, должен быть 0
4-6
Режим совместного доступа (MS-DOS 3.0 и выше):
000=режим совместимости
001=запрет всего
010=запрет записи
011=запрет чтения
100=не запрещать ничего
7
Флаг наследования (MS-DOS 3.0 и выше):
0=дочерний процесс наследует дескриптор
1=дочерний процесс ненаследует дескриптор
Возвращает: если нет ошибки: CF=0, AX=дескриптор; иначе – CF=1, AX=код ошибки.
Закрытие файла. Прерывание 21h функция 3Eh. Действие: берет дескриптор, сбрасывает все внутренние буферы, ассоциированные с файлом, на диск, закрывает файл и освобождает дескриптор для нового использования. Если файл был изменен, то время, дата и размер файла обновляются. Вызов: AH=3Eh; BX=дескриптор файла. Возвращает: если нет ошибки: CF=0, AX=дескриптор; иначе – CF=1, AX=код ошибки.
Если случайно вызвать функцию с дескриптором 0, то стандартный ввод будет закрыт, и клавиатура "умрет". Поэтому перед вызовом следует проверять дескриптор на неравенство нулю.