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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 16:33   #1
antojka
 
Регистрация: 03.10.2011
Сообщений: 9
По умолчанию Модуль драйвера клавиатуры, cтирающий предыдущий символ при нажатии клавиш "win"

Курсовая работа, задание следующее:

Разработать модуль драйвера клавиатуры, работающий в реальном режиме (под DOS), выполняющий в соответствии с вариантом следующие действия:
1. cтирающий предыдущий символ при нажатии клавиш "wn" (эти две буквы при этом на экран выводиться не должны
2. издающий щелчок при вводе латинской буквы после буквы кириллицы.


Заплачу 300 рублей кто сделает!
antojka вне форума Ответить с цитированием
Старый 04.01.2013, 16:34   #2
antojka
 
Регистрация: 03.10.2011
Сообщений: 9
По умолчанию

Вот листинг подобной программы:
Код:
.486
.model flat, stdcall
; Модуль клавиатуры, стирающий экран консоли по нажатию клавиши "End"
;
 
; подключение файла определения констант, внешних вызовов и библиотек
include         const.inc
 
; сегмент данных
_DATA           SEGMENT
 
; принимает кол-во записанных символов
written     dd 0    
; хэндлер буфера ввода
inputH          dword ?
; хэндлер буфера вывода
outputH         dword ?
 
; текст заголовка консоли
con_title       db "Обработка клавиатуры",0
; резервные данные
c0              dword ? 
temp            dd ?
; пояснительный текст в консоли
str1            db "Для стирания экрана консоли - клавиша End",0 
; буфер кодов клавиш
keyboard_key    word 9 dup(0)   
; клавиша "ENTER"
key_ent1        db 00h              
; структура информации о консоли
; ее описание хранится в подключаемом файле windows.inc
; CONSOLE_SCREEN_BUFFER_INFO STRUCT
  ; dwSize                COORD <>
  ; dwCursorPosition      COORD <>
  ; wAttributes           WORD      ?
  ; srWindow              SMALL_RECT <>
  ; dwMaximumWindowSize   COORD <>
; CONSOLE_SCREEN_BUFFER_INFO ENDS
 
consoleInfo     CONSOLE_SCREEN_BUFFER_INFO <>
_DATA           ENDS
 
;сегмент кода
_TEXT           SEGMENT
 
start:
 
                ; освободить уже существующую консоль
                call FreeConsole@0
                ; создать консоль
                call AllocConsole@0
                ;получить хэндлер ввода
                push STD_INPUT_HANDLE
                call GetStdHandle@4
                mov inputH,eax
           
                ;получить хэндлер вывода
                push STD_OUTPUT_HANDLE
                call GetStdHandle@4
                mov outputH,eax
 
                ;задать заголовок окна консоли
                push offset con_title
                push offset con_title
                call CharToOemA@8
                push offset con_title
                call SetConsoleTitleA@4
                ;******************************
                ;перекодировка строки
                push offset str1
                push offset str1
                call CharToOemA@8
                ;вывести верхнюю строку 
                print offset str1,13,10
antojka вне форума Ответить с цитированием
Старый 04.01.2013, 16:34   #3
antojka
 
Регистрация: 03.10.2011
Сообщений: 9
По умолчанию

продолжение кода
Цитата:
; обработка нажатий клавиш
loo:
; прочитать одну запись о событии
push offset c0
push 1
push offset keyboard_key
push inputH
call ReadConsoleInputA@16
; нет ли события от клавиатуры?
cmp word ptr keyboard_key,KEY_EV
jne loo
; нажата или отпущена?
cmp byte ptr keyboard_key+4,1
jne loo
; вывести символ
push 0
push offset written
push 1
push offset byte ptr keyboard_key+14
push outputH
call WriteConsoleA@20
; ENTER
cmp byte ptr keyboard_key+14,0Dh
je ent
; клавиша ESC
cmp byte ptr keyboard_key+14,27
je exit_program
; клавиша End
cmp byte ptr keyboard_key+12, 04fh
je con_clean

jmp loo

; очистка консоли
con_clean:
; получаем информацию о консоли в структуру consoleInfo
invoke GetConsoleScreenBufferInfo, outputH, ADDR consoleInfo
; обнуляем регистр eax
mov eax,0
; извлекаем из структуры информацию о ширине и высоте текущей консоли
mov ax, consoleInfo.dwSize.x
mov cx, consoleInfo.dwSize.y
; перемножаем ширину и высоту консоли для получения общего числа ячеек, результат в регистре eax
mul cx
; сохраняем регистр eax в стеке, так как он будет перезаписан вызовом следующей функции
push eax
; заполняем консоль символом пробела с текущими атрибутами
invoke FillConsoleOutputCharacter, outputH, ' ', eax, 0, offset temp
; восстанавливаем регистр eax с общим числом ячеек консоли
pop eax
; обнуляем регистр ebx
mov ebx,0
; извлекаем из структуры два байта атрибутов текущей консоли
mov bx, consoleInfo.wAttributes
; меняем атрибуты ячеек консоли с хэндлером вывода outputH, с атрибутом ebx, кол-вом eax, начиная с 0,0
invoke FillConsoleOutputAttribute, outputH, ebx, eax, 0, offset temp
; устанавливаем позицию курсора вывода в консоль обратно на левый верхний угол
invoke SetConsoleCursorPosition, outputH, 0
; печатаем заново приглашение-подсказку
print offset str1,13,10
; возвратиться к обработке клавиатурного ввода
jmp loo
; обработка ENTER
ent:
; выводим управляющие символы LF(подача каретки) и CR(перевод строки)
print offset key_ent1,10,13
jmp loo

exit_program:
; закрыть консоль
call FreeConsole@0
; завершить текущий процесс
invoke ExitProcess, 0
_TEXT ENDS
end start
antojka вне форума Ответить с цитированием
Старый 05.01.2013, 22:19   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Когда-то делал подобное. Контакты ниже.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организовать текстовый файл f, состоящий из N строк. Организовать замену символов в файле. "Старый" символ и "новый" символ запраш Richik123 Паскаль, Turbo Pascal, PascalABC.NET 1 14.06.2012 16:28
Организовать текстовый файл f, состоящий из N строк. Организовать замену символов в файле. "Старый" символ и "новый" символ запра Richik123 Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2012 17:32
как вставить компоненту "panel" при нажатии на кнопку? Nazario Общие вопросы Delphi 2 03.05.2012 18:38
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04