Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для woklex
8 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 32

Резидент

14.03.2013, 23:09. Показов 3621. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас разбираюсь с резидентом, вот код

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
.286
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
 
Start:
 
jmp Init
 
 
;===============
 
Int_09h_proc proc
    pusha
    in al, 60h
    cmp al, 58h
    jne No_F12
    xor cs:Num_status,1
    mov     ah, 9
    mov     dx, offset message
    int     21h
No_F12:
    popa
    jmp dword ptr cs:[Int_09h_vect]
    message db  "Dump BIOS:$"
    Int_09h_vect dd ?
    Num_status db 0 
    Int_09h_proc endp
 
Init:
 
mov     ah, 9
mov     dx, offset string
int     21h
mov     ah, 9
mov     dx, offset message
int     21h
 
       mov ax,3509h
       int 21h      
       mov word ptr Int_09h_vect,bx 
       mov word ptr Int_09h_vect+2,es   
 
       mov ax,2509h
       mov dx,offset Int_09h_proc
       int 21h      
 
 
 
 
    mov dx,offset Init
    int 27h
string  db  "Init:$"
CSEG ends
end Start
Банальная прога, а до меня не доходит где ошибка. Сейчас если нажать f12, то будет написано "dump bios", а перед этим "мусор". Как избавится от мусора?

Запускаю все под dosbox.

Спасибо за любую помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2013, 23:09
Ответы с готовыми решениями:

Резидент глючит
Почему резидент не работает? Я написал код: cli mov ax,0 mov es,ax mov ax,seg intproc mov bx,offset intproc xchg bx,ES: xchg...

Резидент. Борьба с мусором
Пишу свой резидент... У меня к примеру выводится дамп по ctrl\s, у кого-то по этой комбинации содержимое диска С. Но при этом когда ты...

Резидент не создает файл
Здравствуйте! Вот код резидента. Проблема в том, что резидент по нажатию F12 не создает файл. CODE SEGMENT ASSUME CS:CODE,...

9
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
14.03.2013, 23:18
Перед стр.19 вставить
Assembler
1
2
3
push ds
push cs
pop ds
перед меткой No_F12:
Assembler
1
pop ds
И да, int 21h нереентерабелен.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.03.2013, 23:35
Нельзя из обработчика аппаратного прерывания вызывать INT 21h.
Ибо такое прерывание может произойти в момент когда INT 21h уже исполняется.
В обработчике аппаратного прерывания 9 ты вызовешь снова INT 21h, этот вызов
изменит контекст MS-DOS, ты из обработчика прерывания 9 выйдешь и вернешься
в прерванное INT 21h, это прерванное INT 21h продолжит свое исполнение, но уже
С ИСПОРЧЕННЫМ КОНТЕКСТОМ. И наступит крах MS-DOS.

Вот это свойство INT 21h, заключающееся в том, что INT 21h нельзя прерывать и
тут-же повторно в него входить называется нереентерабельностью (нереентрантностью).
Так вот, как уже выше сказали, обработчик INT 21h не реентерабелен.
Поэтому, если тебе нужно в резидентной программе вызывать INT 21h, то
используется совсем другая техника. Только о ней надо отдельно написать.

Но в данном случае, если тебе надо в обработчике прерывания 9 лишь строку
на экран вывести, то вали данные прямо в видеопамять и все дела.
1
 Аватар для woklex
8 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 32
14.03.2013, 23:40  [ТС]
Перед стр.19 вставить
перед меткой No_F12:
Работает...Магия.

И да, int 21h нереентерабелен.
А что рентабельно? Я примеры беру из Калашникова....

Добавлено через 4 минуты
используется совсем другая техника
Может есть какая ссылка на эту технику? А то я как-раз видел что-то подобное в интернете, но у меня просто была проблема с мусором. Сейчас все работает, но хочется сделать правильно.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
14.03.2013, 23:45
Клава перехватывается по int 15h/ah=4Fh, на экран выводится по int 29h.
1
 Аватар для woklex
8 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 32
14.03.2013, 23:45  [ТС]
Но в данном случае, если тебе надо в обработчике прерывания 9 лишь строку
на экран вывести, то вали данные прямо в видеопамять и все дела.
Нет я так не могу делать, надо не через видеопамять. Изначально я и делал через видеопамять, но так сказали нельзя.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.03.2013, 00:37
Добавлено через 45 минут
Техника обхода нереентерабельности INT 21h

1.) Подготовка.
Перед перехватом прерываний вызываешь недокументированную функцию
AH=34h INT 21h. В ES:BX она возвратит указатель на байт. Этот байт
есть флаг занятости DOS. Если он не ноль - MS-DOS занята.
Если ноль - свободна. Указатель на этот флаг сохраняешь в своей
резидентной программе.

2.) Перехват прерываний.
Кроме нужного тебе аппаратного прерывания (в твоем случае 9-го) также
перехватываешь еще 8-е прерывание от таймера (будет вызываться 18.2 раза
в секунду) и 28h-е прерывание от MS-DOS. В твоем случае 28h прерывание
не понадобится, но для общности я и о нем напишу. Также вместо 8-го
прерывания можно перехватить прерывание 1Ch. Оно тоже вызывается 18.2
раза в секунду. Использование что 8-го, что 1Ch-го прерывания одинаково.

