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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2014, 23:16   #1
Greench
 
Регистрация: 25.03.2014
Сообщений: 3
По умолчанию Assebler резидентная программа

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

Код:
code segment  
assume cs:code,ds:code ; CS и DS указывают на сегмент кода
org 100h ;Увеличиваем все указатели на данные на 100h (256 байт)
;т.к. это место будет занято данными msdos (заголовком призапуске)

start:  
jmp     load   ;Выполняется только один раз

;------------------------------------------------------
oldsave dd ?;двойное слово для сохранения обработчика адреса int 9 BIOS 

resprog proc far
; вызовем старый обработчик
pushf
call    dword ptr cs:oldsave

pushf  ; создание в стеке структуры для IRET
push ax
push bx
push cx
push dx
push sp
push bp
push si
push di      
push ds ;Сохранить все регистры (ax,cx,dx,bx,sp,bp,si,di,ds)  

; определим код нажатой клавиши
mov ah, 01h
int 16h
jnz view_code   ; если код в буфере есть, то посмотрим, что за код
jmp exit     ; иначе выйдем из резидента

view_code:
; если нажали на CTRL+X, то выгружаем резидент из памяти
cmp ax, 2d18h
je  exit

; если нажали на CTRL+S, то выполнить необходимое действие
cmp ax, 1f13h
je startproc
jmp exit

startproc:

; резидентная часть кода !! 

call    clear_keys

exit: 
  
push ds
push di
push si
push bp
push sp
push dx
push cx
push bx      
push ax ; ;Восстановить все регистры (ax,cx,dx,bx,sp,bp,si,di,ds)
popf

iret  ; возврат из обработчика

stop:

; восстановим старый обработчик прерывания от клавиатуры
mov dx, word ptr cs:oldsave        ; смещение обработчика
mov ds, word ptr cs:[oldsave+2]    ; сегмент обработчика
mov ah, 25h         ; функция установки вектора обработчика прерывания
mov al, 09h         ; восстановим вектор 09h
int 21h

; вывод сообщения о выгрузке из памяти
mov si, offset cs:prn_unload    ; адрес сообщения о выгрузке
mov es, cs:2Ch          ; выгрузка psp (префикс программного сегмента)
mov ah, 49h
int 21h
push    cs      ; освобождение памяти,
pop es      ; которую занимает наш резидент
mov ah, 49h
int 21h

call    clear_keys

push ds
push di
push si
push bp
push sp
push dx
push cx
push bx      
push ax ; ;Восстановить все регистры (ax,cx,dx,bx,sp,bp,si,di,ds)
popf
iret

prn_unload db ' program unload $'   ; сообщение "программа выгружена"
prn_start_procedure db 'procedure started $'   ; сообщение о старте подпрограммы

resprog endp

;--------------------------------------------------------------
; подпрограмма для очистки буфера клавиатуры
clear_keys  proc
    push    ax      ; сохраним используемые регистры
clear_keys_0:
    mov ah, 01h ; есть ли в буфере код клавиши
    int 16h
    jz  clear_keys_1    ; если нет кода, то на выход
    mov ah, 00h ; иначе удаляем символ из буфера клавиатуры
    int 16h
    jmp clear_keys_0    ; проверим, есть ли ещё символ в буфере клавиатуры
clear_keys_1:
    pop ax      ; восстановим используемые регистры
    ret
clear_keys  endp
;--------------------------------------------------------------
; Загрузка резедента в память
load: 
push    cs      ; установим сегментный регистр DS на текущий
pop ds
mov ah, 09h ; функция вывода сообщения о запуске программы
mov dx, offset prn_run  ; адрес ds:dx указывает на сообщение
int 21h


; запоминаем адрес старого обработчика прерывания INT 09h
mov ah, 35h ; функция получения вектора прерывания
mov al, 09h ; получаем адрес обработчика 9-го прерывания
int 21h
mov word ptr cs:oldsave, bx    ; запомним смещение
mov word ptr cs:[oldsave + 2], es  ; запомним сегмент

; установим обработчик 9-го прерывания на нашу функцию
mov dx, offset resprog ; получим смещение нашего обработчика
mov ah, 25h     ; функция установки вектора
mov al, 09h
int 21h

; выводим сообщение об установке резидента в память
mov ah, 09h  
mov dx, offset prn_load
int 21h

mov dx,offset load;Размер программы
int 27h;Завершить и остаться резидентом (адрес программы в dx-1)

; сообщения
prn_run db  'Resident program ', 13, 10   ; сообщение "резидентная программа "
    db  'press key:', 13, 10                  ; сообщение "управление:"
    db  'CTRL+S - start', 13, 10              ; начать действие подпрограммы
    db  'CTRL+X - exit & unload from memory', 13, 10, '$' ; выгрузить из памяти
prn_load    db  'load to memory ok', 13, 10, '$'      ; сообщение "программа оставлена резидентом"
;--------------------------------------------------------------

code ends 
end start
Greench вне форума Ответить с цитированием
Старый 26.03.2014, 09:33   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

программу не смотрел.
Вопрос, а где Вы проверяете? Вы же знаете, что под Windows это работать не будет? Нужен DOS (ну или виртуальная машина с DOS, DOSBox, на крайний случай)!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2014, 10:13   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Greench, push'ей в коде много. А вот pop'ов в достаточном количестве не наблюдаю.
vadimych вне форума Ответить с цитированием
Старый 26.03.2014, 10:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

vadimych, копи-паст он такой естественно, при восстановлении регистров надо попать
p51x вне форума Ответить с цитированием
Старый 26.03.2014, 12:44   #5
Greench
 
Регистрация: 25.03.2014
Сообщений: 3
По умолчанию

Я в Dosbox все тестирую
Greench вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Резидентная программа.Ассемблер lostgerrard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.06.2012 01:29
резидентная программа SchwarzeWolfin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2012 09:54
Резидентная программа Andr2011 Visual C++ 3 08.11.2011 16:49
Резидентная программа lilufonel Паскаль, Turbo Pascal, PascalABC.NET 0 25.05.2010 01:27
Резидентная программа! Nemesisking Общие вопросы C/C++ 8 29.09.2007 08:46