What does "int 21h" mean in Assembly?
I’m new to learning assembly language, and I’m wondering what the command int 21h means. For example:
Which should read a key from the user.
3 Answers 3
int 21h means, call the interrupt handler 0x21 which is the DOS Function dispatcher. the «mov ah,01h» is setting AH with 0x01, which is the Keyboard Input with Echo handler in the interrupt. See:
INT 21H will generate the software interrupt 0x21 (33 in decimal), causing the function pointed to by the 34th vector in the interrupt table to be executed, which is typically an MS-DOS API call.
This simply means that you are using function 01h of the Interrupt type 21. where 01h is as you said is to read character from standard input, with echo, result is stored in AL. if there is no character in the keyboard buffer, the function waits until any key is pressed. It comes under type 21h of various interrput tables, hence the lines of code goes like these as you mentioned.
![]()
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Ассемблер
Все функции DOS вызываются с помощью прерывания 21h (в десятичной нотации 33). Первая версия DOS содержала 42 функции. Во второй к ним добавлено еще 33 функции, которые сохраняются во всех последующих версиях. Выбор конкретной функции осуществляется путем записи соответствующего номера в регистр AH.
Функция 02: вывод одного символа на экран
Для вывода одного символа на экран ПК используется
функция 02 прерывания 21h:
mov DL, <код выводимого символа>
Выводимый символ высвечивается в позиции курсора (что бы там ни было записано), после чего курсор сдвигается на одну позицию вправо. Если курсор находился в конце строки экрана, то он перемещается на начало следующей строки, а если курсор был в конце последней строки экрана, то содержимое экрана сдвигается на одну строку вверх, а внизу появляется пустая строка, в начало которой и устанавливается курсор.
Особым образом осуществляется вывод символов с кодами 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 := начальный адрес строки
Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX — смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.
Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.
Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.
Среди функций DOS нет такой, которая выводит числа. Такую операцию, если надо, приходится реализовывать на основе рассмотренных функций.
Функция 4Ch: завершение программы
Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:
mov AL, <код завершения>
Каждая программа, вообще говоря, обязана сообщить, успешно или нет она завершила свою работу. Дело в том, что любая программа вызывается из какой-то другой программы (например, из операционной системы), и иногда вызвавшей программе, чтобы правильно продолжить работу, надо знать, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информация передается в виде кода завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, и ненулевым (каким именно — оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной программы можно с помощью функции 4Dh прерывания 21h.) Потребуется этот код или нет, программа все равно должна выдать его.
Int 21h ;вызов прерывания с номером 21h
Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегменто . Эти директивы приведены в табл. 3.
Упрощенные директивы определения сегмента
Формат директивы (режим MASM)
Формат директивы (режим IDEAL)
Начало или продолжение сегмента кода
Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near
Начало или продолжение сегмента постоянных данных (констант) модуля
Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near
Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека
Начало или продолжение сегмента инициализированных данных типа far
Начало или продолжение сегмента неинициализированных данных типа far
Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа.
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти Перечислим эти идентификаторы и их значения
Идентификаторы, создаваемые директивой MODEL
Физический адрес сегмента кода
Физический адрес сегмента данных типа near
Физический адрес сегмента данных типа far
Физический адрес сегмента неинициализированных данных типа far
Физический адрес сегмента неинициализированных данных типа far
Физический адрес сегмента стека
Операнды директивы MODEL используют для задания модели памяти, которая определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров
Модели памяти
Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .com.
Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере
Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления — типа far. Данные объединены в одной группе; все ссылки на них — типа near
Код в одном сегменте; ссылка на данные — типа far
Код в нескольких сегментах, по одному на каждый объединяемый программный модуль
Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти
27 Асемблер. Визначення даних та директиви опису даних .(цілі числа без знаку; цілі числа зі знаком; символи й рядки символів; адреси, константи), оператор завдання типу й операції зміни розмірності числа. (оператор ptr; операції cbw, cwd)
В общем случае под целое число можно отвести любое число байтов, однако система команд процессора i8086 поддерживает числа размером в байт, слово и двойное слово.
Различаются целые числа без знака и знаковые целые числа. В ячейках одного и того же размера можно представить больший диапазон беззнаковых чисел, чем неотрицательных знаковых чисел.
Целые числа без знака могут быть представлены в виде байта, слова или двойного слова в зависимости от их размера. В виде байта представляются целые от 0 до 255 (=2 8 -1), в виде слова — целые от 0 до 65535 (=2 16 -1), в виде двойного слова — целые от 0 до 4 294 967 295 (=2 32 -1). Числа записываются в двоичной системе счисления, занимая все разряды ячейки.
Следует сразу понять особенности хранения слов и двойных слов в памяти компьютера. Числа размером в слово хранятся в памяти в «перевернутом» виде: младшие (правые) 8 битов числа размещаются в первом байте слова, а старшие 8 битов — во втором байте (в 16-ричной системе: две правые цифры — в первом байте, две левые цифры — во втором байте). Аналогично хранятся и числа в формате двойного слова. В первом его байте размещаются младшие 8 битов числа, во втором байте — предыдущие 8 битов и т.д.
В первом слове двойного слова размещаются младшие (правые) 16 битов числа, а во втором слове — старшие 16 битов, причем в каждом из этих двух слов в свою очередь используется «перевернутое» представление.
Целые числа со знаком также представляются в виде байта, слова и двойного слова. В виде байта записываются числа от -128 до 127, в виде слова — числа от -32768 до 32767, а в виде двойного слова — числа от -2147483648 до 2147483647. При этом числа записываются в дополнительном коде: неотрицательное число записывается так же, как и беззнаковое число (т.е. в прямом коде), а отрицательное число -х представляется беззнаковым числом 2 8 -х (для байтов), 2 16 -х (для слов) или 2 32 -х (для двойных слов). Например, дополнительным кодом числа -10 является байт F6h (256-10), слово FFF6h или двойное слово FFFFFFF6h. Таким образом самый левый бит интерпретируется как знаковый, если он равен 1, то число считается отрицательным, если 0 — положительным. Если знаковое целое число формата байт содержит единицу только в знаковом разряде, то оно интерпретируется как -128. Аналогично для слова это будет -32768, для двойного слова -2147483648.
Знаковые числа размером в слово и двойное слово записываются в памяти также в «перевернутом» виде и знаковый бит оказывается в последнем байте ячейки.
Символы и строки. На символ отводится один байт памяти, в который записывается код символа — целое от 0 до 255. В IBM-совместимых компьютерах используется система кодировки ASCII
Некоторые особенности этой системы кодировки:
код пробела меньше кода любого буквенного символа, цифры и других графически представимых символов;
коды цифр упорядочены по величине цифр и не содержат пропусков –это от 30h, до 39h;
коды больших и малых латинских и букв упорядочены согласно алфавиту и не содержат пропусков;
Строка — это последовательность символов, размещается в соседних байтах памяти, код первого символа строки записывается в первом байте, код второго символа — во втором байте и т.д. Адресом строки считается адрес ее первого байта.
Представление адресов. Адрес — это порядковый номер ячейки памяти, т.е. неотрицательное целое число, поэтому в общем случае адреса представляются так же, как и беззнаковые числа. Часто под адресом понимается 16-битовое смещение (offset) — адрес ячейки, отсчитанный от начала сегмента (области) памяти, которому принадлежит эта ячейка. В этом случае под адрес отводится слово памяти и как число он записывается в памяти в «перевернутом» виде.
В другом случае под адресом понимается 20-битовый абсолютный адрес некоторой ячейки памяти. Такой адрес задается как пара сегмент : смещение, где сегмент (segment) — это первые 16 битов начального адреса сегмента памяти, которому принадлежит ячейка, а смещение — 16-битовый адрес этой ячейки, отсчитанный от начала данного сегмента памяти. Абсолютный адрес образуется как сегмент*16+смещение. Такая пара записывается в памяти виде двойного слова: в первом слове размещается смещение, а во втором -сегмент (перевернутый вид), причем каждое из этих слов в свою очередь представлено в перевернутом виде.
Постоянные или непосредственные операнды — число, строка, имя или выражение, имеющие некоторое фиксированное значение. Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программы в память. К примеру, оно может быть определено операторами equ или = .
mov al,num ;эквивалентно mov al,5
;5 здесь непосредственный операнд
add [si],imd ; imd=3 — непосредственный операнд
mov al,5 ;5 — непосредственный операнд
В данном фрагменте определяются две константы, которые затем используются в качестве непосредственных операндов в командах пересылки mov и сложения add.
Директивы определения данных. Для резервирования ячеек памяти для констант и переменных и их инициализации в языке ассемблера используются директивы определения данных — с названиями DB (определяет данные размером в байт), DW (определяет данные размером в слово) и DD (определяет данные размером в двойное слово).
Директивы, — это предложения программы, с помощью которых программист дает дополнительные указания ассемблеру или сообщает ему какую-то информацию, которые необходимы для задания режима работы и типа применяемой памяти, размещения программы, стека и данных в памяти, резервирования и инициализации ячеек памяти, организации связи основной программы с процедурами и т.п.
С помощью директив DB, DW и DD могут описываться одна или несколько переменных, присваивается им имена. По этой директиве ассемблер формирует машинное представление значений переменных и записывает их в очередные ячейки памяти. Адреса этих ячеек становятся значениями имен переменных, т.е. все вхождения имени в программу ассемблер будет заменять на соответствующий этому имени адрес. Имена, указанные в директивах DB, DW и DD, называются именами переменных. Примеры:
A DB 162 ;Резервирование памяти для данных размером 1 байт
;занести в нее число 162 и дать ей имя А
С DW -1 ;Выделить память размером 2 байта,занести -1
Е DD -1 ;Двойное слово
Данные в директиве DB могут описываться как числа, так и как символы: указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (одинарных или двойных); в последнем случае ассемблер сам заменит символ на его код. Например, следующие директивы эквивалентны (2А — код знака * в ASCII):
starDB 02Ah
starDB ‘ * ‘
starDB » * «
Если адрес необходимо представить как данные, то это делается так:
adr_star DW star
В этой директиве отведено слово памяти, которому дается имя adr_atar и в которое запишется адрес (смещение, эффективный адрес), соответствующий имени star. Если для аналогичной цели используется директива DD:
fadr_star DD star
ассемблер автоматически добавит к смещению имени его сегмент и запишет смещение в первую половину двойного слова, а сегмент — во вторую половину.
По любой из директив DB, DW и DD можно описать переменную, т.е. отвести ячейку, не дав ей начального значения. В этом случае в правой части директивы указывается вопросительный знак:
Perem_l DW ? ;выделить слово, присвоить ему имя Perem_l,
;ничего в это слово не записывать
В одной директиве можно описать сразу несколько констант и/или переменных одного и того же размера, для чего их надо перечислить через запятую. Они размещаются в соседних ячейках памяти. Пример:
betta DB 200,-5,10h. ‘F‘
Имя, указанное в директиве, является именем первого из значений. Для ссылок на остальные в MASM используются выражения вида <имя>+<целое>, например, для доступа к байту с числом -5 используется выражение betta+1, для доступа к байту с значением 10h — выражение betta+2 и т.д. Как вы заметили индексация начинается с нуля. Если в директиве DB перечислены
только символы, например:
str DB ‘a‘, ‘b‘, ‘с’
тогда эту директиву можно записать короче, заключив все эти символы в одни кавычки:
str DB ‘abc‘ или str DB «abc«
Если в директиве описывается несколько одинаковых констант (переменных), то можно воспользоваться оператором повторения DUP.Например
mas db 5 dup (4)
что эквивалентно директиве
mas db 4,4,4,4,4
arr DW 3 dup (?),-50,2 dup (7)
что эквивалентно директиве
arr DW . -50,7,7
В ассемблере имеются директивы EQU и =, с помощью которых можно определить константы. Директива EQU присваивает имени значение, которое определяется как результат целочисленного выражения. Директива EQU аналогична директиве #define в языке Си. Значение, присвоенное имени с помощью директивы EQU, нельзя в последствии изменить. Пример:
A equ 10
В equ 21/3
С equ «abcdef«
Директива » justify»> alfa=20
alfa=alfa+l
Для ссылок на текущую ячейку используется обозначение $, которое является обозначением счетчика текущего адреса. Пример:
mas db «assembler«
mas_len=$-mas
В этом примере значением имени mas_len будет длина строки mas, т.е. число 9.
Преобразование байта в слово/слова в двойное слово CBW/CWDE (Convert Byte to Word/Convert Word to Double Word Extended)
Применяется для расширения операнда со знаком. Выполнение команды не влияет на флаги.
Алгоритм работы:
cbw –при работе команда использует только регистры al и ax:
если знаковый бит al=0, то ah=00h;
если знаковый бит al=1, то ah=0ffh.
cwde – при работе команда использует только регистры ax и eax:
если знаковый бит ax=0, то установить старшее слово eax=0000h;
если знаковый бит ax=1, то установить старшее слово eax=0ffffh.
Данные команды используются для приведения операндов к нужной размерности с учетом знака. Такая необходимость может, в частности, возникнуть при программировании арифметических операций.
.386 ;только для cwde, cwd была для i8086
mov ebx,10fecd23h
mov ax,-3 ;ax=1111 1111 1111 1101
cwde ;eax=1111 1111 1111 1111 1111 1111 1111 1101
Преобразование слова в двойное слово CWD (Convert Word to Double word)
Назначение: расширение слова со знаком до размера двойного слова со знаком.
Алгоритм работы: копирование значения старшего бита регистра ax во все биты регистра dx. выполнение команды не влияет на флаги
Команда cwd используется для расширения значения знакового бита в регистре ax на биты регистра dx. Данную операцию, в частности, можно использовать для подготовки к операции деления, для которой размер делимого должен быть в два раза больше размера делителя, либо для приведения операндов к одной размерности в командах умножения, сложения, вычитания.
Оператор переопределения типа PTR применяется для переопределения или уточнения типа метки или переменной, определяемых выражением Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far .
d_wrd dd 0
mov al,byte ptr d_wrd+1 ;пересылка второго байта из двойного слова
Поясним этот фрагмент программы. Переменная d_wrd имеет тип двойного слова. Что делать, если возникнет необходимость обращения не ко всей переменной, а только к одному из входящих в нее байтов (например, ко второму)? Если попытаться сделать это командой mov al,d_wrd+1, то транслятор выдаст сообщение о несовпадении типов операндов. Оператор ptr позволяет непосредственно в команде переопределить тип и выполнить команду.
MS-DOS и TASM 2.0. Часть 16. Прерывания DOS.

Ядро операционной системы — набор системных функций.
Основу операционной системы Windows 95 — Windows XP составляет набор системных функций, содержащихся в файлах с расширением *.DLL, которые располагаются в системных дирректориях … Windows\System, System32, SysWOW64 (для 64 битных версий операционок) — так называемый Win API. К слову, в Windows 10 поддержка Win API реализована практически в полном объёме, хотя ядро системы несколько изменилось). В MS-DOS ядро также состоит из системных функций, которые называются прерывания DOS. Ну, если точно, то есть прерывания DOS, а есть прерывания BIOS (связаны с управлением компьютерным железом, определённые прерывания DOS можно реализовать через прерывания BIOS), да и понятие ядра системы можно расширить… Для наших целей и на данный момент отбросим усложнения в сторону! Далее мы будем использовать общее понятие для всех прерываний: прерывания DOS.
Прерывания DOS.
Прерывание имеет вид: int [номер прерывания], например: INT 21h.
Основные функции MS-DOS вызываются с помощью прерывания INT 21h, однако MS-DOS использует и другие прерывания (INT 20h , INT 25h , INT 26h , INT 27h , INT 28h , INT 2Eh и др.).
Функции прерывания INT 21h делят на группы в зависимости от выполняемых ими задач и особенностей выполнения этих задач. Одно и тоже действие иногда можно осуществить при помощи различных прерываний различными способами.
Прерывание не имеет смыслового названия, но каждой функции присвоен свой номер. Номер функции при вызове прерывания INT 21h задается через регистр AH. Согласно этому номеру можно выяснить предназначение функции, её параметры.
Параметры (in, out) передаются через регистры либо пары регистров (например: BX, DX, CX, BL:CX, DS:DX, и т.д.). Возвращаемое значение (return) передаётся через AX.