![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 16.05.2012
Сообщений: 6
|
![]()
Программа выводит текст,и можно менять цвет фона!мне надо чтобы фон текста был белым при нажатии клавиши f12 при f11 меняло фон!все работает кроме цвета текста(нужен белый на черном фоне) а так прога работает
cseg segment use16 ;чтобы работало в реальном режиме assume cs:cseg, ds:cseg org 100h main proc jmp init ; переход на начало инициализации резидента main endp old_2fh dd 0 ; адрес мультиплексного прерывания old_09h dd 0 ; адрес системного клавиатурного прерывания flag db 0 ; флаг для проверки включения звучания change_bg db 0 ; флаг смены цвета фона msg1 db 'setup resident$' msg2 db 'resident already in memory!$' msg3 db 'sucsessful upload$' msg_base db 'some message$' clr db 0Eh ; цвет фона tail db 'off' ; параметр-хвост для выгрузки ;1. Разработать резидентный обработчик прерывания, ;который при нажатии некоторой комбинации клавиш выводит на экран некоторое сообщение. ;При нажатии другой комбинации клавиш должен меняться фон сообщения. new_09h proc push ax ; сохранение используемых регистров push bx push dx push es push di push si push ds push cs pop ds in al,60h ; читаем scan-код из порта 60h(порт клавиатуры) cmp al,57h ; клавиша F11 je bg cmp al,58h ; клавиша F12 je m jmp check bg: mov cs:change_bg,1 m: xor bx,bx ; загрузка байта mov ds,bx ; состояния mov al,ds:[0417H] ; клавиатуры test al,4 ; проверка 3 бита, нажата ли клавиша Ctrl jz check ; не нажата xor byte ptr cs:flag,1 ; переключим флаг check: cmp byte ptr cs:flag,0 ; режим "смены цвета" включен? je ex2 ; если "нет" переход на конец call output ; вызов процедуры вывода текста mov cs:flag, 0 ; обнуляем флаг для следующего вызова mov cs:change_bg,0 ; обнуляем флаг смены цвета фона ex2: pop ds ; очистка стека pop si pop di pop es pop dx pop bx pop ax jmp Dword ptr cs:[old_09h] ;Переход на старый обработчик endp new_09h output proc push ax ; сохранение используемых регистров push bx push dx push es push di push si push ds push cs pop ds ; смена цвета фона по необходимости cmp byte ptr change_bg, 1 jne @end cmp clr, 9Eh jne @next mov clr, 0Eh jmp @end @next: add clr, 10h @end: sti ; установка флага прерывания if в единицу.(разрешение аппаратных прерываний) cld ; сброс в ноль флага направления df.(команды обработки строк автоинкрементируются, т. е. выполняют операции с адресами от младших адресов к старшим.) mov ax,0B800h ; настройка AX на сегмент видеопамяти mov es,ax ; запись в ES значения сегмента видеопамяти xor di,di ; настройка DI на начало сегмента видеопамяти mov ah,clr ; атрибут выводимых символов xor bx,bx @msg: ; выводим сообщение mov al,msg_base[bx] stosw ; переписывает содержимое АХ в ячейку памяти с адресом ES: (E)DI, после чего прибавляет 2 к (E)DI, если флаг D опущен, и вычитает 2, если D поднят. inc bx cmp msg_base[bx],'$' jne @msg pop ds ; очистка стека pop si pop di pop es pop dx pop bx pop ax ret output endp new_2fh proc ; резидентный обработчик мультиплексного прерывания cmp ah,0c8h ; наша функция? jne out_2fh ; не наша, назад по цепочке (старый обработчик) cmp al,00h ; наша функция, смотрим команда 00h je live ; да, сообщим что уже в памяти cmp al,01h ; пришла команда на выгрузку? je uninst out_2fh: jmp cs ![]() live: mov al,0ffh iret uninst: ;выгрузка из памяти push ds push es push dx ;восстановим старые прерывания mov ax,2509h ; для клавиатуры lds dx,cs ![]() int 21h mov ax,252fh ; для мультиплексного прерывания lds dx,cs ![]() int 21h mov es,cs:[2ch] ;сегмент окружения из PSP mov ah,49h ;функция освобождения блока памяти int 21h push cs ; скопируем cs в es pop es ; es указывает на начало программы mov ah,49h ; освобождение памяти (ES = сегментный адрес (параграф) освобождаемого блока памяти) int 21h pop dx pop es pop ds iret new_2fh endp |
![]() |
![]() |
![]() |
#2 |
Регистрация: 16.05.2012
Сообщений: 6
|
![]()
init proc ;инициализация
mov ax,0c800h ; проверка на наличие в памяти int 2fh ; первого экземпляра программы cmp al,0ffh ; вернулся код ffh jne first ; нет экземпляр первый mov cl,es:80h ; получим длину хвоста команды cmp cl,0 ; длина хвоста =0? je second xor ch,ch ; в cx длина хвоста mov di,81h ; es ![]() mov si,offset tail ; ds ![]() mov al,' ' ; уберем пробелы из начала хвоста repe scasb ; сканируем хвост, пока пробелы dec di ; di -> первый символ после пробелов mov cx,3 ; ожидаемая длина параметра repe cmpsb ; сравниваем введенный параметр с ожидаемым jne second ; введена ошибочная команда mov ax,0c801h ; пошлем в резидентную программу команду на выгрузку int 2fh mov dx,offset msg3 ; выведем сообщение о выгрузке jmp exit ; не первый вызов программы second: mov dx,offset msg2 ; выведем сообщение, что резидент уже в памяти exit: mov ah,09h int 21h mov ax,4c00h ; завершим программу без оставления в памяти int 21h ; первый вызов программы - совершение установки first: mov ax,352fh ; чтение и сохранение вектора 2fh int 21h mov word ptr cs ![]() mov word ptr cs ![]() mov ax,3509h ; чтение и сохранение вектора 09h int 21h mov word ptr cs ![]() mov word ptr cs ![]() mov ax,252fh ; установка обработчика 2fh mov dx,offset new_2fh int 21h mov ax,2509h ; установка обработчика 09h mov dx,offset new_09h int 21h mov ah,09h ; вывод сообщения об установке резидента mov dx,offset msg1 int 21h mov ax,3100h ; завершим и оставим в памяти mov dx, (init-main+10fh)/16 ;з апрос в параграфах int 21h init endp cseg ends end main это продолжение |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Изменить цвет текста кодом | Legionevil | Microsoft Office Excel | 2 | 25.09.2011 18:11 |
Белый цвет становится прозрачным в некоторых местах | Crystallon | Общие вопросы Delphi | 5 | 05.04.2010 18:13 |
Как изменить цвет текста всех компонентов на форме | s2dentishe | Помощь студентам | 2 | 09.01.2010 17:29 |
Белый цвет | segail | Microsoft Office Excel | 4 | 11.07.2009 13:48 |
Как изменить цвет текста на всей строке в RichEdit, если строка содержит определенное слово?? | IIpopoK | Общие вопросы Delphi | 0 | 22.06.2008 07:57 |