Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2018, 23:38   #1
bivok
Новичок
Джуниор
 
Регистрация: 29.04.2018
Сообщений: 2
По умолчанию ошибка при выгрузке резидента

Цель программы: разработка обработчика прерываний сигналов таймера.
Резидент должен выгружаться по ключу /un, но при вызове программы с этим ключом, программа виснет, что-то путаюсь с метками и не могу понять, в чем ошибка, прошу помощи
Код:
.286

DSEG            SEGMENT
  IS_UNLOAD		db	0
  STR_ALRLOADED db 'is unloaded ', 13, 10, '$'
  STR_NOTHING   db 'is not unloaded', 13, 10 , '$'
DSEG            ENDS

SSEG            SEGMENT STACK
                dw 50H DUP(?)
SSEG            ENDS

CSEG            SEGMENT
                ASSUME DS:DSEG, SS:SSEG, CS:CSEG, ES:NOTHING

RESIDENT       PROC    FAR
                jmp     BEGIN

  KEEP_IP       dw      ?
  KEEP_CS       dw      ?
  PSP           dw      ?
  SIGN          dw      1234H	
  COUNTER 		db 		'Number of calls:    '
  COUNT         db      '000'

BEGIN:          pusha
                push    DS
                push    ES

                mov     DX, SEG RESIDENT
                mov     DS, DX

                mov     DH, '0'
                mov     DL, '9'
                mov     DI, OFFSET COUNT+2

I_START:        cmp     DI, OFFSET COUNT
                jl      I_STOP
                cmp     [DI], DL
                je      I_ZERO
                mov     DL, [DI]
                inc     DL
                mov     [DI], DL
                jmp     I_STOP

I_ZERO:         mov     [DI], DH
                dec     DI
                jmp     I_START

I_STOP:         mov     AX, 1300H
                mov     BX, 000FH
                mov     CX, 0017H
                mov     DX, 0000H
                push    CS
                pop     ES
                mov     BP, OFFSET COUNTER
                int     10H

                pop     ES
                pop     DS
                popa
                mov     AL, 20H
                out     20H, AL
                iret
RESIDENT       ENDP

LAST_BYTE:

;-----------------------------
PRINT           PROC    NEAR
                push    AX
                mov     AX, 0900H
                int     21H
                pop     AX
                ret
PRINT           ENDP

;-----------------------------
MAIN            PROC    FAR
                mov     AX, DSEG
                mov     DS, AX
                mov     CS:[PSP], ES
				mov     DL, ES:[81H]
				mov     AX, 351CH
                int     21H
                mov     CS:[KEEP_CS], ES
                mov     CS:[KEEP_IP], BX
				jmp 	GO
GO:
				;inc		SI
				cmp		DL, 0Dh
				je		LOAD
				mov     DL, ES:[82H]
                cmp     DL, '/'
                jne     GO
				mov     DL, ES:[83H]
				cmp		DL,'u'
				jne		GO
				mov     DL, ES:[84H]
				cmp		DL,'n'
				ja		GO
				;cmp		byte ptr ES:2[SI], ' '
				;jne		GO
				;jne		LOAD
				mov     DX, ES:[SIGN]
                cmp     DX, 1234H
                jne     NOTHING_UNLOAD

                cli
                push    DS
                push    ES
                mov     DS, ES:[KEEP_CS]
                mov     DX, ES:[KEEP_IP]
                mov     AX, 251CH
                int     21H
                pop     ES
					sti

                pop     DS
                push    ES
                mov     ES, ES:[PSP]
                mov     ES, ES:[2CH]
                mov     AX, 4900H
                int     21H
                pop     ES
                mov     ES, ES:[PSP]
                int     21H

                jmp     STOP

LOAD:           mov     DX, ES:[SIGN]
                cmp     DX, 1234H
                je      LOADED

                push    DS
                mov     DX, OFFSET RESIDENT
                mov     AX, SEG RESIDENT
                mov     DS, AX
                mov     AX, 251CH
                int     21H
                pop     DS

                mov     DX, OFFSET LAST_BYTE + 1F0H
                mov     CL, 4
                SHR     DX, CL
                inc     DX
                mov     AX, 3100H
                int     21H
                jmp     STOP

LOADED:         mov     DX, OFFSET STR_ALRLOADED
                call    PRINT
                jmp     STOP

NOTHING_UNLOAD: mov     DX, OFFSET STR_NOTHING
                call    PRINT

STOP:         
				mov ax, 4C00h
                int 21h
MAIN            ENDP
CSEG            ENDS
                END MAIN
Тут я пытаюсь сделать проверку на ключ

Код:
				jmp 	GO
GO:
				;inc		SI
				cmp		DL, 0Dh
				je		LOAD
				mov     DL, ES:[82H]
                cmp     DL, '/'
                jne     GO
				mov     DL, ES:[83H]
				cmp		DL,'u'
				jne		GO
				mov     DL, ES:[84H]
				cmp		DL,'n'
				ja		GO
				;cmp		byte ptr ES:2[SI], ' '
				;jne		GO
				;jne		LOAD
				mov     DX, ES:[SIGN]
                cmp     DX, 1234H
                jne     NOTHING_UNLOAD
bivok вне форума Ответить с цитированием
Старый 29.04.2018, 23:41   #2
bivok
Новичок
Джуниор
 
Регистрация: 29.04.2018
Сообщений: 2
По умолчанию

исправляя этот код, я получал, что резидент выгружался, но при повторном запуске с ключом /un снова загружался, хотя не должен
bivok вне форума Ответить с цитированием
Старый 30.04.2018, 12:40   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от bivok Посмотреть сообщение
но при повторном запуске с ключом /un снова загружался, хотя не должен
Код:
; fasm-code. проверка ключа
;----------
main:  cmp   dword[81h],' /un'  ; есть ключ?
       jne   @test              ; нет - на проверку присутствия в памяти.
Почитай про INT-2Fh, которое специально ввели для твоего случая.
Этот инт проверяет, загружен уже резидент в память, или нет:
Код:
INT 2Fh:  Мультиплексорное прерывание
----------
Ввод:   АН = ID программы
             00h–7Fh  резерв для DOS/Windows
             B8h–BFh  резерв для сетевых функций
             C0h–FFh  отводится для внешних программ
        AL = 00h - проверка наличия программы в памяти
Выход:  AL = FFh, если резидент с номером АН висит в памяти.
..то-есть задаёшь для своей программы личный идентификатор в AH (любой, в диапазоне C0..FFh), и на входе в программу вызвав INT-2Fh проверяешь AL. Если резидент в памяти, то AL=FFh, иначе - чисто: http://www.frolov-lib.ru/books/bsp/v18/ch5_3.html
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 30.04.2018 в 12:45.
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выгрузке домена приложения uuu C# (си шарп) 1 07.06.2015 11:47
Ошибка при выгрузке Word sid1868 Помощь студентам 2 14.05.2013 00:12
Ошибка при выгрузке таблицы DBGrid в WORD sid1868 Общие вопросы Delphi 1 13.05.2013 10:01
Формат столбца при выгрузке в Эксель Swatch Microsoft Office Access 3 02.11.2010 19:19
Крах при выгрузке DLL prizrak1390 Общие вопросы Delphi 15 11.09.2009 19:08