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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 19:23   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Обработчик прерывания

Написала обработчик который должен при нажатии клавиши w выдать ее сканкод на экран:
Код:
.model tiny
.code
org 100h
main:
;получение таблицы
      push es
      xor ax,ax
      mov es,ax
;получение старого обработчика
      mov ax,word ptr es:[09h*4]
      mov word ptr old_handler,ax
      mov ax,word ptr es:[09h*4+2]
      mov word ptr old_handler+2,ax

;запись нового обработчика
     mov ax,cs
     mov word ptr es:[09h*4+2],ax
     mov ax,offset handler
     mov word ptr es:[09h*4],ax

;оставление резедентно
     pop es
     mov bx,offset last_byte
     int 27h
     ret

handler:
         push ax
         push es ds si di cx bx dx
         ;pusha

         xor ax,ax
         in al,60h
         ;w
         cmp al,11h
         jne standart_handler


         push ax
         xor dx,dx
         div d
         cmp ax,10
         jl met
         add ax,'A'
         jmp io
met:
        add ax,'0'
io:
         mov ah,02h
         mov dx,ax
         int 21h
         pop ax
         cmp dx,10
         jl met2
         add dx,'A'
         jmp io2
met2:
        add dx,'0'
io2:
         mov ah,02h
         mov dx,dx
         int 21h

standart_handler:
               pop dx bx cx di si ds es ax
               jmp dword ptr cs:old_handler
               iret
               
old_handler dd ?
d dw 16
last_byte:
end main
Но когда запускаю, падает досбокс
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.12.2009, 19:40   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

скорей всего не настроен регистр DS. при выполнении команды div d
обращение происходит к случайному сегменту нужно либо писать div cs: d, либо в начале обработчика сделать
Код:
push ds
push cs
pop ds
...
pop ds
jmp dword ptr cs:old_handler
iret, кстати писать не нужно, управление туда никогда не дойдет)))
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 03.12.2009 в 19:41. Причина: задолбали смайлики!!!
alexcoder вне форума Ответить с цитированием
Старый 03.12.2009, 19:47   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Написала все равно падает
Код:
.model tiny
.code
org 100h
main:
;poluchenie IDT
      push es
      xor ax,ax
      mov es,ax
;poluchenie 09h v old_handler
      mov ax,word ptr es:[09h*4]
      mov word ptr old_handler,ax
      mov ax,word ptr es:[09h*4+2]
      mov word ptr old_handler+2,ax

;zap new_handler
     mov ax,cs
     mov word ptr es:[09h*4+2],ax
     mov ax,offset handler
     mov word ptr es:[09h*4],ax

;rezedentno
     pop es
     mov bx,offset last_byte
     int 27h
     ret

handler:
         push ax
         push es ds si di cx bx dx
         ;pusha

         xor ax,ax
         in al,60h
         ;w
         cmp al,11h
         jne standart_handler


         push ax
         xor dx,dx
         div cs:d
         cmp ax,10
         jl met
         add ax,'A'
         jmp io
met:
        add ax,'0'
io:
         mov ah,02h
         mov dx,ax
         int 21h
         pop ax
         cmp dx,10
         jl met2
         add dx,'A'
         jmp io2
met2:
        add dx,'0'
io2:
         mov ah,02h
         mov dx,dx
         int 21h

standart_handler:
               pop dx bx cx di si ds es ax
               jmp dword ptr cs:old_handler
               iret

old_handler dd ?
d dw 16
last_byte:
end main
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.12.2009, 20:25   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

int 21h нельзя пользоваться, когда запрещены прерывания(а во время обработки int 9 они запрещены). Попробуйте пользоваться ф-цией 0eh int 10h.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 20:27   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

а так код правильный?
Код:
.model tiny
.code
org 100h
main:
;poluchenie IDT
      push es
      xor ax,ax
      mov es,ax
;poluchenie 09h v old_handler
      mov ax,word ptr es:[09h*4]
      mov word ptr old_handler,ax
      mov ax,word ptr es:[09h*4+2]
      mov word ptr old_handler+2,ax

;zap new_handler
     mov ax,cs
     mov word ptr es:[09h*4+2],ax
     mov ax,offset handler
     mov word ptr es:[09h*4],ax

;rezedentno
     pop es
     mov bx,offset last_byte
     int 27h
     ret

handler:
        ; push ax
         push es ds si di cx bx dx
         ;pusha

         xor ax,ax
         in al,60h
         ;w
         cmp al,11h
         jne standart_handler


       ; push ax
		mov ah,0eh
		mov bx,0
		int 10h
;         xor dx,dx
;         div cs:d
;         cmp ax,10
;         jl met
;         add ax,'A'
;         jmp io
;met:
;        add ax,'0'
;io:
;         mov ah,02h
;         mov dx,ax
;         int 21h
;         pop ax
;         cmp dx,10
;         jl met2
;         add dx,'A'
;         jmp io2
;met2:
;        add dx,'0'
;io2:
;         mov ah,02h
;         mov dx,dx
;         int 21h
		

standart_handler:
               pop dx bx cx di si ds es ax
               jmp dword ptr cs:old_handler
               iret

old_handler dd ?
d dw 16
last_byte:
end main
Все равно падает
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 03.12.2009 в 20:39.
Sparky вне форума Ответить с цитированием
Старый 03.12.2009, 20:36   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Ну... после метки met: там творится с dx, что-то непонятное мне.

Вообще вылет резидента может быть только при делении, вызове прерываний и при выходе (неправильная работа с push pop).
Из-за остального, что приходит мне на ум программа может либо зависать, либо просто неправильно работать.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 20:38   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

а вот теперь посотри отредактировала. Убрала метки, или я не правильно поняла твой пост до этого?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.12.2009, 20:43   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот теперь появилась реакция, при нажатии обычных клавиш все ок, а при нажатии w
Изображения
Тип файла: jpg Безымянный.jpg (117.8 Кб, 105 просмотров)
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.12.2009, 20:53   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
а вот теперь посотри отредактировала. Убрала метки, или я не правильно поняла твой пост до этого?
Да я про первый код говорил.....

Насчет того, который теперь. Это уже, видимо, из-за неправильной работы с push pop
Вначале резидента ax теперь не сохраняется, а при выходе его выталкивают.
Да и деление и прочую арифметику ес-но нужно вернуть.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 20:58   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

арифметика использовалась для вывода кода символа, а теперь вроде за это отвечает 10 прерывание? тогда получается она не нужна
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик вектора прерывания Festovec Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 07.04.2010 10:05
Создание резидентной программы (обработчик прерывания). Петруха Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 23.03.2009 16:31
Прерывания на портах ForzaJuve Win Api 3 16.02.2009 18:40
Прерывания Kn793 Общие вопросы Delphi 3 10.01.2009 18:43
прерывания sergei64_89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 22.04.2008 13:37