Разное

Ассемблер int 21h: Ассемблер: Прерывание 21h: общие функции DOS

Ассемблер: Прерывание 21h: общие функции DOS

 

Все функции DOS вызываются с помощью прерывания 21h (в десятичной нотации 33). Первая версия DOS содержала 42 функции. Во второй к ним добавлено еще 33 функции, которые сохраняются во всех последующих версиях. Выбор конкретной функции осуществляется путем записи соответствующего номера в регистр AH.

Функция 02: вывод одного символа на экран

Для вывода одного символа на экран ПК используется

функция 02 прерывания 21h:

mov DL, <код выводимого символа>

mov AH, 2

int 21h

Выводимый символ высвечивается в позиции курсора (что бы там ни было записано), после чего курсор сдвигается на одну позицию вправо. Если курсор находился в конце строки экрана, то он перемещается на начало следующей строки, а если курсор был в конце последней строки экрана, то содержимое экрана сдвигается на одну строку вверх, а внизу появляется пустая строка, в начало которой и устанавливается курсор.

Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (0Ah) и 13 (0Dh). Символ с кодом 7 (bell, звонок) на экране не высвечивается (и курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (backspase, шаг назад) возвращает курсор на одну позицию влево, если только он не был в самой левой позиции строки. Символ с кодом 9 (tab, табуляция) смещает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (line feed, перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ с кодом 13 (carrige returne, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки.

Функция 9: вывести строку на экран дисплея

Для вывода на экран строки (последовательности символов) можно, конечно, использовать функцию 02, однако сделать это можно и за один прием с помощью функции 09 прерывания 21h:

DS:DX := начальный адрес строки

mov AH, 9

int 21h.

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX — смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.

Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.

Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.

Среди функций DOS нет такой, которая выводит числа. Такую операцию, если надо, приходится реализовывать на основе рассмотренных функций.

Функция 4Ch: завершение программы

Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:

mov AL, <код завершения>

mov AH, 4Ch

int 21h

Каждая программа, вообще говоря, обязана сообщить, успешно или нет она завершила свою работу. Дело в том, что любая программа вызывается из какой-то другой программы (например, из операционной системы), и иногда вызвавшей программе, чтобы правильно продолжить работу, надо знать, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информация передается в виде кода завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, и ненулевым (каким именно — оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной программы можно с помощью функции 4Dh прерывания 21h.) Потребуется этот код или нет, программа все равно должна выдать его.

Предлагаю ознакомиться с аналогичными статьями:

Ярлыки: Прерывания, Работа с экраном, DOS

Следующее Предыдущее Главная страница

Подписаться на: Комментарии к сообщению (Atom)

Использование функций Int 21h (02h, 06h, 09h) для вывода информации на экран.

— Вывод символа на экран (02h int 21h)

Функция 02h позволяет вывести один символ на экран. Вход: АН » 02h — вывод символа; DL = символ для вывода.

Функция 02h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h. Для того чтобы вывести строку, необходимо использовать цикл.

— Прямой вывод символа на экран (06h int 21h)

Функция 06h выводит один символ на экран. Эта функция универсальна, так как используется и для ввода, и для вывода символа.

Вход: АН = 06h — вывод символа на экран; DL = символ для вывода (за исключением 0ffn).

Функция 06h не проверяет наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break). Порядок использования данной функции аналогичен порядку использования функции 02h.

— Вывод строки на экран (09h int 21h)

Функция 09h выводит строку символов на экран.

Вход: АН = 09h — вывод строки на экран; DS: DX — адрес строки для вывода с завершающим символом $.

Функция 09h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h.

  1. Использование функций Int 21h для ввода, вывода информации в файл.

— Функция 40H: запись в файл

Вход: AH = 40H BX = дескриптор файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт

CX байт данных записывается в файл или на устройство с дескриптора, заданного в BX. данные берутся из буфера, адресуемого через DS:DX. данные записываются, начиная с текущей позиции указателя чтения/записи файла.

Выход: AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок)

— Функция 3fH: чтение из файла

Вход: AH = 3fH BX = описатель файла DS:DX = адрес буфера для чтения данных

CX = число считываемых байт .

CX байт данных считываются из файла или устройства с описателем, указанным в BX. данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

Выход: AX = код ошибки если CF установлен или число действительно прочитанных байт

  1. Использование функций Int 10h bios (00h,4Fh,02h).

— INT 10h, АН = 00 — Установить видеорежим

Ввод: AL = номер режима в младших 7 битах

Вывод: нет.

Вызов этой функции приводит к тому, что экран переводится в выбранный режим. Если старший бит AL не установлен в 1, экран очищается. Номера текстовых режимов — 0, 1, 2, 3 и 7. 0 и 1 — 16-цветные режимы 40×25 (с 25 строками по 40 символов в строке), 2 и 3 — 16-цветные режимы 80×25, 7 — монохромный режим 80×25.

— INT 10h, АН = 4Fh, AL = 02 — Установить SuperVGA-видеорежим

Ввод: ВХ = номер режима в младших 13 битах

Вывод: AL = 4Fh, если эта функция поддерживается АН = 0, если переключение произошло успешно АН = 1, если произошла ошибка

Если бит 15 регистра ВХ установлен в 1, видеопамять не очищается.

Текстовые режимы, которые можно вызвать с использованием этой функции: 80×60 (режим 108h), 132×25 (109h), 132×43 (10Ah), 132×50 (10Bh), 132×60 (10Ch).

Видеорежим, используемый в DOS по умолчанию, — текстовый режим 3.

— INT 10h, АН = 02 — Установить положение курсора

Ввод: АН = 02 ВН = номер страницы DH = строка DL = столбец

С помощью этой функции можно установить курсор в любую позицию экрана, и дальнейший вывод текста будет происходить из этой позиции. Отсчет номера строки и столбца ведется от верхнего левого угла экрана (символ в левой верхней позиции имеет координаты 0, 0). Номера страниц 0 – 3 (для режимов 2 и 3)и 0 – 7 (для режимов 1 и 2) соответствуют области памяти, содержимое которой в данный момент отображается на экране. Можно вывести текст в неактивную в настоящий момент страницу, а затем переключиться на нее, чтобы изображение изменилось мгновенно.

сборка — О прерывании 21 ч

спросил

Изменено 3 года, 4 месяца назад

Просмотрено 640 раз

Я новичок в программировании на ассемблере.

Я хотел знать, правда ли, что прерывания должны быть перемещены в регистр Ah?

Неправильно ли перемещать любые прерывания в регистры AL?

  • сборка
  • dos
  • x86-16
  • условное обозначение

3

Прочтите https://en.wikipedia.org/wiki/DOS_API и другую документацию: http://spike.scu.edu.au/~barry/interrupts.html

(Также в списке прерываний Ральфа Брауна есть подробности о многие другие номера int : http://www.ctyme.com/rbrown.htm Стандартным соглашением по-прежнему является «функциональный код» в AH , который выбирает, какой системный вызов вы хотите из этой группы, а не службы.)

Код «ядра» DOS в обработчике прерываний будет читать AH , чтобы узнать, какую функцию вы хотите. Затем читает любые другие регистры, в зависимости от того, какой код выполняется.

Вы можете думать о int 21h как о причудливом вызове в ядре DOS диспетчеру, который использует AH для индексации таблицы указателей функций для отправки реальной функции. Затем эта функция использует аргументы в других регистрах.

Некоторые из них принимают аргумент в AL , но многие принимают аргумент в

DL (например, символ для печати). Некоторые из них не читают AL на входе, но большинство записывают его на выходе.

Для функций, где AL не является входом, вы можете иметь все, что хотите, в AL , когда работает int 21h . Так что, конечно, у вас может быть еще одна копия номера вызова в AL , а также AH ; это не навредит. Но ты должен иметь правильные значения в документированных регистрах.


Механизмы системных вызовов для большинства других ОС аналогичны: поместите аргументы в регистры, затем вызовите инструкцию ловушки. например Linux помещает номер вызова в EAX и использует int 0x80 (32-разрядная версия) или системный вызов (64-разрядная версия). Лишь немногие (например, 32-разрядные FreeBSD/MacOS) передают аргументы системного вызова в стек.

ОС, отличные от DOS, не поддерживают int 21h . например 32-битный исполняемый файл Windows просто выйдет из строя (сам, а не вся машина), если он выполнит интервал 21ч .

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

окон.

Почему использование «int 21h» на сборке x86 MASM приводит к сбою моей программы?

Я пытался заставить свою программу принимать ввод без нажатия пользователем клавиши ввода, поэтому я попробовал следующее:

 мов ах,01ч
через 21 час
 

Но моя программа просто вылетает из-за необработанного исключения . Судя по тому, что я читал, похоже, это способ сделать это, так почему же это не работает для меня?

Итак, я новичок в этом языке, поэтому я до сих пор не совсем понимаю процесс работы этого фрагмента кода, поэтому я также был бы признателен за логику принятия ввода нажатием клавиши ввода и принятия ввода без участия пользователя. нажать ввод.

Между прочим, МОЯ ОС — Windows.

  • окна
  • сборка
  • x86
  • доски
  • масм

4

Ваш код выглядит как ассемблер эпохи MS-DOS. VS2010 не поддерживает создание исполняемых файлов DOS, а современные версии Windows (64-разрядные) также не поддерживают их запуск.

Похоже, вы шли по какой-то старой книге или сайту, который был написан в конце 80-х — начале 9-го.0 с. В то время сборка была более актуальной и востребованной профессией. Не так много в наши дни, хотя некоторые знания ассемблера не помешают.

Решите, чему вы хотите научиться. Если вы хотите изучить современный ассемблер (и ориентироваться на Windows), получите последние рекомендации. Методы совершенно разные, и int21h среди них нет 🙂 Если вы действительно после сборки эпохи DOS, настройте виртуальную машину DOS с DOSBox и найдите какой-нибудь старый бесплатный ассемблер. Visual Studio 2010 вам здесь не поможет. Последней версией Visual C++, которая генерировала 16-разрядные исполняемые файлы, была v1.5x.

В частности, почему ваша программа дает сбой. Int21h был тем, как MS-DOS представила свой прикладной программный интерфейс (API). Windows не поддерживает его для исполняемых файлов Windows — есть другие способы вызова API. При сборке с помощью Visual Studio 2010 вы получаете исполняемый файл для Windows, а не для DOS, и нет возможности создать его для DOS.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *