Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ребята очень нужна помощь с освоением резидентов!!!!  (Прочитано 6627 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Bobadd
Гость
« : 19-12-2005 01:23 » 

в общем дело обстоит так. Пишу курсач по асму, суть заключается в том, чтобы при работе флопа выводился какой-либо индикатор. Я сделал перехват 13-го прерывания, с грехом пополам за часов 10 написал чтоб эта грешная лампочка моргала, в общем дошло дело до того, как из этого резидента выходить (естественно подчищая за собой). В курсаче необходимо чтобы выходила по нажатию ctrl+u. Я перехватываю 9-е прерывание и делаю следующую вещь:
new09h     proc far
pushf
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
in al, 60h
cmp al,1Dh
jne not_ctrl
mov ifctrl,1
jmp endd
not_ctrl:
cmp al,16h
jne no_u
cmp ifctrl,1
jne no_u
mov ax,0FFFFh
pushf
call cs:[new2fh]
mov ah,0Ch   
mov al,9      ;выбиpaeм левую ф-ию
int 21h       ;чиcтим буфep
mov ah,5
mov cl,13   
int 16h                ; Здесь в обработчике вызывается ещё и int 09h
     cli                     
     in al, 61h
     or al, 80h
     out 61h, al
     and al, 7fh
     out 61h, al
     mov al, 20h               ; EOI
     out 20h, al
     sti
pop     es        ;восстанавливаем регистры
pop     ds
pop     bp
pop     di
pop     si
pop     dx
pop     cx
pop     bx
pop     ax
popf
jmp endpp
no_u:
mov ifctrl,0


endd:
pop     es        ;восстанавливаем регистры
pop     ds
pop     bp
pop     di
pop     si
pop     dx
pop     cx
pop     bx
pop     ax

popf
jmp cs:[old09h]
 
endpp:

iret
new09h     endp

Функция 2fh - это мультиплексное прерывание, я использую именно для вычищения оперативки:
new2fh proc far

cmp ax,3210h
je proverka

cmp ax,0FFFFh
jne go_to_old

pusha                     
push es
push ds

push cs
pop ds
mov ah,9h
mov dx,offset EndProg
int 21h


RESTOREVECTOR 13h
RESTOREVECTOR 09h                ;;портить будет только ds и ax
RESTOREVECTOR 2Fh


mov es, cs:2ch            ; Unload PSP Environment
mov ah, 49h
int 21h

mov ax, cs           ;; Delete our resident, free memory
mov es, ax           ;; es - segment PSP
mov ah, 49h
int 21h                ;; Delete


pop ds
pop es
popa


proverka:
mov ax,0123h          ;; Priznak
jmp outp

go_to_old:

pushf
call cs:old2Fh
outp:
iret
new2Fh     endp

Так вот теперь о проблемах. В общем по возвращению из int 2fh прога попадает на iret (в функции 09h) и... виснет... Как только не перепробовал, ничего не помогает, всее попробовал. Если вам нетрудно, подскажите чайнику! Если надо могу вывесить весь код программы.
З.Ы. Есть такая прогулина DOSBOX (Эмулятор доса под винду) - так вот в ней всё прекрасно работает и даже вычищает нормально
З.Ы.Ы. Под досом 6.22 выход не работает!
Заранее спасибо. Bobadd
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 19-12-2005 23:03 » 

Начну с замечаний:
Цитата
Код:
pushf
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
Код:
pusha
// или pushad для принудительного задания 32-ухбитного контекста

Цитата
mov al,9      ;выбиpaeм левую ф-ию
int 21h       ;чиcтим буфep
Почем "левую"? А ыт уверен, что ее можно вызывать с запрещенными прерываниями? Ведь, перед обработкой аппаратных прерываний, происходит запрет оных.

Я пока не смог целиком прочесть - так что, будут еще замечания.
« Последнее редактирование: 19-12-2005 23:07 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bobadd
Гость
« Ответ #2 : 19-12-2005 23:33 » 

спасибо, я уже поправил все что мог, если интересно могу написать, что было не так =))))


Появилась новая проблема: я делаю входной параметр /? - хелпой (тупой вывод строки хелп)
так вот после того, как написать gg.com /?
он выводит хелпу - все отлично
но потом я хочу сделать gg.com
а он снова выводит хелпу (ну и прыгает в конец проги *по задумке*)

Если изначально  gg.сом сделать без ключа /? то все отлично работает и т.д.
вот код

CHECK proc near

mov si, 81h            
mov cx, 32              
beg_loop:
mov ah,cs:[si]
cmp ah, '/'        
jne not

mov ah,cs:[si+1]
cmp ah,'?'
jne not
je help
not:
inc si              
loop short beg_loop                                  ;; Try to find our handler...
jmp nohelp

help:
mov flag,1
OUTSTR helpmessage
nohelp:

ret
CHECK endp

--------------------------
(код при инициализации)
pusha
call CHECK
popa
cmp flag,1
je Endoftheprog

-------------------------
Endoftheprog:
mov ax,cs:[2ch]     ;принудительная очистка
mov es,ax             ; PSP
mov ah,49h           ; сделал уже  от безысходности
int 21h


ret
init endp
« Последнее редактирование: 19-12-2007 22:16 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines