Int 21h не работает

Обработчик прерывания int 21h (по книге Калашникова)

Да, и если считаете,что данная книга тяжелая для первого ознакомления, посоветуйте пожалуйста какую-то другую, желательно, в которой речь шла бы о системном программировании и о создании антивирусов и вирусов на языке ассемблер.
Спасибо за внимание,если что не так написал, извините,на данном форуме впервые и с ассемблером стаклкиваюсь впервые, а вещь очень нужная

Добавлено через 43 минуты
Да, и зачем в листинге call dword ptr cs:[int_21h_vect] , jmp dword ptr cs:[int_21h_vect],что оно означает, ведь такой процедуры нет, или это ссылка на переменную, в которой хранится адрес 21го прерывания.К сожалению , в учебнике не объясняются все вещи сразу.

Добавлено через 2 минуты
Да, и зачем в листинге 1 call dword ptr cs:[int_21h_vect] , jmp dword ptr cs:[int_21h_vect],что оно означает, ведь такой процедуры нет, или это ссылка на переменную, в которой хранится адрес 21го прерывания.К сожалению , в учебнике не объясняются все вещи сразу.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Резидентный обработчик прерывания 21h (по книге Калашникова)
Всем добрый день. Изучаю ассемблер по книге Калашникова . Программа перехватывает 21-ое.

Резидентный обработчик 21h прерывания (из 10-й главы Калашникова)
Имеется вот такой код резидентного обработчика прерываний, написанный предположительно на MASM.

Перехват прерывания int 21h
Немного решил поэкспериментировать. Есть два случая для сравнения. Первый случай (работает).

Резидентная программа — перехват прерывания int 21h ah=09h
Задание: перекрыть 9 функцию 21 прерывания в assembler. Помогите, плиз, разобраться как правильно.

пример перехвата 21го прерывания рабочий и файл для тестирования тоже,
единственный момент,

в перехвате допиши это — [2. assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG]

Источник

Функция «int 21h» с компилятором MASM в среде SASM

Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: char2.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 568ff17d
Имя модуля с ошибкой: char2.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 568ff17d
Код исключения: c0000005
Смещение исключения: 00001002
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink. cid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt

То же самое происходит при задании других команд в регистре AH.

Что нужно добавить, чтобы функция int 21h начала работать?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

функция 0Ah int 21h
нужно при помощи функции 0Ah int 21h ввести строчку с клавиатуры, а потом вывести ее на экран.

Прерывание 21h «Вывод текста»
После не совсем удачного знакомства с двумя учебниками В.И. Юрова и О.А. Калашникова, связано было.

DosBox и ошибка «Illegal command: masm»
Создаю простой хелло ворлд под дос в редакторе Quick, сохраняю как hello.asm .MODEL Small .STACK.

Пытаюсь вывести число, выдает ошибку (память не может быть «written») MASM
Доброго времени суток! Уважаемые форумчане, помогите поправить код, чтобы вывести значение. .

Читайте также:  Как оформить имущественный вычет если не работаешь

Источник

Теоретические сведения

Напомним, что обработка машинной команды int n — это и есть программное прерывание.

С помощью программных прерываний программист может обратиться за обслуживанием своих запросов к ОС или к BIOS , либо к собственным обработчикам прерываний.

Функции прерывания 21 h ( DOS )

Прерывание 21 h ( DOS ) предназначено для предоставления программисту различных услуг со стороны DOS .

Этими услугами является набор функций. Имя функции — это ее номер в шестнадцатеричной системе счисления.

00 h — завершение работы программы

01 h — ввод символа с ожиданием и эхосопровождением .

На выходе в AL — ACSII -код символа.

02 h — вывод символа.

На входе в DL — ACSII -код символа

05 h — вывод символа на принтер.

На входе в DL — ACSII -код символа

07 h ý ввод символа с ожиданием и эхосопровождением .

На выходе в AL — ACSII -код символа.

Замечание. Функция 08 h при вводе проверяет, не нажато ли CTRL + BREAK

09 h — вывод строки на экран.

На входе — ds : dx = адрес строки с символом $ на конце

0 ah — ввод строки с клавиатуры.

На входе ds : dx = адрес буфера с форматом:

1 байт — размер буфера для ввода (формирует пользователь)

