Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 08.01.2016
Сообщений: 1
TASM

Резидент, который при нажатии комбинации клавиш выводит на экран сообщение и выгружается из памяти

08.01.2016, 09:43. Показов 1551. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
cseg segment  ;чтобы работало в реальном режиме
     assume cs:cseg, ds:cseg
     org 100h
main proc
     jmp init       ; переход на начало инициализации резидента
main endp
 
old_2fh dd 0       ; адрес мультиплексного прерывания
old_09h dd 0       ; адрес системного клавиатурного прерывания
flag db 0          ; флаг для проверки режима смены текста
 
msg1 db 'setup resident$'
msg2 db 'resident already in memory!$'
msg3 db 'sucsessful upload$'
text db 'Hello World!$'
tail db 'off'
 
 
 
 
;Обработчик клавиатуры 09h
new_09h proc
    push ax                 ; сохранение используемых регистров
    push bx
    push dx
    push es
    push di
    push si
    push ds
    push cs
    pop ds
 
    
    in al,60h               ; читаем scan-код  из порта 60h(порт клавиатуры)
    cmp al,1Eh              ; клавиша A
    jne check
    xor bx,bx               ; загрузка байта
    mov ds,bx               ; состояния
    mov al,ds:[0417H]       ; клавиатуры
    test al,4               ; проверка 3 бита, нажата ли клавиша Ctrl
    jz check                ; не нажата
    xor byte ptr cs:flag,1  ; переключим флаг
    
    check: 
    cmp byte ptr cs:flag,0  ; 
    je ex2                  ; 
 
    mov cs:flag, 0          ; обнуляем флаг для следующего вызова
    call typemsg            ; вывод текста
    mov ax,0c801h           ; пошлем команду на выгрузку в наш обработчик мультиплексорного прерывания
    int 2fh
ex2: 
    pop ds                  ; очистка стека
    pop si
    pop di
    pop es
    pop dx
    pop bx
    pop ax
    jmp Dword ptr cs:[old_09h] ;Переход на старый обработчик
endp new_09h
 
;Процедура вывода сообщения и выгрузки резидента из памяти
typemsg proc
    push ax                 ; сохранение используемых регистров
    push bx
    push dx
    push es
    push di
    push si
    push ds
    push cs
    pop ds
    
    
 
    
; --- настройки ---
    sti                     ; установка флага прерывания if в единицу.(разрешение аппаратных прерываний)
    cld                     ; сброс в ноль флага направления df.(команды обработки строк автоинкрементируются, т. е. выполняют операции с адресами от младших адресов к старшим.)
    
    mov ax,0B800h           ; настройка AX на сегмент видеопамяти
    mov es,ax               ; запись в ES значения сегмента видеопамяти
    xor di,di               ; настройка DI на начало сегмента видеопамяти
    mov ah,0Bh              ; атрибут выводимых символов
    
    
; --- вывод сообщения ---
    xor bx, bx              ; BX будет индексировать строку
pr: mov al, text[bx]        ; текущий обрабатываемый символ, BX-1 - индекс
    stosw                   ; переписывает содержимое АХ в ячейку памяти с адресом ES: (E)DI, после чего прибавляет 2 к (E)DI, если флаг D опущен, и вычитает 2, если D поднят. 
    inc bx                  ; понижение счётчика, т.к. счёт происходит от последнего
    cmp text[bx],'$'
    jne pr
    
    pop ds                  ; очистка стека
    pop si
    pop di
    pop es
    pop dx
    pop bx
    pop ax
    ret
typemsg endp
 
;Процедура выгрузки из памяти
uninst proc
 
uninst endp
 
;Обработчик повторной загрузки с возможностью выгрузки 2fh
new_2fh proc        ; резидентный обработчик мультиплексного прерывания
     cmp ah,0c8h    ; наша функция?
     jne out_2fh    ; не наша, назад по цепочке (старый обработчик)
     cmp al,00h     ; наша функция, смотрим команда 00h
     je live        ; да, сообщим что уже в памяти
     cmp al,01h     ; пришла команда на выгрузку?
     je uninstLB
out_2fh: jmp cs:old_2fh
live: mov al,0ffh
      iret
 
uninstLB: ;call uninst;выгрузка из памяти
     push ds
     push es
     push dx
     ;восстановим старые прерывания
     mov ax,2509h   ; для клавиатуры
     lds dx,cs:old_09h
     int 21h
     
     mov ax,252fh ; для мультиплексного прерывания
     lds dx,cs:old_2fh
     int 21h
 
     mov es,cs:[2ch] ;сегмент окружения из PSP
     mov ah,49h ;функция освобождения блока памяти 
     int 21h
 
     push cs ; скопируем cs в es
     pop es  ; es указывает на начало программы
 
     mov ah,49h ; освобождение памяти (ES = сегментный адрес (параграф) освобождаемого блока памяти)
     int 21h
 
     pop dx
     pop es
     pop ds
     ;ret
     
     iret
 
new_2fh endp
 
 
 
;Инициализация резидентной программы
init proc ;инициализация
     mov ax,0c800h  ; проверка на наличие в памяти
     int 2fh        ; первого экземпляра программы
     cmp al,0ffh    ; вернулся код ffh
     jne first      ; нет экземпляр первый
     mov cl,es:80h  ; получим длину хвоста команды
     cmp cl,0       ; длина хвоста =0?
     je second
     xor ch,ch      ; в cx длина хвоста
     mov di,81h     ; es:di->хвост в PSP
     mov si,offset tail ; ds:di ->поле tail
     mov al,' '     ; уберем пробелы из начала хвоста
repe scasb          ; сканируем хвост, пока пробелы
     dec di         ; di -> первый символ после пробелов
     mov cx,3       ; ожидаемая длина параметра
repe cmpsb          ; сравниваем введенный параметр с ожидаемым     
     jne second     ; введена ошибочная команда
     mov ax,0c801h  ; пошлем в резидентную программу команду на выгрузку
     int 2fh
     mov dx,offset msg3     ; выведем сообщение о выгрузке
     jmp exit
     
; не первый вызов программы
second: mov dx,offset msg2  ; выведем сообщение, что резидент уже в памяти
exit:   mov ah,09h
        int 21h
        mov ax,4c00h        ; завершим программу без оставления в памяти
        int 21h
        
; первый вызов программы - совершение установки      
first:   
     mov ax,352fh   ; чтение и сохранение вектора 2fh
     int 21h
     mov word ptr cs:old_2fh,bx
     mov word ptr cs:old_2fh+2,es    
     mov ax,3509h   ; чтение и сохранение вектора 09h
     int 21h
     mov word ptr cs:old_09h,bx
     mov word ptr cs:old_09h+2,es    
     mov ax,252fh   ; установка обработчика 2fh
     mov dx,offset new_2fh 
     int 21h     
     mov ax,2509h   ; установка обработчика 09h
     mov dx,offset new_09h 
     int 21h     
     mov ah,09h     ; вывод сообщения об установке резидента
     mov dx,offset msg1
     int 21h     
     mov ax,3100h   ; завершим и оставим в памяти
     mov dx, (init-main+10fh)/16 ;з апрос в параграфах
     int 21h
init endp
 
 
 
 
cseg ends
 
end main
Задание:
Разработка резидентного обработчика прерывания
Вариант 13.
Разработать самовыгружающийся резидентный обработчик прерывания, который при нажатии некоторой комбинации клавиш выводит на экран сообщение и выгружается из памяти.

При компиляции программы в tasm 1.2 и нажатии соответствующей клавиши "А" ничего не происходит. Не могу понять что не правильно.(В Ассемблере я практически 0)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2016, 09:43
Ответы с готовыми решениями:

Резидентная программа. При нажатии клавиши F1 выводит на экран сообщение. При нажатии F2 программа выгружается.
Решил изучить книгу "Программирование на ассемблере" Одиноков, Коцубинский и застрял на одной задаче: "Резидентная программа...

Резидент, который по нажатию комбинации клавиш создает файл, в который записывается изображение на экране
Создать резидентный обработчик прерывания, который по нажатию комбинации клавиш (любой) создает файл, в который записывается изображение на...

Резидентный обработчик прерывания, который при нажатии некоторой комбинации клавиш выдает звук
Есть код, вроде правильный. Откомпилировал и создал .exe-файл, после запуска ничего не происходит и DOS зависает. Код написан в ОС DOS на...

3
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
08.01.2016, 11:34
Valfee,
FAQ для раздела Assembler, MASM, TASM https://www.cyberforum.ru/cgi-bin/latex.cgi?\to "Всё о резидентах"
0
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
08.01.2016, 22:09
1) зачем два раза два раза сохранять регистры на стэке при выводе сообщения на экран? Тем более что юзаете из всех перечисленных штуки 4 всего.
2) есть режимы текстовые, в которых адрес экрана будет начинаться с B000h (перед юзаньем надо это проверить. самый быстрый и элегантный - попытаться читать-инвертировать-записать-считать-проверить-восстановить по адресу памяти)
3) Обрабатывать аппаратуру(тем более матери) не есть гут. BIOS он родной(с матери считан), а вы пришлый код рисуете и ваша фамилия не есть фамилия фирмы разработчика железа. Посему юзать на уровне чтения портов - Вы должны быть сильно уверены в своих телодвижениях. В Вашем случае лучше сесть на уровень выше, там где уже скэн код превращён в более логичное и лежит в кольцевом буффере клавиатуры BIOSа. Т.е. 16h если сейчас мне не изменяет память. Вам потребуется только грамотно обрабатывать этот самый кольцевой буфер.
4) нет необходимости тянуть строки вывода на экран в память оставленного резидента. их тупо можно передвинуть в конец программы.
5) из аппаратного обработчика нажатия клавы - лучше не делать вызов прерываний, даже мультиплексных. Более корректно сделать функцию отгрузки отдельно от логики самого 2fh прерывания и позвать из обработчика 09h тупо.
6) при выводе строки (из 09h) вы можете загрузить её размерность в CX и заюзать loop . Это быстрее будет. И т.к. строка ваша - то и логичней.
7) в своих действиях вы не описали телодвижений по запуску программы, о сообщениях которые вы видите на экране. Да и подебажиться имеет смысл, перед тем как оставлять что то в памяти. Для этого закомментируйте оставление резидента в памяти. ниже по коду(в подпрограмме инициализации) напишите бесконечный цикл и ниже возврат ваших захваченных векторов системе. запусктите под дебагом. поставьте бряки на интересующих вас векторах (тут вот с 9h будут проблемы, посему подумайте прежде чем что то делать) и отрасируйте код. После проверки - обойдите в бесконечном цикле шаг возврата и закончите программу. верните изначально всё в подпрограмме инициализации, сделайте в обработчике 9h сразу первой командой прыжок на родной вектор. отдебажьте загрузку-выгрузку резидента. когда всё отладите - верните обработчик 9 вектора и пробуйте запускаться на боевую.

удачи вам
(круглый)
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
09.01.2016, 00:58
Цитата Сообщение от kolobok0 Посмотреть сообщение
в своих действиях вы не описали телодвижений по запуску программы
Цитата Сообщение от Valfee Посмотреть сообщение
В Ассемблере я практически 0
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2016, 00:58
Помогаю со студенческими работами здесь

Резидент, который выводит на экран время работы запускаемых программ
Задание:На языке ассемблер написать резидентную программу, которая бы обрабатывала int 21 h , функцию запуска программы (любой). При этом...

Событие при нажатии комбинации клавиш
Знаю подобные темы здесь уже обсуждались, но все же. Кто-нибудь может выложить пример, в котором на сочетание клавиш CTRL+L запускался бы...

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

Реализация прыжка при нажатии комбинации клавиш
Помогите пожалуйста с реализацией прыжка Не знаю какие координаты надо менять чтобы персонаж прыгал Писал программу с помощью классов ...

Как при нажатии комбинации клавиш прекратить цикл
Здравствуйте программисты. Недавно решил написать небольшой вирус что-бы потом его разослать нескольким друзьям. Суть в том что при...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru