Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
1

Shift левая, правая

31.10.2015, 01:18. Показов 3259. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
программа для определения какая Shift нажата (левая или правая).
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.model small
.stack 100h
.data 
mesg     db "Press Shift Left\Right! $"
msgLeft  db "Left Shift! $"
msgRight  db "Left Shift! $"
.code
main:
        mov ax, @data ; настраивается сегментный регистр
        mov ds, ax
        
        mov ah, 09
        mov dx, offset mesg ; вывод сообщения
        int 21h
key:        
    mov ah, 2
    int 16h
    test    al, 2
    jnz leftShift ; нажата левая шифт
    mov ah, 1
    int 16h
    jz  key ; переход на начало подпрограммы если ничего не нажато
;че-то нажато помимо шифтов и котролов
    mov ah, 0
    int 16h
;в al ASCII код нажатой клавиши, в ah скан-код
;   ...
leftShift:
        mov ah, 09
        mov dx, offset msgLeft ; вывод сообщения
        int 21h
exit:        
        mov ah, 01 ; ждет нажатия кнопок
        int 21h
 
        mov ax,4c00h ; выход
        int 21h
 
end main
переходит при нажатии любой кнопки, а должно показывать например нажата левая шифт, правая шифт или вы нажали не ту клавишу

Добавлено через 49 секунд
инфу нашёл но не знаю чё к чему
INT 16h, AH = 02h, 12h, 22h — Считать состояние клавиатуры
Ввод: АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)
Вывод: AL = байт состояния клавиатуры 1
АН = байт состояния клавиатуры 2 (только для функций 12h и 22h)
Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h:0417h или 0040h:0017h):
Бит 7: Ins включена
Бит 6: CapsLock включена
Бит 5: NumLock включена
Бит 4: ScrollLock включена
Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h)
Бит 2: Ctrl нажата (любая Ctrl)
Бит 1: Левая Shift нажата
Бит 0: Правая Shift нажата
Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h:0418h или 0040h:0018h):
Бит 7: SysRq нажата
Бит 6: CapsLock нажата
Бит 5: NumLock нажата
Бит 4: ScrollLock нажата
Бит 3: Правая Alt нажата
Бит 2: Правая Ctrl нажата
Бит 1: Левая Alt нажата
Бит 0: Левая Ctrl нажата
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2015, 01:18
Ответы с готовыми решениями:

Определить, какая клавиша Shift нажата: левая или правая
Уважаемые программисты нужна ваша помощь в написании программы. Она должна выводить сообщение о том...

Правая и левая производная
Помогите сделать задачу. Необходимо посчитать правую и левую производную для какой-либо функции...

Левая и правая кнопка мыши
Напомните пожалуйста код, который запрещает клик по объекту правой кнопкой мыши. К примеру: ...

Правая и левая тройка векторов
Объясните подробно разницу между ними, какая разница между ними, зачем это нужно. Попытайтесь...

3
593 / 390 / 70
Регистрация: 29.03.2013
Сообщений: 813
31.10.2015, 03:56 2
Shura_deg, как-то так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
    ...
    ...
key:        
    hlt
    mov ah, 2
    int 16h
    test    al, 2
    jnz leftShift ; нажата левая шифт
    test    al, 1
    jz  key
; нажата правая шифт
    ...
1
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
31.10.2015, 11:25  [ТС] 3
вот получившийся код, работает, но когда вначале например ввожу "р" или любую другую букву а потом shift то программа сразу завершает работу... не могу понять в чём дело
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.model small
.stack 100h
.data 
mesg     db "Press Shift Left\Right! $"
msgLeft  db "Left Shift! $"
msgRight  db "Right Shift! $"
.code
main:
        mov ax, @data ; настраивается сегментный регистр
        mov ds, ax
        mov ah, 09
        mov dx, offset mesg ; вывод сообщения
        int 21h
key:        
        hlt
        mov ah, 2
        int 16h
        test    al, 2
        jnz leftShift ; нажата левая шифт
        test    al, 1
        jz  key
        ; нажата правая шифт
        mov ah, 09
        mov dx, offset msgRight ; вывод сообщения
        int 21h
        JMP exit
leftShift:      
        mov ah, 09
        mov dx, offset msgLeft ; вывод сообщения
        int 21h     
exit:        
        mov ah, 01 ; ждет нажатия кнопок
        int 21h
        mov ax,4c00h ; выход
        int 21h
end main
0
593 / 390 / 70
Регистрация: 29.03.2013
Сообщений: 813
31.10.2015, 12:10 4
Лучший ответ Сообщение было отмечено Shura_deg как решение

Решение

Цитата Сообщение от Shura_deg Посмотреть сообщение
но когда вначале например ввожу "р" или любую другую букву а потом shift то программа сразу завершает работу.
Не знаю. У меня такого ни под чистым досом, ни в досбоксе не происходит.

Добавил очистку буфера клавиатуры перед выходом и пару сообщений:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
.model  small
.stack  100h
.data
mesg        db  "Press Shift Left\Right! $"
msgLeft     db  0dh, 0ah, "Left Shift! $"
msgRight    db  0dh, 0ah, "Right Shift! $"
msgPress    db  0dh, 0ah, "Press a key to exit...$"
msgCrLf     db  0dh, 0ah, '$'
    ;-------
mDisp   MACRO   aStr
    mov dx, offset aStr
    mov ah, 9
    int 21h
    ENDM
    ;-------
.code
main:
    mov ax, @data ; настраивается сегментный регистр
    mov ds, ax
 
    mDisp   mesg ; вывод сообщения
key:        
    hlt
    mov ah, 2
    int 16h
    test    al, 2
    jnz leftShift ; нажата левая шифт
    test    al, 1
    jz  key
    ; нажата правая шифт
    mDisp   msgRight ; вывод сообщения
        JMP exit
leftShift:      
    mDisp   msgLeft ; вывод сообщения
exit:        
    ; очистка буфера клавиатуры
preview:
    mov ah, 1
    int 16h
    jz  end_clr_key
    mov ah, 0
    int 16h
    jmp preview
end_clr_key:
 
    mDisp   msgPress
    mov ah, 0   ; ждет нажатия кнопок
    int 16h
    mDisp   msgCrLf
 
    mov ax, 4c00h ; выход
    int 21h
    end main
1
31.10.2015, 12:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2015, 12:10
Помогаю со студенческими работами здесь

На touchpade поменялись местами правая и левая кнопки
Вроде ничего не делал: поменялись кнопки на тачпаде у Acer 5720: теперь при левую на правую...

Сортировка массива: левая часть по возрастанию, правая по убыванию
Помогите, пожалуйста. Провести сортировку массива из четного количества элементов: левая часть по...

Lenovo y560: левая кнопка тачпада работает как правая
Доброго всем времени суток. Столкнулся с такой бедой, весь интернет облазил, так ни чего и не...

Перехват одновременного нажатия двух клавиш мыши (левая и правая)
Доброго времени суток! Я реализую игру "сапёр" и во время её создания у меня возникла проблема:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru