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

Проблема с выгрузкой резидентной программы

02.12.2018, 23:32. Показов 1010. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа выводит звук разной частоты по нажатию на клавиши. Сделал через перехват 16-го прерывания, не уверен, на сколько это верно, но программа работает. (По идее нужно сделать это через перехват 9-го прерывания, но это не так важно) Пытался сделать выгрузку программы по ctrl+x, какие только варианты не пробовал - видимо, я не вижу какую-то ошибку. При повторной попытке загрузить - улавливает верно. При нажатии на ctrl+x вроде как выводит сообщение по выгрузке, но после не дает возможности писать в командную строку. В общем, помогите, пожалуйста, найти и исправить ошибки.
P.s. Программа вылетает при запуске nortoncommander'a или при запуске проги через него же - если есть идеи, как это исправить, буду очень благодарен.

Код на TASM'e:
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
cseg segment
assume cs:cseg, ds:cseg
org 100h
main proc
jmp init ; Прыгаем на инициализацию
 
installed db 'booper installed$'
already db 'booper already installed$'
removed db 'booper removed$'
old16 dd 0
checker dw 1234h
 
new16 proc far
push ax
push cs
pop ds
    push ax
    push es
    xor ax,ax              
    mov es,ax
    mov al,es:0417h         
    test al,00000100b       
    jz skip
    in al,60h
    cmp al,2Dh ; Проверка на ctrl+x                     
    je remove ; Если да, на выгрузку, иначе звук
    skip:
    pop es
    pop ax
call sound ; Вызываем звук
pop ax
pushf
call dword ptr cs:old16 ; Вызываем старый обработчик
iret
new16 endp
 
sound proc 
push ax
push bx
push cx
push dx
    in al,60h
    mov ah,al
    mov bh,ah
    mov al,255
    mul bh ; Задаем частоту в соответствии с нажатой клавишей
        
    xor cx,cx
    xor dx,dx
    mov bx,ax               ; Запоминаем частоту
                                
    mov al,10110110b        ; 
    out 43h,al              ;
    mov dx,ax               ; Запоминаем AX
    mov ax,bx               ; Кладем частоту в АХ
    out 42h,al              ; Кидаем младший байт частоты
    mov al,ah               ;
    out 42h,al              ; Кидаем старший байт частоты
    mov ax,dx               ; Возвращаем значение АХ
    in al,61h               ;
    or al,00000011b         ; Включаем динамик
    out 61h,al              ; 
                
    mov cx,0001h            ; Старшее слово числа микросекунд
    mov dx,0A120h           ; Младшее слово числа микросекунд
    mov ah,86h          ; 
    int 15h             ; Пауза
 
    in  al,61h              ; 
    and al,not 3            ; Отключаем динамик
    out 61h,al              ; 
        
    pop dx
    pop cx
    pop bx
    pop ax
ret
sound endp
 
remove:
    push ds
    mov ax,2516h ; Возвращаем старое значение вектора
        mov dx, word ptr cs:old16 
        mov ds, word ptr cs:[old16+2]        
        int 21h
        pop ds
        push cs                 
        pop es
        mov AH,49h ; Чистим память от резидента
        int 21h
    mov dx, offset removed
    mov ah,9
    int 21h
exit:
    int 20h ; Выходим
already_inst:
        mov   dx, offset already
        mov   ah,9
        int   21h
        jmp   exit
 
init proc near
mov ax,3516h ; Запоминаем старый адрес 16 обработчика
int 21h
cmp word ptr es:checker,1234h
je already_inst       
 
mov word ptr old16,bx
mov word ptr old16+2,es
mov ax,2516h ; Ставим новый адрес
mov dx, offset new16
int 21h
 
mov dx, offset installed
mov ah,9
int 21h
 
mov dx,offset init ; Оставляем программу резидентной в памяти
int 27h
 
init endp
cseg ends
end main
Миниатюры
Проблема с выгрузкой резидентной программы  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2018, 23:32
Ответы с готовыми решениями:

Разработка резидентной программы
Доброго времени суток, посоветуйте как можно реализовать резидентную программу на ассемблере(FASM). Задание: Прерывание: int 21h;...

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

Вывод в резидентной части программы
a db '123456789' d dw 0 c db 0 xor ax,ax xor dx,dx xor dx,dx mov si,0 m1: mov ah,02 mov bh,00 ...

3
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
03.12.2018, 02:55
RIPPD,
FAQ для раздела Assembler, MASM, TASM https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Всё о резидентах"
1
0 / 0 / 0
Регистрация: 02.12.2018
Сообщений: 2
04.12.2018, 23:44  [ТС]
Прочитал, но не очень помогло... По-прежнему не пашет :/
Сделал на пробу выгрузку, если вызывать программу второй раз - работает. Но из самой программы по нажатию никак.
В общем вопрос остаётся - что в текущей программе упущено важного, без чего выгрузка по нажатию не работает..
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
05.12.2018, 09:36
Цитата Сообщение от RIPPD Посмотреть сообщение
pushf
call dword ptr cs:old16 ; Вызываем старый обработчик
iret
Нельзя так делать в int 16h. Прерывание возвращает флаги, а вы их убиваете. Делайте просто jmp dword ptr cs:old16 вместо этих 3-х.

Выгрузка не работает, т.к. нельзя выходить из резидента через int 20h. Восстанавливайте регистры (ES, AX, AX) и делайте jmp (см. выше).

Добавлено через 2 минуты
Вот это ещё почитайте: Резидентная программа: сохранение содержимого дисплея в файл
Для int 16h это обычно безопасно, ибо программы вызывают его явно, НО! Его ведь могут из другие резиденты вызывать.

Добавлено через 2 минуты
Цитата Сообщение от RIPPD Посмотреть сообщение
mov ah,86h
Если запускаете из-под DOSBox, советую писать mov ax,8600h, у DOSBox'а в этом месте баг.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2018, 09:36
Помогаю со студенческими работами здесь

Фрагмент резидентной программы
Прошу помочь с решением задания Написать фрагмент резидентной программы на языке Ассемблер MASM 86, сохраняющей в памяти фрагмент...

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

Фрагмент резидентной программы
Здравствуйте, не могли бы вы помочь с заданием? Нужно написать фрагмент резидентной программы на языке Ассемблер MASM 86, сохраняющий в...

Защита резидентной программы от повторной установки
Есть две программы резидентная и обращающаяся к ней. Что надо добавить чтобы защитить резидентную от повторной установки в память? ...

Выход из резидентной программы или выгрузка ее из памяти
Я уже сюда не раз писал насчет резидентной программы. Многие помогли) Большое все спасибо) У меня есть программа, загружаемая...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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