Консультация № 168972
05.06.2009, 09:06
0.00 руб.
0 6 1
Доброе утро мастера! Помогите пожалуйста с програмкой. Нужно написать резидентный модуль на асме, который по нажатию клавиши F1 записывал бы слово OPEN в буфер клавиатуры. Буду очень благодарен за помощь. Спасибо!

Обсуждение

Неизвестный
05.06.2009, 09:41
общий
А в чем Вам именно помочь или все же написать за Вас?
Неизвестный
05.06.2009, 11:09
общий
И в последнем случае - в решебникрешебник. Правда, есть еще вариант - поискать аналог
Неизвестный
05.06.2009, 11:40
общий
да,нужно написать,так как сам не пишу на асме.а учёба требует
давно
Посетитель
7438
7205
05.06.2009, 22:40
общий
Раз учеба требует, почему бы не разобраться?
Поверьте, ничего нет сложного...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
06.06.2009, 00:03
общий
это ответ
Здравствуйте, Aesir.
Программа в приложении.
По большому счету, после отработки кнопки, ее код надо убирать
из клавиатуры, чтобы не допустить лишнюю отработку.
Но, исходя из того, что нажатие на кнопку F1
в командном интерпретаторе ни к чему не приводит, то можно
сделать, как в программе - завершение вектора для всех кодов
поручено старому вектору.


Приложение:
;prog.asm
;делаем COM-файл
;tasm prog.asm
;tlink prog /t
;запускаем в командном интерпретаторе cmd.exe

.model tiny ;модель для COM-программы (все в одном сегменте)
.code ;сегмент кода
.startup ;макро для настройки старта программы
jmp init ;на инициализацию резидента
old_09 dw 0, 0 ;здесь будет старый клавиатурный вектор 9
new_09: ;новая отработка вектора 9
push ax ;надо сохранять все используемые регистры (для начала только ax)
in al, 60h ;прочитаем код из клавиатуры
cmp al, 3bh ;F1 ?
jne to_old_09 ;если не F1, то на старый вектор
push cx ;сохраним еще cx
mov ah, 5 ;функция записи в буфер клавиатуры
mov cx, 'O' ;ch=0 - скан-код нам не нужен, cl=ASCII-код
int 16h
cmp al, 0 ;проверим на ошибку
jne to_iret ;если ошибка, то больше в буфер не писать
mov ah, 5
mov cx, 'P'
int 16h
cmp al, 0
jne to_iret
mov ah, 5
mov cx, 'E'
int 16h
cmp al, 0
jne to_iret
mov ah, 5
mov cx, 'N'
int 16h
to_iret:
pop cx ;восстановим cx

to_old_09:
pop ax ;восстановим ax
jmp dword ptr cs:old_09 ;на старый вектор
init: ;инициализация программы
mov ax, 3509h ;прочитаем старый вектор
int 21h
mov old_09, bx ;сохраним в переменной смещение
mov old_09+2, es ; и сегмент
mov ax, 2509h ;установим новый вектор отработки прерывания 9
lea dx, new_09 ; адрес нового обработчика
int 21h
lea dx, init ;последний адрес программы, который оставляем в памяти
int 27h ;оставляем резидент в памяти и завершаемся

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.06.2009, 15:28
общий
Лысков Игорь Витальевич:
Огромное Вам спасибо! Да эт нуно просто принести как бы и здать, сам не пишу на асме и никогда не сталкивался, занимаюсь вобще программированием на более высоком уровне:) возможно в будущем будет хватать времени то и асм подучу:))) Еще раз спасибо вам огромнейшее! Очень благодарен Вам за помощь!
Форма ответа