2 байт — число фактически введенных символов (заполняет система по окончанию ввода — нажатию Enter (0 dh ), этот символ не считает)

3 байт и далее — введенная строка с символом 0 dh на конце

На выходе — введенная строка в буфере

0 bh — проверка состояния буфера клавиатуры

На выходе AL =0 — буфер пуст

AL = offh — в буфере есть символы

Последовательность действий при использовании этих функций:

1. Поместить номер функции в регистр AH

2. Поместить передаваемые функции параметры в определенные регистры (для каждой функции соответствующие)

3. Вызвать прерывание командой int 21 h

4. Извлечь результаты работы функции из определенных регистров

Рассмотрим примеры работы с прерыванием 21 h .

Пример 1

Вывод строк на экран

message1 db ‘Это первая строка’ ,’ $ ‘

message2 db ‘Это вторая строка $’

; здесь показаны два различных варианта задания конца строки

mov dx,offset message1

mov dx,offset message2

mov ax,4c00h ; стандартный выход — ah =00 h

Пример 2

Ввод двух символов с клавиатуры (фрагмент)

mov ah,1h ; заносим номер функции в необходимый регистр

int 21h ; ввод первого символа

mov dl,al ; освобождаем al для ввода второго символа

. . . ; обрабатываем первый символ, если необходимо

int 21h ; ввод второго символа

mov ax,4c00h ; пересылка 4c00h в регистр ax

end main ; конец программы

Задания

1. Скопируйте пример 1 в окно текстового редактора, а затем создайте исполняемый файл и выполните программу.

2. Допишите необходимые команды в примере 2, создайте исполняемый файл и выполните программу.

3. Разработайте программу, которая выводит запрос пользователю на ввод его идентификатора (имени), а затем выводит сообщение: «Пользователю вход в систему разрешен». Необходимо предусмотреть задержку строки на экране до нажатия пользователем любой клавиши.

Источник

Эмулятор отображает «байт ошибки 24h не найден после 2000 байт» с использованием int21h/ah = 09h

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

Я проверил другой материал, но ошибок не было:

Читайте также:  Msconfig как настроить для быстродействия windows 10

Я отрезал большую часть сегмента кода, потому что здесь это не важно.

После эксперимента с кодом я обнаружил, что проблема связана с длинами сообщений в сегменте данных. menu1 и menu2 были слишком длинными, и любое сообщение после них не может быть напечатано ( msg1 и msg2 напечатаны, но после них ничего нет). Я проверил, должен ли я объединить menu1 и menu2 , но это не помогло. Пожалуйста, помогите мне узнать, что с ним не так.

На основании сообщения об ошибке ниже я знаю, что вы используете EMU8086 в качестве среды разработки.

INT 21h, AH = 09h — адрес: 170B5 байт 24h не найден после 2000 байт.; правильный пример INT 21h/9h: mov dx, offset msg mov ah, 9 int 21h RET msg db «Hello $»

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

Вы создали сегмент data с некоторыми переменными. Мне кажется, все в порядке (но я, возможно, что-то не хватает). Я решил загрузить EMU8086, чтобы попробовать этот код. Он собрался без ошибок. Используя отладчик, я сделал один шаг в строке push offset msg1 рядом с началом программы. Я сразу понял, что такое кодирование. Это декодированная инструкция, которую я видел:

Он показывает, что команда была закодирована как push 0b5h , где 0b5h — смещение. Проблема в том, что он закодирован как push imm8 . Два выделенных байта на левой панели показывают, что они были закодированы с этими байтами:

Если вы просмотрите ссылку набора , вы найдете кодировки для PUSH, закодированная с помощью 6A , указана как:

Вы можете сказать, что B5 помещается в байт (imm8), так что в чем проблема? Наименьшее значение, которое может быть перенесено в стек с push в 16-битном режиме, — это 16-разрядное слово. Поскольку байт меньше слова, процессор берет байта, а знак расширяет его, чтобы сделать 16-битное значение. Ссылка на набор инструкций на самом деле говорит следующее:

Если исходный операнд имеет размер меньше размера операнда, в стеке будет добавлено значение расширенного знака

