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

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

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

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

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

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

Необходимо написать обрабочик который по нажатию ctrl+a выдает на экране hello world, и если ctrl+s выгружает программу из памяти
Вот что у меня получилось:
Код:
model tiny
.code
org 100h
main:
;============================================
;получение таблицы векторов
        push es
        xor ax,ax
        mov es,ax

;==========================================
;получение вектора 9 прерывания
        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

;=====================================
;мой обрабочик
handler:
        push es ds si di cx bx dx ax
        xor ax,ax
        in al,60h
       ;проверка на нажатие ctrl не знаю как написать, преподаватель сказал что есть какой то бит в каком то байте
      ; jne standart_handler	;если не нажата клавиша ctrl переход на стандартный обработчик
      cmp al,1eh
      je ctrl1
      cmp al,1fh
      je ctrl2
      jmp standart_handler		

ctrl1:
	mov ah,13h
	mov cx,11
	mov dh,3
	mov dl,3
	mov bp,offset message ;текст не выводится просто курсор перемещается на 11 позиций
	int 10h
ctrl2:
           ;выгрузка, ее напишу
;=================================================
;завершение обработки

        mov al,20h      ;яюёырть ёшуэры "ъюэхц яЁхЁытрэшя"
        out 20h,al  ; ъюэтЁюыыхЁу яЁхЁытрэшщ
        pop ax dx bx cx di si ds es
        iret


;==================================================
;стандартный обработчик
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler

        old_handler dd ?
        message db "Hello world",0ah,0dh,'$'
        
last_byte:
end main
Ребят помогите пожалуйста доделать чтобы еще и нажития ctrl проверялось, и почему строку не выводит?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 08.12.2009, 12:53   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Нажатие ctrl можно проверить вызвав ф-цию 02 int 16h. Если он нажат, то будет установлен 2й бит. Или можно проверять этот же бит по аддресу 0040:0017h.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 08.12.2009, 13:33   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
mov bp,offset message ;текст не выводится просто курсор перемещается на 11 позиций
а что у нас в es?
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru

Последний раз редактировалось airyashov; 08.12.2009 в 13:36.
airyashov вне форума Ответить с цитированием
Старый 08.12.2009, 15:51   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

поидее es указывает на таблицу векторов прерываний, а в данной ситуации должен брать message оттуда, поэтому поидее нужно
Код:
model tiny
.code
org 100h
main:
;============================================
;яюыучхэшх трсышцы тхътюЁют
        push es
        xor ax,ax
        mov es,ax

;==========================================
;яюыучхэшх тхътюЁр 9 яЁхЁытрэшя
        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

;=====================================
;ёюсёттхээыщ юсЁрсютчшъ
handler:
      push es ds si di cx bx dx ax
      xor ax,ax
      mov ah,02h
      int 16h
      test al,00000100b
      jz standart_handler	;если не нажата клавиша ctrl переход на стандартный обработчик
	in al,60h	      
      cmp al,1eh
	jne standart_handler
	push es
	mov ax,cs
	mov es,ax
	mov ah,13h
	mov cx,11
	mov dh,3
	mov dl,3
	mov bp,offset message
	int 10h
	pop es
	
;=================================================
;чртхЁшхэшх юсЁрсютъш

        mov al,20h      ;яюёырть ёшуэры "ъюэхц яЁхЁытрэшя"
        out 20h,al  ; ъюэтЁюыыхЁу яЁхЁытрэшщ
        pop ax dx bx cx di si ds es
        iret


;==================================================
;тючтЁрт ётрэфрЁтэюую яЁхЁытрэшя
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler


        old_handler dd ?
        t db ?
        message db "Hello world",0ah,0dh,'$'
        
last_byte:
end main
начало выводить только не то вернее выдает что-то страшное
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 08.12.2009 в 15:59.
Sparky вне форума Ответить с цитированием
Старый 09.12.2009, 10:24   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Ребят еще вопрос. Вот код котрый у меня получился:
Код:
model tiny
.code
org 100h
main:
;============================================
;яюыучхэшх трсышцы тхътюЁют
        push es
        xor ax,ax
        mov es,ax

;==========================================
;яюыучхэшх тхътюЁр 9 яЁхЁытрэшя
        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

;=====================================
;ёюсёттхээыщ юсЁрсютчшъ
handler:
      push es ds si di cx bx dx ax
      xor ax,ax
      mov ah,02h
      int 16h
      test al,00000100b
      jz standart_handler	;если не нажата клавиша ctrl переход на стандартный обработчик
	in al,60h	      
      cmp al,1eh	;если нажата клавиша "a" то выводим на экран hello world в противном случае проверяем "s"
	jne ctrl_s
	
	push es
	mov ax,cs
	mov es,ax
	
	mov ah,13h
	mov cx,11
	mov dh,3
	mov dl,3
	mov bp,offset message
	int 10h
	pop es
	jmp end_handler
ctrl_s:
	cmp al,1fh	;если нажата клавиша "s" то выводим на экран hello world в противном случае переходим на стандартный обработчик
	jne standart_handler
	;выгрузка программы
;=================================================
;чртхЁшхэшх юсЁрсютъш
end_handler:
        mov al,20h      ;яюёырть ёшуэры "ъюэхц яЁхЁытрэшя"
        out 20h,al  ; ъюэтЁюыыхЁу яЁхЁытрэшщ
        pop ax dx bx cx di si ds es
        iret


;==================================================
;тючтЁрт ётрэфрЁтэюую яЁхЁытрэшя
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler


        old_handler dd ?
        t db ?
        message db 'Hello world',0ah,0dh,'$'
        
last_byte:
end main
Первый вопрос, что не так и почему выдается такая ошибка?
И второй вопрос как выгрузить прогамму из памяти?
Изображения
Тип файла: jpg Безымянный.jpg (114.0 Кб, 86 просмотров)
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 09.12.2009, 10:43   #6
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

вообще-то в MS-DOS для резидентов нет стандартного механизма выгрузки, поэтому приходится извращаться
можно почитать Зубкова гл 5.9
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 09.12.2009, 11:14   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

да вот как раз этим и занимаюсь, но запуталась уже,а можешь что-то про первую ошибку сказать?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 09.12.2009, 12:43   #8
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

mov ah,13h
у функции 13h есть еще настройки в al
проверил вашу программу у меня работет
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие комбинации клавиш pix_l Общие вопросы Delphi 7 31.03.2009 10:12
Нажатие клавиш bashkos JavaScript, Ajax 6 23.09.2008 19:01
Имитация нажатия комбинации клавиш Zeraim Win Api 15 05.05.2008 20:35
Нажатие клавиш VanDerKeen Win Api 1 03.06.2007 21:13