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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2010, 18:33   #1
repli
 
Регистрация: 10.02.2009
Сообщений: 6
По умолчанию Не работают комбинации alt+f11 alt+12

задание
на эkран вывести pазpешенные символы.на запpeщенные cимволы предyсмотреть pеакцию. paзpешенные cимволы: аlt+f1 - аlt+f12

сам код (рабочий)
Код:
                .model		tiny
		.stack		100h
		.data
                ff1 db 'alt_f1','$'
		ff2 db 10,13, 'alt+F2', '$'
		ff3 db 10,13, 'alt+F3', '$'
		ff4 db 10,13, 'alt+F4', '$'
		ff5 db 10,13, 'alt+F5', '$'
		ff6 db 10,13, 'alt+F6', '$'
		ff7 db 10,13, 'alt+F7', '$'
		ff8 db 10,13, 'alt+F8', '$'
		ff9 db 10,13, 'alt+F9', '$'
		ff10 db 10,13, 'alt+F10', '$'
		ff11 db 10,13, 'alt+F11', '$'
		ff12 db 10,13, 'alt+F12', '$'
                fff db   'Error$'
		.code
MAIN:
 mov ax,DGROUP	 ;сегментный адрес в АХ
 mov ds,ax	 ; в ДС 
  mov ah,0 
  int 16h 
;--------------------alt_f 
  cmp ah,104          ;alt+f1
  jz f1  
  cmp ah,105          ;alt+f2
  je f2  
  cmp ah,106          ;alt+f3
  jz f3 
  cmp ah,107          ;alt+f4
  jz f4
  cmp ah,108          ;alt+f5
  jz f5
  cmp ah,109          ;alt+f6
  jz f6
  cmp ah,110          ;alt+f7
  jz f7
  cmp ah,111          ;alt+f8
  jz f8
  cmp ah,112          ;alt+f9
  jz f9 
  cmp ah,113          ;alt+f10
  jz f10 
  cmp ah,139          ;alt+f11
  jz f11
  cmp ah,140          ;alt+f12
  jz f12
  ;jmp A
   mov dx, offset fff 
 mov ah,09h
 int 21h 
  mov ah,02h				; вывод звука
 mov dl,07h				; символ звука
 int	21h				; вывести
 jmp MAIN
;-------------------- 
f1:   ;вывод соответствующего сообщения для нажатой комбинации
 mov dx, offset ff1 
 mov ah,09h
 int 21h 
 jmp MAIN 
f2: 
 mov ah,09h 
 mov dx, offset ff2 
 int 21h 
 jmp MAIN 
f3: 
 mov ah,09h 
 mov dx, offset ff3 
 int 21h 
 jmp MAIN  
f4: 
 mov ah,09h 
 mov dx, offset ff4 
 int 21h 
 jmp MAIN 
f5: 
 mov ah,09h 
 mov dx, offset ff5 
 int 21h 
 jmp MAIN
f6: 
 mov ah,09h 
 mov dx, offset ff6 
 int 21h 
 jmp MAIN  
f7: 
 mov ah,09h 
 mov dx, offset ff7 
 int 21h 
 jmp MAIN 
f8: 
 mov ah,09h 
 mov dx, offset ff8 
 int 21h 
 jmp MAIN 
f9: 
 mov ah,09h 
 mov dx, offset ff9 
 int 21h 
 jmp MAIN 
f10:     
 mov ah,09h
 mov dx, offset ff10 
 int 21h 
 jmp MAIN 
f11:     
 mov ah,09h 
 mov dx, offset ff11 
 int 21h 
 jmp MAIN  
f12:     
 mov ah,09h
 mov dx, offset ff12 
 int 21h 
 jmp MAIN 
;========================= 
exit: 
     mov ah,4ch          ;выход
     int 21h 
END MAIN
всё работает, кроме сочетаний alt+f11 alt+f12
все скэн коды пересмотрел. для alt+f11 - 139 alt+f12 - 140.
при нажатии реакции никакой.
может кто поможет решить проблему?

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

Скорее всего какой-то косяк от эмулятора доса в винде. Эти сочетания просто не приходит в дос программы при int 16h.
Можно попробовать получать скан коды другими путями, например прямо из порта 60h. так, вроде, работает, только сами числа другие.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 17.02.2010 в 19:11.
Goodwin98 вне форума Ответить с цитированием
Старый 17.02.2010, 19:36   #3
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Твой код вообще как то по чудному сделан был...вот он не много преобразован в человеческий....
на счет ф11 и ф12....ща поковыряюсь...
CSEG segment
assume cs:CSEG,ds:CSEG,es:CSEG,ss:CSEG
org 100h

MAIN:
mov ah,0
int 16h
cmp ah,104 ;alt+f1
jz f1
cmp ah,105 ;alt+f2
je f2
cmp ah,106 ;alt+f3
jz f3
cmp ah,107 ;alt+f4
jz f4
cmp ah,108 ;alt+f5
jz f5
cmp ah,109 ;alt+f6
jz f6
cmp ah,110 ;alt+f7
jz f7
cmp ah,111 ;alt+f8
jz f8
cmp ah,112 ;alt+f9
jz f9
cmp ah,113 ;alt+f10
jz f10
cmp ah,139 ;alt+f11
jz f11
cmp ah,140 ;alt+f12
jz f12
;jmp A
mov dx, offset fff
mov ah,09h
int 21h
mov ah,02h ; ўлў®¤ §ўгЄ*
mov dl,07h ; бЁ¬ў®« §ўгЄ*
int 21h ; ўлўҐбвЁ
jmp MAIN
;--------------------
f1: ;ўлў®¤ ᮮ⢥вбвўго饣® б®®ЎйҐ*Ёп ¤«п **¦*в®© Є®¬ЎЁ**жЁЁ
mov dx, offset ff1
mov ah,09h
int 21h
jmp MAIN
f2:
mov ah,09h
mov dx, offset ff2
int 21h
jmp MAIN
f3:
mov ah,09h
mov dx, offset ff3
int 21h
jmp MAIN
f4:
mov ah,09h
mov dx, offset ff4
int 21h
jmp MAIN
f5:
mov ah,09h
mov dx, offset ff5
int 21h
jmp MAIN
f6:
mov ah,09h
mov dx, offset ff6
int 21h
jmp MAIN
f7:
mov ah,09h
mov dx, offset ff7
int 21h
jmp MAIN
f8:
mov ah,09h
mov dx, offset ff8
int 21h
jmp MAIN
f9:
mov ah,09h
mov dx, offset ff9
int 21h
jmp MAIN
f10:
mov ah,09h
mov dx, offset ff10
int 21h
jmp MAIN
f11:
mov ah,09h
mov dx, offset ff11
int 21h
jmp MAIN
f12:
mov ah,09h
mov dx, offset ff12
int 21h
jmp MAIN
;=========================
mov ah,4h ;ўл室
int 21h

ff1 db 'alt_f1','$'
ff2 db 10,13, 'alt+F2', '$'
ff3 db 10,13, 'alt+F3', '$'
ff4 db 10,13, 'alt+F4', '$'
ff5 db 10,13, 'alt+F5', '$'
ff6 db 10,13, 'alt+F6', '$'
ff7 db 10,13, 'alt+F7', '$'
ff8 db 10,13, 'alt+F8', '$'
ff9 db 10,13, 'alt+F9', '$'
ff10 db 10,13, 'alt+F10', '$'
ff11 db 10,13, 'alt+F11', '$'
ff12 db 10,13, 'alt+F12', '$'
fff db 'Error$'





CSEG ends
end MAIN
Doholyan вне форума Ответить с цитированием
Старый 18.02.2010, 09:29   #4
repli
 
Регистрация: 10.02.2009
Сообщений: 6
По умолчанию

главное разобраться с alt+f11 alt+f12. красота программы не важна, лишь бы код работал. заранее благодарю.
repli вне форума Ответить с цитированием
Старый 18.02.2010, 13:37   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

[off]
Doholyan, у вас уже 244 сообщения. Ну неужели вы все еще не научились выделять код тегами ?
[/off]
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 18.02.2010, 14:23   #6
repli
 
Регистрация: 10.02.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Скорее всего какой-то косяк от эмулятора доса в винде. Эти сочетания просто не приходит в дос программы при int 16h.
Можно попробовать получать скан коды другими путями, например прямо из порта 60h. так, вроде, работает, только сами числа другие.
ок, смотри, попробовал через 60h:

in al,60h
cmp al,8b (проблема в том, что если писать через хексовые числа (а это 8b для alt+f11 и 8c для alt+f12)) соответственно сразу же выдается ошибка . можно написать cmp al,87 - тогда будут работать все комбинации alt+f11 ctrl+f11 shift+f11 и cmp al,88 для аналогичных комбинаций+f12. но это не дело.

помоги добить этот вопрос,plz!
repli вне форума Ответить с цитированием
Старый 18.02.2010, 14:40   #7
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Сообщение от repli Посмотреть сообщение
ок, смотри, попробовал через 60h:

in al,60h
cmp al,8b (проблема в том, что если писать через хексовые числа (а это 8b для alt+f11 и 8c для alt+f12)) соответственно сразу же выдается ошибка . можно написать cmp al,87 - тогда будут работать все комбинации alt+f11 ctrl+f11 shift+f11 и cmp al,88 для аналогичных комбинаций+f12. но это не дело.
Это скан-коды для F11 и F12. А нажата ли кнопка alt проверять другими путями. Для примера считать состояние через
Код:
mov ah,02
int 16h
или прочитать байт, который по аддресу 0040:0017h.
Если третий бит включен — значит альт нажат.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 18.02.2010, 16:51   #8
repli
 
Регистрация: 10.02.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Для примера считать состояние через
Код:
mov ah,02
int 16h
почему: ah,02? в аh вроде 0 нужно помещать

пытался пробить alt. его код - 38.
значит:
Код:
MOV AH,00 ;Выполнить ввод с клавиатуры
INT 16H ;
CMP AL,38;
JE gonextkey ; нет - выйти
но при отслеживании нажатия одного alt нет никакой реакции! (возможно из-за того, что он всегда идет с кем-то в комбинации)
repli вне форума Ответить с цитированием
Старый 18.02.2010, 16:56   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
почему: ah,02? в аh вроде 0 нужно помещать
Код:
mov ah,02 ; получить статус shift-клавиш.
int 16h
Так понятнее ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 18.02.2010, 17:09   #10
repli
 
Регистрация: 10.02.2009
Сообщений: 6
По умолчанию

Всё оказалось проще.
Подсказали на другом форуме.
Вот цитата из ответа (может кому еще пригодится):
Цитата:
Функция 0 прерывания 16h не возвращает нажатия F11 и F12. Используй вместо нее функцию 10h.
repli вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так, что бы приложение не реагировало на Alt+Tab, Windows и Ctrl+Alt+Del? st6al Помощь студентам 0 27.12.2009 19:48
Как заблокировать горячие клавиши Alt+F11 kovalevskivf Microsoft Office Excel 2 20.05.2009 11:26
не получается отключение CTRL+alt+del? Alt+TAb, часов с панели задач и Крестик окна Reds Общие вопросы Delphi 1 30.09.2008 10:37
Alt+F4 как отключить работу этой комбинации??? PROGR Общие вопросы Delphi 46 17.07.2007 14:18