Родились сегодня:
vladymyrlem
antonovich


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

740

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

322

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

277

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

210

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

129

Беларусь, Гомель


ID: 400815

alexleonsm

6-й класс

129


ID: 400669

epimkin

Профессионал

119


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-13 03:16:01-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 173539

Раздел: Assembler
Автор вопроса: Зараганников Василий
Дата: 22.10.2009, 09:20 Консультация закрыта
Поступило ответов: 1

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

Ответ # 255717 от amnick
Здравствуйте, Зараганников Василий.
В приложении — простой пример для Intel 8086. Проверил в сессии DOS под WinXP. Если есть вопросы — пишите в форум.

Приложение:


amnick

Посетитель
22.10.2009, 18:51
5


Неплохо!!! Главное, понял суть. Спасибо за ответ!

Мини-форум консультации # 173539
Airyashov

1

= общий =    22.10.2009, 09:27

а как задаваться должны клавиши разрешенные?

неизвестный

2

= общий =    22.10.2009, 09:48

Без понятия. Дали задачу - сказали решить. И все!!!!

vladisslav

3

= общий =    22.10.2009, 10:08

Какое железо?
IBM PC подобное? Если так, то какая ОС? Или в виде загрузочного сектора? Или в виде модуля BIOS?
Свое железо? Какой процессор, какой экран, какая клавиатуры? ps/2? Как подключена периферия?

неизвестный

4

= общий =    22.10.2009, 10:29

А для чего столько данных??????Мне просто какой-нибудь узор. А под свой комп я уже сам подберу. Я не понимаю как нужно выводить вот эти клавишы - ф1, алт-в... И что значит - разрешенные символы - Cursor Keys. На лабах мы просто фильтровали от а до я и от a до z.

vladisslav

5

= общий =    22.10.2009, 10:50

Зараганников Василий:
Комп у вас ibm pc подобный? Или mac? Или китайский ноут на ARM?

неизвестный

6

= общий =    22.10.2009, 11:13

Ноутбук на ARM.

vladisslav

7

= общий =    22.10.2009, 12:40

Зараганников Василий:
>Ноутбук на ARM.
Поподробнее. Какой процессор? Что изначально зашито, если будет использоваться(linux,wince)? Подробности по периферии, если оригинальная прошивка не будет использоваться. Чем будет собираться, какой режим должен использоваться? ARM? THUMB?

неизвестный

8

= общий =    22.10.2009, 15:48

vladisslav:
Genuine Intel(R) CPU 575 2.00 GHz.
Wince. Насчет режима не знаю.
Так разве это имеет большое значение? Ведь делаю я на своем компе, а показывать преподу буду на другом - учебном.
Нельзя ли какой простой примерчик - для любого компьютера. Чтоб вообще понять суть, как это можно сделать...

amnick

9

= общий =    22.10.2009, 17:00

Зараганников Василий:
Итак, разрешенные символы — Cursor Keys. Это 4 стрелочки, и клавиши PgUp, PgDn, Home, End.

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

На лабах мы просто фильтровали от а до я и от a до z.


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

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


На ассемблере "для любого" — нельзя.

неизвестный

10

= общий =    22.10.2009, 17:24

amnick:
Спасибо!!! Хоть разобрался, что мне за символы надо выводить.)))) smile

неизвестный

11

= общий =    22.10.2009, 17:27

И на лабах мы делали по другому. Мы ставили условия: символ "А" и символ "Я". Пропускаем для вывода, если значение больше а и меньше я. Таблиц мы не делали. А как делать такие таблицы - не можете подсказать??????

неизвестный

12

= общий =    22.10.2009, 19:16

amnick:
А что означает команда repne scasw?

неизвестный

13

= общий =    22.10.2009, 19:19

amnick:
Я так понимаю - это повторение поиска символа, пока cx не обнулится? Да?

неизвестный

14

= общий =    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


Может подскажите, что не так......

неизвестный

15

= общий =    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

неизвестный

16

= общий =    22.10.2009, 19:49

amnick:
Использую программы TASM. TLINK, TD. Затем загружаю файл EXE через командную строку WIN XP.

amnick

17

= общий =    22.10.2009, 20:09

А что означает команда 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'.

amnick

18

= общий =    22.10.2009, 20:18

Зараганников Василий:
Вот, Вы не то скопировали и я не на то отвечал.

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

Почему Вы заменили int 16h на int 21h? Должно быть именно 16h!
Функция 0 прерывания 21h — это завершение программы!

неизвестный

19

= общий =    22.10.2009, 20:24

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

неизвестный

20

= общий =    22.10.2009, 20:24

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

неизвестный

21

= общий =    22.10.2009, 20:26

amnick:
А что значит - ORG 100h. Оно обязательно?

amnick

22

= общий =    22.10.2009, 20:36

ORG 100h необходимо для программ в формате COM (model tiny) — они загружаются в память именно по такому смещению.

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



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


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

Я программу проверял и у меня отработало все нормально!

неизвестный

23

= общий =    22.10.2009, 20:42

vladisslav:
1. Да, исправил это.
2. Мы делали еще только exe файлы. Как получить файл com - не знаю.((((((((((

неизвестный

24

= общий =    22.10.2009, 20:42

amnick:
1. Да, исправил это.
2. Мы делали еще только exe файлы. Как получить файл com - не знаю.((((((((((

amnick

25

= общий =    22.10.2009, 20:58

Зараганников Василий:
Очень просто.

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

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

Вот и все.
Я предполагал, что из исходного файла очевидно, что нужно генерировать COM-файл (см. первые 2 пункта — они характерны для программ в формате COM).

неизвестный

26

= общий =    22.10.2009, 21:28

amnick:
Спасибо огромное!!!!!!!!!!!!!!!!!

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

Лучшие эксперты раздела

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 80

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 72

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0