3.) Отлов событий.
Когда внутри обработчика аппаратного прерывания (в твоем случае 9-го)
будет обнаружено событие, по которому твоей резидентной программе нужно
поработать с INT 21h, то ты к MS-DOS не обращаешься, а вместо этого
выставляешь в своей резидентной программе некий флажок. Этот флажок будет
иметь смысл признака стоящей прямо сейчас задачи поработать с MS-DOS. И
пока этот флажок не сброшен обработчик перехваченного тобой аппаратного
прерывания не должен больше делать ничего. Только тупо передавать
управление дальше по цепочке обработчиков прерывания. До тех пор пока
флажок не будет сброшен в другом месте. Т.е. упомянутый флажок также
будет являться СЕМАФОРОМ, перекрывающим проход по одной из
"железнодорожных веток" твоего обработчика прерывания до тех пор пока
не будет опущен.

4.) Реакция на семафор в обработчике INT 28h.
MS-DOS систематически вызывает INT 28h из функций AH<=0Ch INT 21h и пока
стоит в простое при ожидании нажатия клавиши на клавиатуре. А значит из
обработчика INT 28h можно безопасно вызывать функции AH>0Ch INT 21h.
Если твоя задача по работе с MS-DOS при возникновении события состоит
только из таких функций, то делаешь так : если внутри обработчика INT 28h
обнаруживаешь, что семафор выставлен, то проделываешь работу с MS-DOS и
после этого семафор сбрасываешь.

5.) Реакция на семафор в обработчике INT 8 (или INT 1Ch).
Делаешь так : если внутри обработчика INT 8/1Ch обнаруживаешь, что семафор
выставлен, то проверяешь по сохраненному указателю флажок занятости MS-DOS.
Если MS-DOS свободна, то проделываешь работу с MS-DOS и после этого семафор
сбрасываешь.

В общем, у тебя должны быть два или три обработчика прерываний и каждый из
них должен передавать управление дальше по цепочке обработчиков прерывания.
Т.е. тихо, мирно висеть и никому не мешать. Но иметь содержательную функцию :
- Обработчик аппаратного прерывания должен, если семафор сброшен, проверить
на наступление события (в твоем случае нажатие F12) и если событие наступило,
то семафор выставить
- Обработчик INT 28h должен, если семафор выставлен, исполнить работу с MS-DOS
(применяя только функции AH>0Ch INT 21h) требуемую по наступлению события и
семафор сбросить
- Обработчик прерывания от таймера (INT 8 или INT 1Ch) должен, если семафор
выставлен и MS-DOS свободна, исполнить работу с MS-DOS требуемую по
наступлению события и семафор сбросить
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
15.03.2013, 00:51
Цитата Сообщение от Ethereal Посмотреть сообщение
Использование что 8-го, что 1Ch-го прерывания одинаково.
Нет, равно как и использование int 9 и int 15h. Дело в том, что БИОС вызывает int1Ch и int15h только после того, как выдаст end_of_interrrupt(EOI) контроллеру прерываний.
Цитата Сообщение от Ralf Brown's Interrupt List
INT 1C ---- - TIME - SYSTEM TIMER TICK
Category: B - BIOS

Inp.:

Desc: this interrupt is automatically called on each clock tick by the INT 08
handler
Notes: this is the preferred interrupt to chain when a program needs to be
invoked regularly
Цитата Сообщение от Ralf Brown's Interrupt List
INT 15 4F-- - KEYBOARD - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
callout or callback (usually hooked rather than called)

Category: B - BIOS

Inp.:
AH = 4Fh
AL = hardware scan code (see #00006)
CF set
Return: CF set to continue processing scan code
AL = possibly-altered hardware scan code (see #00006)
CF clear
scan code should be ignored
Notes: called by INT 09 handler to translate scan codes; the INT 09 code does
not examine the scan code it reads from the keyboard until after
this function returns. This permits software to rearrange the

keyboard; for example, swapping the CapsLock and Control keys, or
turning the right Shift key into Enter.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.03.2013, 01:06
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Нет, равно как и использование int 9 и int 15h. Дело в том, что БИОС вызывает int1Ch и int15h только после того, как выдаст end_of_interrrupt(EOI) контроллеру прерываний.
Да, ибо выше я написал, что обработчик int 8 или int 1Ch должен передавать управление дальше
по цепочке обработчиков
, т.е. сам не должен делать ничего с контроллером прерываний.
Передавать управление дальше через абсолютный дальний переход по прерыдущему вектору
прерывания, если нужно уточнение. Я писал не про обработчики прерываний 8 и 1Ch вообще,
а про обработчики прерываний при описываемой мною технике обхода нереентерабельности.
0
 Аватар для woklex
8 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 32
15.03.2013, 02:02  [ТС]
Charles Kludge, Ethereal, громадное спасибо, я намного лучше стал продвигаться в написании программы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2013, 02:02
Помогаю со студенческими работами здесь

Резидент (приведение к верх. регистру)
Здравствуйте! Тут программа - резидент для приведения определенных рус. букв к верх. регистру. Причем главная функция приведения рус....

Резидент, запрещающий доступ к файлу
Ребята, столкнулась с проблемой! Я учусь на веб-дизайнера. У нас на четвёртом курсе появился ассемблер (который мне ну вообще никаким боком...

Не получается удалить резидент из памяти
Вообщем вот код: .286 CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h Start: jmp Init Int_19h_proc proc ...

Резидент, который блокирует веб сайты
Возможно ли сделать на ассемблере резидент, который будет блокировать некоторые сайты ?!

Не работает простой резидент ни в Win98 ни в Win7
Всем привет ) Подскажите пожалуйста, как уговорить резидента остаться в памяти. Ни в Win98 ни в Win7 ничего не работает- программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru