Консультация № 173539
22.10.2009, 09:20
0.00 руб.
0 27 1
Здравствуйте! Подскажите пож-та задачку. Необходимо написать прогу. Фильтрация ввода. Выводить на экран разрешенные сочетания клавиш. На экран выводить соответствующий текст: "F1", "ALT-B","ESC","PgUp". Разрешенные символы - Cursor Keys.

Обсуждение

Неизвестный
22.10.2009, 09:27
общий
а как задаваться должны клавиши разрешенные?
Неизвестный
22.10.2009, 09:48
общий
Без понятия. Дали задачу - сказали решить. И все!!!!
Неизвестный
22.10.2009, 10:08
общий
Какое железо?
IBM PC подобное? Если так, то какая ОС? Или в виде загрузочного сектора? Или в виде модуля BIOS?
Свое железо? Какой процессор, какой экран, какая клавиатуры? ps/2? Как подключена периферия?
Неизвестный
22.10.2009, 10:29
общий
А для чего столько данных??????Мне просто какой-нибудь узор. А под свой комп я уже сам подберу. Я не понимаю как нужно выводить вот эти клавишы - ф1, алт-в... И что значит - разрешенные символы - Cursor Keys. На лабах мы просто фильтровали от а до я и от a до z.
Неизвестный
22.10.2009, 10:50
общий
Зараганников Василий:
Комп у вас ibm pc подобный? Или mac? Или китайский ноут на ARM?
Неизвестный
22.10.2009, 11:13
общий
Ноутбук на ARM.
Неизвестный
22.10.2009, 12:40
общий
Зараганников Василий:
>Ноутбук на ARM.
Поподробнее. Какой процессор? Что изначально зашито, если будет использоваться(linux,wince)? Подробности по периферии, если оригинальная прошивка не будет использоваться. Чем будет собираться, какой режим должен использоваться? ARM? THUMB?
Неизвестный
22.10.2009, 15:48
общий
vladisslav:
Genuine Intel(R) CPU 575 2.00 GHz.
Wince. Насчет режима не знаю.
Так разве это имеет большое значение? Ведь делаю я на своем компе, а показывать преподу буду на другом - учебном.
Нельзя ли какой простой примерчик - для любого компьютера. Чтоб вообще понять суть, как это можно сделать...
Неизвестный
22.10.2009, 17:00
общий
Зараганников Василий:
Итак, разрешенные символы — Cursor Keys. Это 4 стрелочки, и клавиши PgUp, PgDn, Home, End.

Если в среде DOS, то нажатие клавиш можно отлавливать через int 9 или через int 16h.
В программе надо задать таблицу разрешенных клавиш и проверять на совпадение. Совпало — вывели название клавиши (или из другой таблицы по индексу, или сделать таблицу структур { код клавиши, название клавиши }. Вы же написали:
На лабах мы просто фильтровали от а до я и от a до z.

Здесь то же самое, только коды клавиш другие.

Нельзя ли какой простой примерчик — для любого компьютера.

На ассемблере "для любого" — нельзя.
Неизвестный
22.10.2009, 17:24
общий
amnick:
Спасибо!!! Хоть разобрался, что мне за символы надо выводить.))))
Неизвестный
22.10.2009, 17:27
общий
И на лабах мы делали по другому. Мы ставили условия: символ "А" и символ "Я". Пропускаем для вывода, если значение больше а и меньше я. Таблиц мы не делали. А как делать такие таблицы - не можете подсказать??????
Неизвестный
22.10.2009, 18:51
общий
это ответ
Здравствуйте, Зараганников Василий.
В приложении — простой пример для Intel 8086. Проверил в сессии DOS под WinXP. Если есть вопросы — пишите в форум.



Приложение:
MODEL TINY
LOCALS @@
.DATA

; таблица разрешенных клавиш
AllowedKeys DW 4700h,4800h,4900h,4b00h,4d00h,4f00h,5000h,5100h

; таблица названий клавиш (выровнено по 6 символов, включая пробел-разделитель)
KeyNames DB "Home ","Up ","PgUp ","Left ","Right ","End ","Down ","PgDn "

NUM_KEYS EQU 8
LEN_MSG EQU 6

.CODE
ORG 100h
start:

; в данном случае можно использовать метку start вместо @@wait_next
; здесь это сделано для ясности - цикл обработки нажатий необязательно в начале программы
@@wait_next:
mov ah,0
int 16h
cmp al,27 ; ESC
je @@exit

mov cx,NUM_KEYS
mov di,offset AllowedKeys
repne scasw
jnz @@wait_next

inc cx
mov al,NUM_KEYS
sub al,cl
mov cl,LEN_MSG
mul cl

add ax,offset KeyNames
mov dx,ax
mov ah,40h
mov bx,1
int 21h
jmp @@wait_next

@@exit:
mov ax,4c00h
int 21h
END start
5
Неплохо!!! Главное, понял суть. Спасибо за ответ!
Неизвестный
22.10.2009, 19:16
общий
amnick:
А что означает команда repne scasw?
Неизвестный
22.10.2009, 19:19
общий
amnick:
Я так понимаю - это повторение поиска символа, пока cx не обнулится? Да?
Неизвестный
22.10.2009, 19:45
общий
amnick:
Ваш вариант на моем компе идет - но символы никакие не выдает. Попробовал сделать на свой лад, как я привык обычно сделать. Вроде логически все так. Выдало ошибку - процессор NTVDM обнаружил недопустимую инструкцию. CS:5е59 IP:5f07 OP: 00 00 00 00 00.
Я делаю под MS-DOS.