B5 — двоичный код 10110101. Битовый бит — самый левый бит. Так как это 1, верхние 8 бит, помещенные в стек, будут 11111111b (FF). Если знаковый бит равен 0, тогда 00000000b помещается в верхние 8 бит. Эмулятор не разместил 00B5 в стеке, он разместил FFB5 . Это неверно! Это можно подтвердить, если я пройду через инструкцию push 0b5h и просмотрю стек. Вот что я увидел:

Обратите внимание, что значение, помещенное в стек, равно FFB5 . Я не смог найти соответствующий синтаксис (даже используя модификатор word ), чтобы заставить EMU8086 кодировать это как push imm16 . A push imm16 сможет кодировать все слово как push 00b5 , которое будет работать.

Две вещи, которые вы можете сделать. Вы можете разместить 256 байтов фиктивных данных в сегменте data следующим образом:

Почему это работает? Каждая переменная, определенная после фиктивных данных, будет смещением, которое не может быть представлено в одном байте. Из-за этого EMU8086 вынужден кодировать push offset msg1 как слово push.

Читайте также:  Как получить листок нетрудоспособности если не работаешь

Более чистым решением является использование команды LEA. Это инструкция load effective address . Он принимает операнд памяти и вычисляет адрес (в данном случае смещение относительно сегмента данных). Вы можете заменить весь свой код, который использует offset , с чем-то вроде:

AX может быть любым из 16-разрядных регистров общего назначения. После того, как в регистре, нажмите 16-разрядный регистр на стек.

У кого-то может быть лучшее решение для этого или знаете способ решить эту проблему. Если да, не стесняйтесь комментировать.

Учитывая приведенную выше информацию, вы можете спросить, почему она работала, когда вы перемещали данные? Причина в том, что способ реорганизации всех строк (размещение длинного последнего) привел к тому, что все переменные начали с смещениями, которые были меньше, чем = 128 (и 2016-05-01T01:09:00+03:00 5 лет, 5 месяцев назад

Источник

Резидентная программа (обработка функции 9h прерывания 21h)

1.
jmp dword ptr cs:[Int_21h_vect];.
почему нельзя написать без cs?
2.

push ds
push dx
push cs; Адрес строки должен быть в ds:dx

pop cs;;;;почему сразу же выталкиваем cs.
вообще в книге было написано pop ds. Но это наверно опечатка, потому что из стека в обратном порядке должны извлекаться значения. Если же на самом деле cs, то какой имеет смысл загонять значение в стек и сразу же потом извлекать его?
3.
Зачем нужна pushf (втолкнуть флаги)??
4.

Что тут вообще делается?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Резидентная программа — перехват прерывания int 21h ah=09h
Задание: перекрыть 9 функцию 21 прерывания в assembler. Помогите, плиз, разобраться как правильно.

Резидентная программа — перехват int 21h ah=09h
Помогите пожалуйста Надо написать резидентную программу, которая будет активироватьcя при попытки.

Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает?
Написал резидентную программу, всё работает, но если моя или другие программы вызывают функцию 4ch.

Ввод\вывод способами 9й , 10й функции 21h прерывания
Помогите решить задачу по асм. Задан текст, в котором есть хотя бы одна точка. Преобразовать.

1. cs служит для хранения сегмента данных .
исходя из этого , отпадает и второй вопрос

push ds
push dx
push cs; Адрес строки должен быть в ds:dx тут мы временно выталкиваем сегмент , для отработки процедуры .
а загонять его надо для того , чтобы в стек сохранился адрес строки , чтобы перейти на неё после отработки процедуры
6.тут мы заносим в регистр dx адрес процедуры или метки .Потому что , если после того , как вы запишите

Спасибо, с этим понятно. А 3, 4, 5 вопрос?

Добавлено через 32 минуты
попробовал дабы лучше разобраться в этой теме написать программу, которая перехватывает 16е прерывание и изменяет код нажатой клавиши.
Вот только программа у меня скомпилироваться скомпилировалась, а во время работы вылазят разные ошибки:
this interput isnt’t defined yet, its avaliable to custom functions. You can define this interput by modyfying interput vector table refer to the list of supported interputs and global memory table
это написал отладчик emu8086
16-битная MS-DOS пишет что CPU получил illegal instruction
CS:08da IP:d4e OP:8d d6 d7 00 4f

Источник

Оцените статью