IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Резидентная программа
taric
сообщение 12.10.2004 12:16
Сообщение #1


Гость






Народ пожалуста помогите!!!!
Нужно написать резидентную програму которая при запуске воспринимала ключи. Например:
reside.com /q - вигружает програму из памяти
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 6)
Dark
сообщение 12.10.2004 14:58
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


Берусь попробовать


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 12.10.2004 18:17
Сообщение #3


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Эх, тряхнём стариной smile.gif

З.Ы. Советую почитать какой-нибудь мануал по DOS, ту часть, которая касается резидентных программ и мультиплексного прерывания.

Сообщение отредактировано: xds - 12.10.2004 18:23


Прикрепленные файлы
Прикрепленный файл  resid.zip ( 2 килобайт ) Кол-во скачиваний: 249


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 13.10.2004 0:00
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


По моему немного проще:

; Эта программа будет проверять, находиться ли она уже в памяти, и показывать
; глупое сообщение, если это так. В противном случае она будет инсталлировать
; в память и показывать другое сообщение.
; Если файл запустить с параметром /u то он его выгружает.
; Я специально оптимизацией не занимался, но мне будетинтересно если вы ее
; оптимизируете
; компилить: tasm tsr.asm
; 	     tlink /t tsr.obj 		

       .model   tiny
       .code
        org     100h

start:
        jmp     fuck

newint9:

        cmp     ax,0ACDCh               ; Пользователь вызывает нашу функцию?
        je      is_check                ; Если да, отвечаем на вызов

        cmp     ax,0AAAAh               ; Пользователь выгружает наш резидент?
        je      disabled                ; Если да, выгружаем

        jmp     dword ptr cs:[oldint9] ; Или переходим на исходный int9

is_check:
        mov     ax,0DEADh               ; Мы отвечаем на звонок
        iret                            ; И принуждаем прерывание возвратиться

disabled:
	push 	ds                      ;сохраняем изменяемые регистры
	push 	dx
	push 	ax
	
	lds	dx, dword ptr cs:[oldint9] ;загружаем адрес старого загрузчика 
					;	в ds:dx
        mov     ax,2509h                ; Функция для возврата адреса 
                                        ; старого обработчика int9
        int     21h

	pop 	ax                       ;Востанавливаем регистры
	pop 	dx
	pop 	ds
        iret                            ; И принуждаем прерывание возвратиться

oldint9  label dword
int9_off dw    0000h                     ;указатель на старый обработчик
int9_seg dw    0000h

fuck:
	mov 	di,81h                  ;В области DTA смещаем смещение в di
	mov	al,' '			;через все пробелы
	mov	cx,128
	repe	scasb
	dec	di
	mov	si,di
	
	cmp	word ptr [si],'u/'       ;сравниваем c /u
	jne	install
	
	mov 	ax,0aaaah		;выгружаем
	int 	9h
        mov     ax,0900h                ; Показываем сообщение 3
        mov     dx,offset msg_disabled
        int     21h
	jmp	final

install:
        mov     ax,0ACDCh               ; Проверка на резидентность
        int     9h                     ;
        cmp     ax,0DEADh               ; Мы здесь?
        je      stupid_yes              ; Если да, показываем сообщение 2

        mov     ax,3509h                ; Если, инсталлируем программу
        int     21h                     ; Функция, чтобы получить векторы
                                        ; INT 9h
        mov     word ptr cs:[int9_off],bx ; Мы сохраняем смещение в oldint9+0
        mov     word ptr cs:[int9_seg],es ; Мы сохраняем сегмент в oldint9+2

        mov     ax,2509h                ; Функция для помещения нового
                                        ; обработчика int9
        mov     dx,offset newint9      ; где он находится
        int     21h

        mov     ax,0900h                ; Показываем сообщение 1
        mov     dx,offset msg_installed
        int     21h

        mov     dx,offset fuck+1        ; Делаем резидент от смещения 0 до
        int     27h                     ; смещения в dx используя int 27h
                                        ; Это также прервет программу

stupid_yes:
        mov     ax,0900h                ; Показываем сообщение 2
        mov     dx,offset msg_already
        int     21h

final:
        int     20h                     ; Прерываем программу.

msg_installed db 'Глупый резидент не установлен. Устанавливаю...$'
msg_already   db 'Глупый резидент жив и дает вам под зад!$'
msg_disabled  db 'Убиваю глупый резидент. Убит наповал : (( $'

end      start


Сообщение отредактировано: volvo - 13.01.2009 21:00


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 14.10.2004 0:33
Сообщение #5


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Если после установки твоего резидента у какой-нибудь программы в момент IRQ 1 будет AX = 0ACDCh, то она действительно станет DEAD. А если AX = 0AAAAh, то ей конечно в пору кричать - но этого никто не услышит (MS не гарантирует сохранность значений регистров, не используемых для передачи параметров) :P

Возможно я преувеличиваю, тем не менее, твоя программа использует достаточно опасную стратегию (вероятность серьёзной ошибки уже по условию не равна 0).


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dark
сообщение 14.10.2004 1:12
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


ИМХО - сильно преувеличиваешь, а вот одна бага есть - в момент установки прерывания если к нему будет обращение, то будут глюки =) там еще насо ограничивать текст CLI и STI


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 14.10.2004 4:14
Сообщение #7


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


CLI и STI не нужны, т. к.:
a) о них обязан позаботиться сам системный вызов DOS (ah = 25h / int 21h);
б) при входе в обработчик прерывания (программного или аппаратного) процессор сам обнуляет флаг IF, а при выходе (по iret) - восстанавливает вместе с другими флагами. Т. е., к моменту передачи управления на обработчик int 21h, прерывания и так будут запрещены.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 29.07.2025 7:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"