name massiv
model small
.data
i db 0
j db 0
mes1 db 0ah,0dh,'Sozdaetsya massiv! Vvedite ego elementy.$',0ah,0dh
mes2 db 0ah,0dh,'Kol-vo nenulevuh elementov - $'
mas label byte
maxlen db 20
actlen db ?
namefld db 20 dup (' ')

.code
start:
mov ax,@data
mov ds,ax
mov ah,09h
lea dx,mes1
int 21h
mov ah,0ah
lea dx,mas
int 21h
mov si,0
show:
inc j
cmp mas[si],'0'
jne n
inc i

n:
inc si
cmp j,21
jne show
mov ah,09h
lea dx,mes2
int 21h
mov ah,02h
mov dl,i
add dl,30h
int 21h


mov ax,4c00h
int 21h
end start


Может подскажите, что не так......
Неизвестный
22.10.2009, 19:46
общий
amnick:
Блин!!!! Не то скопировал!!!!!!!!!!
Вот -
name stack
.model small
.data
;таблица разрешенных клавиш
AllowedKeys dw 4700h,4800h,4900h,4b00h,4d00h,4f00h,5000h,5100h

;таблица названий клавиш (выровнено по 6 символов, вкл. пробелы)
KeyNames db "Home ", "Up ","PgUp ","Left ","Right","End ","Down ","PgDn "

NUM_KEYS EQU 8
LEN_MSG EQU 6

.code
start:

mov ax,@data
mov ds,ax

next:
mov ah,0h
int 21h
cmp al,1bh ;esc
je exit

mov cx, NUM_KEYS
mov di,offset AllowedKeys
repne scasw
jnz next

inc cx
mov al,NUM_KEYS
sub al,cl
mov cl,LEN_MSG
mul cl

add ax,offset KeyNames
mov dx,ax
mov ah,40h
mov bx,1
int 21h
jmp next


exit:
mov ax,4c00h
int 21h
end start
Неизвестный
22.10.2009, 19:49
общий
amnick:
Использую программы TASM. TLINK, TD. Затем загружаю файл EXE через командную строку WIN XP.
Неизвестный
22.10.2009, 20:09
общий
Цитата: 308693
А что означает команда repne scasw?
Я так понимаю - это повторение поиска символа, пока cx не обнулится? Да?


Да, только не символа, а слова (в конце — w).

В моей программе есть ошибка: не задано направление поиска. Может быть, поэтому у Вас и не работает. Вставьте между метками start и @@wait_next инструкцию cld. Вот так:
Код:
start:
cld
@@wait_next:


Ваша программа у меня отработала нормально. Несколько замечаний:

mes1 db 0ah,0dh,'Sozdaetsya massiv! Vvedite ego elementy.$',0ah,0dh
А зачем 0ah,0dh после '$'? Все равно не выводится.

cmp j,21
j надо сравнивать не с 21, а с actlen — здесь это сработает, но если выделить этот код в процедуру, то при повторном вызове может быть неверный результат. И зачем вообще нужно j? Только лишний код, то же значение содержится в SI.

Вы выводите результат 'Kol-vo nenulevuh elementov - $', а подсчитываете, между тем, количество нулей '0'.
Неизвестный
22.10.2009, 20:18
общий
Зараганников Василий:
Вот, Вы не то скопировали и я не на то отвечал.

Код:
next:
mov ah,0h
int 21h

Почему Вы заменили int 16h на int 21h? Должно быть именно 16h!
Функция 0 прерывания 21h — это завершение программы!
Неизвестный
22.10.2009, 20:24
общий
Airyashov:
исправил - прога работает, но ни на какие клавиши, кроме ESC не реагирует!!!!!
Неизвестный
22.10.2009, 20:24
общий
amnick:
исправил - прога работает, но ни на какие клавиши, кроме ESC не реагирует!!!!!
Неизвестный
22.10.2009, 20:26
общий
amnick:
А что значит - ORG 100h. Оно обязательно?
Неизвестный
22.10.2009, 20:36
общий
ORG 100h необходимо для программ в формате COM (model tiny) — они загружаются в память именно по такому смещению.

Цитата: 308693
прога работает, но ни на какие клавиши, кроме ESC не реагирует!!!!!


1. Что именно Вы исправили? Должно быть
Код:
start:
cld
@@wait_next:
mov ah,0
int 16h


2. Для моего варианта нужно генерировать COM-файл, а не EXE. Это обязательно!

Я программу проверял и у меня отработало все нормально!
Неизвестный
22.10.2009, 20:42
общий
vladisslav:
1. Да, исправил это.
2. Мы делали еще только exe файлы. Как получить файл com - не знаю.((((((((((
Неизвестный
22.10.2009, 20:42
общий
amnick:
1. Да, исправил это.
2. Мы делали еще только exe файлы. Как получить файл com - не знаю.((((((((((
Неизвестный
22.10.2009, 20:58
общий
Зараганников Василий:
Очень просто.

1. MODEL TINY
2. не забыть указать ORG 100h:
.code
org 100h

3. В командной строке TLINK задайте параметр -t Тогда будет сгенерирован COM-файл, а не EXE.

Вот и все.
Я предполагал, что из исходного файла очевидно, что нужно генерировать COM-файл (см. первые 2 пункта — они характерны для программ в формате COM).
Неизвестный
22.10.2009, 21:28
общий
amnick:
Спасибо огромное!!!!!!!!!!!!!!!!!
Форма ответа