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

Резидент с PSP

23.03.2011, 14:52. Показов 2124. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Резидентная программа, по нажатию комбинации клавиш показывающая сообщение. Компилится но не работает, проблема в строке
mov dx,(end_res-main+10fh)/8 ;Размер в параграфах не пойму как правильно посчитать размер
исходный код:
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
text segment 'code' 
assume cs:text,ds:text,es:text
       org 256 
main proc
    jmp init  
;Поля данных резидентной секции
old_2fh dd 0    ; Ячейка для сохранения системного вектора 2Fh
old_09h dd 0    ; Ячейка для сохранения системного вектора 09h
new_09h proc
; Сохраним используемые регистры
    push es
    push ax
    push bx
    push cx
    push dx
    push ds
    push cs ; Настроим DS на наш сегмент для простоты программирования
    pop ds
    xor ax,ax                 ; Чтение флагов состояния
    MOV ES,AX                 ; клавиатуры в регистр AL и
    MOV AL,ES:[417h]    ; определение нажаты ли клавиши
    AND AL,00001100b    ; Ctrl-Alt, если нет, то
    CMP AL,00001100b    ; возврат управления
    JNZ exit
    mov ax, 0013h
    int 10h
    mov ax,0900h    ; Показываем сообщение фио
    mov dx,offset msg_fio
    int 21h
; Восстановим использовавшиеся регистры 
exit: 
    pop ds 
    pop dx 
    pop cx 
    pop bx 
    pop ax 
    pop es
    jmp cs:old_09h                ; Передадим управление системному обработчику "int09h"
    new_09h endp                  ; Конец процедуры
 
; Обработчик мультиплексорного прерывания 
new_2fh proc
    cmp ah,0f1h ; Проверим номер функции мультиплексорного прерывания
    jne out_2fh ; Не наша - на выход
    cmp al,00h  ; Подфункция проверки на повторную установку?
    je inst               ; Да, сообщим о невозможности повторной установки
    cmp al,01h  ;Подфункция выгрузки? 
    je off                     ; Да - на выгрузку
    jmp short out_2fh   ; Неизвестная подфункция, на выход
inst: 
    mov al,0ffh            ; Программа уже установлена
    iret                 ; Выход из прерывания
out_2fh:
    jmp cs:old_2fh ; Переход в следующий по цепочке обработчик прерывания 2Fh
; Выгрузим программу из памяти, предварительно восстановив все перехваченные ею векторы
; Сохраним используемые регистры 
off: 
    push ds 
    push es 
    push dx 
; Восстановим вектор 09h  ; 
    mov ax,2509h          ;Функция установки вектора
    lds dx,cs:old_09h    ; Заполним DS:DX
    int 21h 
; Восстановим вектор 2fh 
    mov ax,252fh          ;Функция установки вектора
    lds dx,cs:old_2fh     ;Заполним DS:DX
    int 21h
; Получим из PSP адрес собственного окружения и выгрузим его 
    mov es,cs:2ch   ; ES окружение
    mov ah,49h  ; Функция освобождения блока памяти
    int 21h
; Выгрузим теперь саму программу
    push cs              ; Загрузим в ES содержимое CS, т.е. сегментный адрес PSP
    pop es
    mov ah,49h  ; Функция освобождения блока памяти
    int 21h
; Восстановим использовавшиеся регистры 
    pop dx 
    pop es 
    pop ds
    iret                  ;Возврат в вызвавшую программу
new_2fh endp        ; Конец процедуры обработки прерывания 2Fh
end_res=$   ; Смещение конца резидентной части программы
main endp 
tail db 'off'              ; Ожидаемый хвост команды
flag db 0                ;Флаг требования выгрузки
 
; Процедура инициализации 
init proc
    mov cl,es:80h         ;Получим длину хвоста PSP
    cmp cl,0                ;Длина хвоста = 0 ?
    je live                     ;Да программа запущена без параметров
    xor ch,ch               ; Теперь СХ=СL=длина хвоста
    mov di,81h             ; DS:SI хвост в PSP
    lea si,tail               ; DS:SI поле tail
    mov al,' '                ;Уберём пробелы из начала хвоста
repe  scasb           ;Сканируем хвост, пока пробелы
    dec di                   ;DI первый символ после пробелов
    mov cx,3               ;Ожидаемая длина параметра
repe  cmpsb          ;Сравниваем введённый хвост с ожидаемым 
    jne live                  ;Введена неизвестная команда
    inc flag                  ;Введено "off", установим флаг запроса на выгрузку
 
; Проверим, не установлена ли уже данная программа 
live:
    mov ah,0f1h ; Установим нашу функцию
    mov al,0                  ; и подфункцию на наличие нашей программы в оперативной памяти
    int 2fh 
    cmp al,0ffh            ; Программа установлена?
    je installed           ; Да, при наличии запроса на выгрузку её можно выгрузить
 
; Сохраним вектор 2fh
    mov ax,352fh                      ; Функция получения вектора 2fh
    int 21h
    mov word ptr cs:old_2fh,bx        ; Сохраним смещение системного обработчика 
    mov word ptr cs:old_2fh+2,es    ; Сохраним сегмент системного обработчика
; Заполним вектор 2fh
    mov ax,252fh                     ; Функция установления вектора прерывания 2fh
    mov dx,offset new_2fh              ; Смещение нашего обработчика 
    int 21h 
 
; Сохраним вектор 09h
    mov ax,3509h                       ; Функция получения вектора 09h
    int 21h
    mov word ptr cs:old_09h,bx        ; Сохраним смещение системного обработчика 
    mov word ptr cs:old_09h+2,es    ; Сохраним сегмент системного обработчика ; Заполним вектор 09h
    mov ax,2509h                       ; Функция установления вектора прерывания 09h
    mov dx,offset new_09h              ; Смещение нашего обработчика 
    int 21h
 
; Выведем на экран информационное сообщение 
by: 
    mov ah,09h  ; Функция вывода на экран
    lea dx,mes  ; DS:DX адрес строки
    int 21h
    mov ax,3100h        ; Функция "завершиться и остаться резидентным"
    mov dx,(end_res-main+10fh)/8   ;Размер в параграфах
installed:
    cmp flag, 1 ; Запрос на выгрузку установлен?
    je unins                  ; Да, на выгрузку
; Выведем на экран информационное сообщение
    mov ah, 09h ; Функция вывода на экран
    lea dx,mes1 ; DS:DX адрес строки
    int 21h
    mov ax,4c01h    ; Функция завершения с кодом возврата
    int 21h
unins:
; Перешлём в первую (резидентную) копию программы запрос на выгрузку 
    mov ax,0f101h   ; Наша функция с подфункцией выгрузки
    int 2fh     ; Мультиплексное прерывание
; Выведем на экран информационное сообщение
    mov ah,09h  ; Функция вывода на экран
    lea dx,mes2 ; DS:DX адрес строки
    int 21h
    mov ax,4c00h    ; Функция завершения программы
    int 21h
 
mes db 'Program installed'
mes1 db 'Program already installed'
mes2 db 'Program is uninstalled'
msg_fio db 'H=E=L=L=O'
init endp
text ends
end main
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2011, 14:52
Ответы с готовыми решениями:

Резидент
Сейчас разбираюсь с резидентом, вот код .286 CSEG segment assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG org 100h Start: ...

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

резидент-программ
Всем приветик форумчани! Подскажите, с чего начать и где копать (или ссылку или какие классы .Net можно использовать) для написание...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2011, 14:52
Помогаю со студенческими работами здесь

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

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

Резидент: часы, плавающие по экрану
Помогите написать код!!

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru