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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 17:04   #1
FARRIAN
 
Регистрация: 25.05.2009
Сообщений: 8
По умолчанию Сделать собственное прерывание при помощи int 23h

ребят, помогите плз, нужно сделать собственное прерывание при помощи int 23h, чтобы прерывание происходило после нажатия ctrl+c, и выдавался звуковой сигнал (печать символа с кодом 07h), вот код:

Код:
Stk    SEGMENT  STACK
          DB 256 DUP(?)
Stk    ENDS 

DATA      SEGMENT
		KEEP_CS DW 0 ; для хранения сегмента
		KEEP_IP DW 0 ; и смещения прерывания		
DATA      ENDS


CODE      SEGMENT
          ASSUME CS:CODE, DS:DATA, SS:Stk

rout proc far ;начало процедуры
               push ax ;сохраняем все изменяемые регистры
               push dx ;сохраняем все изменяемые регистры

               mov ah,07h;выдача звукового сигнала
               int 21h;но я не уверен что правильно
 
               pop dx ;восстанавливаем регистры
               pop ax ;восстанавливаем регистры

               mov al,20h
               out 20h,al
               iret ;конец прерывания
rout endp ;конец процедуры



main proc far
              push ds
              sub ax,ax
              push ax
              mov ax,data
              mov ds,ax


              MOV  AH, 35H   ; функция получения вектора
              MOV  AL, 1CH   ; номер вектора
              INT  21H
              MOV  KEEP_IP, BX  ; запоминание смещения
              MOV  KEEP_CS, ES  ; и сегмента

              push ds
              mov dx,offset rout

              mov ax,seg rout ;cs ;сегмент процедуры
              mov ds,ax ;помещаем в ds
              mov ah,25h ;функция установки вектора
              mov al,60h ;номер вектора
              int 21h ;меняем прерывание

              pop ds ;восстанавливаем ds 

              int 23h ;наше прерывание

              CLI
              PUSH DS
              MOV  DX, KEEP_IP
              MOV  AX, KEEP_CS
              MOV  DS, AX
              MOV  AH, 25H
              MOV  AL, 1CH
              INT  21H          ; восстанавливаем вектор
              POP  DS
              STI


              ret
Main endp
code ends
	end Main
после запуска все наглухо виснет...пробовал вместо выдачи звука сделать вывод строки, но все равно не получается...
помогите плз

Последний раз редактировалось FARRIAN; 25.05.2009 в 20:45.
FARRIAN вне форума Ответить с цитированием
Старый 25.05.2009, 22:39   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

mov AH, 07h ;ф-я ввода с клавиатуры без эха, а не выдача звукового сигнала
Программа вроде рабочая. Что вам нужно: работа с загрузочной дискетой(как у вас в коде) или прерывание нажатия ctrl+c?
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 25.05.2009, 22:56   #3
FARRIAN
 
Регистрация: 25.05.2009
Сообщений: 8
По умолчанию

прерывание нажатия ctrl+c, блин, удивился что тут с загрузочной дискетой идет работа... в задании написано -"23h - прерывание, генерируемое при нажатии клавиш Control+C", поставил его, а тут дискета...
FARRIAN вне форума Ответить с цитированием
Старый 26.05.2009, 14:19   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
в задании написано -"23h - прерывание, генерируемое при нажатии клавиш Control+C
Ну правильно, а на сам код посмотри:
Код:
              MOV  AH, 35H   ; функция получения вектора
              MOV  AL, 1CH   ; номер вектора
              INT  21H
              MOV  KEEP_IP, BX  ; запоминание смещения
              MOV  KEEP_CS, ES  ; и сегмента
???
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 26.05.2009, 18:05   #5
FARRIAN
 
Регистрация: 25.05.2009
Сообщений: 8
По умолчанию

но ведь программа должна при завершении восстанавливать оригинальные векторы прерываний, вот здесь они запоминаются
Код:
              MOV  AH, 35H   ; функция получения вектора
              MOV  AL, 1CH   ; номер вектора
              INT  21H
              MOV  KEEP_IP, BX  ; запоминание смещения
              MOV  KEEP_CS, ES  ; и сегмента
или это неправельно?
FARRIAN вне форума Ответить с цитированием
Старый 26.05.2009, 23:31   #6
FARRIAN
 
Регистрация: 25.05.2009
Сообщений: 8
По умолчанию

все, разобрался
Код:
Stk    SEGMENT  STACK
          DB 256 DUP(?)
Stk    ENDS 

DATA      SEGMENT
		KEEP_CS DW 0 ; для хранения сегмента
		KEEP_IP DW 0 ; и смещения прерывания

		
		Message2 db 'prerivanie',10,13,'$' ;строка для сообщения
DATA      ENDS


CODE      SEGMENT
          ASSUME CS:CODE, DS:DATA, SS:Stk

rout proc far ;начало процедуры
push ax ;сохраняем все изменяемые регистры
push dx ;сохраняем все изменяемые регистры

mov ah,9h ;функция установки вектора
mov dx,offset message2 ;в dx загружаем адрес сообщения Message2
int 21h ;вывод строки на экран


pop dx ;восстанавливаем регистры
pop ax ;восстанавливаем регистры

mov al,20h
out 20h,al

iret ;конец прерывания
rout endp ;конец процедуры



main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax


MOV  AH, 35H   ; функция получения вектора
MOV  AL, 23H   ; номер вектора
INT  21H
MOV  KEEP_IP, BX  ; запоминание смещения
MOV  KEEP_CS, ES  ; и сегмента



push ds
mov dx,offset rout

mov ax,seg rout ;cs ;сегмент процедуры
mov ds,ax ;помещаем в ds
mov ah,25h ;функция установки вектора
mov al,23h ;номер вектора
int 21h ;меняем прерывание

pop ds ;восстанавливаем ds 

begin:
mov ah,0
int 16h
cmp al,3
jnz begin

int 23h ;наше прерывание



CLI
PUSH DS
MOV  DX, KEEP_IP
MOV  AX, KEEP_CS
MOV  DS, AX
MOV  AH, 25H
MOV  AL, 23H
INT  21H          ; восстанавливаем вектор
POP  DS
STI

ret

Main endp
code ends
	end Main
только не могу понять как звуковой сигнал выдать...
FARRIAN вне форума Ответить с цитированием
Старый 27.05.2009, 00:13   #7
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

прямое программирование динамика
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru

Последний раз редактировалось airyashov; 27.05.2009 в 00:18.
airyashov вне форума Ответить с цитированием
Старый 27.05.2009, 00:16   #8
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

прерывание не аппаратное
mov al,20h
out 20h,al
этот код только для вашей программы? в обработчике ds будет указывать неизвестно куда
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 27.05.2009, 18:37   #9
FARRIAN
 
Регистрация: 25.05.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от airyashov Посмотреть сообщение
прерывание не аппаратное
mov al,20h
out 20h,al
этот код только для вашей программы? в обработчике ds будет указывать неизвестно куда
с этим постараюсь разобраться, но программа работает как нужно
FARRIAN вне форума Ответить с цитированием
Старый 27.05.2009, 20:08   #10
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

FARRIAN, молоток!!! Поздравляю! У тебя много ненужного в коде!
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собственное прерывание на Ассемблере ViNcHeStEr Помощь студентам 9 16.05.2009 15:16
Центрирование в при помощи <td>, <div>, <p> Van'Denis HTML и CSS 8 07.05.2009 04:58
Отладка при помощи gdb kosh1984 Общие вопросы C/C++ 0 08.02.2009 14:36
Собственное значение матриц. Mixasik Помощь студентам 2 18.10.2008 21:30