Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
TASM

Издавать писк при вводе цифр на дополнительной клавиатуре

14.12.2020, 21:35. Показов 3262. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помочь с выполнением задачи по ассемблеру. Нужно написать код на языке ассемблера для сервиса DOS. Постановка задачи следующая: "Написать код , издающий писк при вводе цифр на дополнительной клавиатуре". Мой код работает в принципе, но он работает с цифрами основной клавиатуры, а нужно выводить писк для доп цифр (NUM LOCK).

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
.model tiny ;тип файла COM
.code ; начало сегмента кода
org 100h ; смещение памяти на 100h (для COM)
 
PROGRAM:    
 
mov ah,09h
mov dx, offset message
int 21h
 
compare:
mov ah,01h
int 21h
 
cmp al,'0'
jz sound_mov
 
cmp al,'1'
jz sound_mov
 
cmp al,'2'
jz sound_mov
 
cmp al,'3'
jz sound_mov
 
cmp al,'4'
jz sound_mov
 
cmp al,'5'
jz sound_mov
 
cmp al,'6'
jz sound_mov
 
cmp al,'7'
jz sound_mov
 
cmp al,'8'
jz sound_mov
 
cmp al,'9'
jz sound_mov
 
call warning 
 
 
sound_mov:
    call sound
 
proc warning
mov ah,09h
mov dx,offset bad_data
int 21h
call exit
warning endp
 
proc sound
  mov di,6000 ;частота звука
    mov bx,20   ;длительность
    mov al,0b6H
    out 43H,al
    mov dx,0014H
    mov ax,4f38H
    div di
    out 42H,al
    mov al,ah
    out 42H,al
    in al,61H
    mov ah,al
    or al,3
    out 61H,al
    l1:     mov cx,2801H
    l2:     loop l2
    dec bx
    jnz l1
    mov al,ah
    out 61H,al
    
    ;call exit
sound endp
 
exit proc
int 20h
exit endp
 
;DATA
message db "Enter Data",0Dh,0Ah,'$'
bad_data db 0Dh,0Ah,"Warning: inaccurate data",'$'
end PROGRAM
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2020, 21:35
Ответы с готовыми решениями:

Издавать писк при вводе каждой второй цифры после пробела
Assume CS: Code, DS: Code Code SEGMENT org 100h SPACE equ ' ' .286 Start proc near ; Основная процедура mov...

ИБП начал издавать звук(длительный писк) и горит красная лампочка
Предыдущие темы : 1) Про управление ИБП с пк 2) Вывод : надо менять аккумулятор 3) Начал гореть ИБП Вот и сейчас мой вопрос: ...

Реализация программы, издающей писк только при вводе латинских букв после цифры
Необходимо создать программу, издающую писк(звуковой сигнал) только при вводе латинских букв после цифр. Прошу подсказать, как и где...

13
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,900
Записей в блоге: 12
14.12.2020, 22:15
Вводите при помощи клавиатурного прерывания и рассматривайте не 1 байт, а 2 - код символа и скан-код (уникальный именно для клавиши).
int 16h ah=0
Коды узнаете экспериментально при нажатиях.

Наверное, лучше проверять не символ, а только скан-код.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
15.12.2020, 12:46
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
int 16h ah=0
тут эксперементировать нужно с тремя функциями, кроме указаной ещё и int 16h ah=10h или int 16h ah=20h
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
15.12.2020, 16:07
Цитата Сообщение от Constantin Cat Посмотреть сообщение
эксперементировать нужно с тремя функциями
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
int 16h ah=0
Цитата Сообщение от Constantin Cat Посмотреть сообщение
int 16h ah=10h
Цитата Сообщение от Constantin Cat Посмотреть сообщение
int 16h ah=20h
прямо таки три сестры.. вроде разные, но такие одинаковые..
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
15.12.2020, 16:40
Цитата Сообщение от proc3nt Посмотреть сообщение
но такие одинаковые..
Таки разные:
00h => KEYBOARD - GET KEYSTROKE
10h => KEYBOARD - GET ENHANCED KEYSTROKE (enhanced kbd support only)
20h => KEYBOARD - GET 122-KEY KEYSTROKE (122-key kbd support only)
1
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
15.12.2020, 18:30  [ТС]
Есть примерно реализованный код сравнения со скан кодами клавиш? Как реализовать эту функцию? Заранее спасибо
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
15.12.2020, 22:57
Цитата Сообщение от Grigor333 Посмотреть сообщение
Есть примерно реализованный ко
Показывайте
0
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
16.12.2020, 14:00  [ТС]
Я пробовал , у меня не работает. Думал у вас может есть, посмотреть сравнить.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
16.12.2020, 16:33
Берете код и находите скан коды нужных клавиш
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
model   tiny
.code
org 100h
begin:  xor ax,ax
    int 16h
    push    ax
    call    show
    pop ax
    cmp ah,1
    jnz begin
    ret
Show:   mov al,ah
    aam 16
    xchg    ah,al
    call    @@00
    xchg    ah,al
@@00:   push    ax
    cmp al,10
    jb  @@01
    add al,7
@@01:   add al,'0'
    int 29h
    pop ax
    ret
    end begin
0
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
16.12.2020, 20:41  [ТС]
Да я понял и нашел скан коды цифр доп клавиатуры, но только не могу разобраться с тем , как организовать проверку на вввод и вывод этих цифр в моем коде , чтобы именно цифры доп клавы пищали.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
16.12.2020, 22:16
Смотрите "мозги клавы" простые, они передают в РС номер клавиши и в старшем бите нажата она или отпущена.

Все.

Вам нужно написать свой обработчик "клавы", получить нужные данные и по барабану = "безразлично" нажата NUM LOCK или нет.
0
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
26.12.2020, 20:04  [ТС]
Решил вопрос. Всем спасибо
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,900
Записей в блоге: 12
26.12.2020, 21:10
Поделитесь решением, если не трудно - может, кому-то пригодится.
0
 Аватар для Grigor333
2 / 2 / 1
Регистрация: 14.12.2020
Сообщений: 18
26.12.2020, 21:36  [ТС]
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Готовая программа.
Пользуйтесь.



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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
.model small
.386
.stack 100h
.code       ;начало сегмента кода
 
PROGRAM: 
start:
mov ax,cs ; Сохраняем значение сегмента кода в ax
mov ds,ax ; Приравниваем значение сегмента кода регистру сегмента данных
mov es,ax ; Приравниваем значение сегмента кода дополнительному регистру сегмента
 
mov ah,0h   ;установка видеорежима
mov al,3    ;режим номер 3
int 10h     ;вызов 10h прерывания
 
enter_letter:
 
mov ah,00h ; Считываем следующую нажатую клавишу
int 16h
mov dh,ah ; Сохраняем в dh скан-код
mov dl,al ; Сохраняем в dl ASCII код
 
mov ah,02h ; Выводим символ на экран
int 21h
 
cmp dl,27 ; Если нажат escape,
jz e_esc ; то переходим к завершению программы
 
cli ; Запрет прерываний
 
cmp dh,52h
jz compare
 
cmp dh,4Fh
jz compare
 
cmp dh,50h
jz compare
 
cmp dh,51h
jz compare
 
cmp dh,4Bh
jz compare
 
cmp dh,4Ch
jz compare
 
cmp dh,4Dh
jz compare
 
cmp dh,47h
jz compare 
 
cmp dh,48h ; Проверяем нажата ли клавиша num8
jz compare ; Если нет – переходим к проверке num9
 
cmp dh,49h
jz compare
 
jmp enter_letter ; Переходим к считыванию следующего символа
 
compare:
 
cmp dl,30h
jz space
 
cmp dl,31h
je space
 
cmp dl,32h
jz space
 
cmp dl,33h
jz space
 
cmp dl,34h
jz space
 
cmp dl,35h
jz space
 
cmp dl,36h
jz space
 
cmp dl,37h
jz space
 
cmp dl,38h ; Проверяем введен ли символ 8 (включен
jz space
 
cmp dl,39h
jz space
 
jmp enter_letter
 
space:
    call sound
    
proc sound
  mov di,6000 ;частота звука
    mov bx,20   ;длительность
    mov al,0b6H
    out 43H,al
    mov dx,0014H
    mov ax,4f38H
    div di
    out 42H,al
    mov al,ah
    out 42H,al
    in al,61H
    mov ah,al
    or al,3
    out 61H,al
    l1:     mov cx,2801H
    l2:     loop l2
    dec bx
    jnz l1
    mov al,ah
    out 61H,al
    jmp enter_letter
sound endp
 
e_esc:
mov ax,4c00h ; Завершаем программу
int 21h
 
;DATA
 
end PROGRAM
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2020, 21:36
Помогаю со студенческими работами здесь

Распознавание цифр при вводе
Здравствуйте, помогите пожалуйста решить задачу. Нужно спрашивать у пользователя числа до тех пор, пока он не введет букву e. При...

Удаление цифр при вводе числа
подскажите пожалуйста, как сделать чтобы при вводе числа, всегда удалялись первые 4 цифры и одна последняя.

При вводе цифр используется точка
Коллеги. Объясните можно ли при вводе цифр после запятой использовать изначально запятую, а не точку? У меня при вводе цифр после запятой...

Вывод определенных слов при вводе цифр
Нужна программа на СИ, не на Си++, с использованием switch... что бы при нажатии 1,2,3...9.. выводились определенные слова..

QlineEdit при вводе цифр добавлять пробел
Добрый день. Как можно задать свойство QlineEdit, чтобы при вводе чисел после каждого третьего выставлялся автоматически пробел? То есть,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru