|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.12.2014, 06:58 | #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 csld_2fh live: mov al,0ffh iret uninst: ;выгрузка из памяти push ds push es push dx ;восстановим старые прерывания mov ax,2509h ; для клавиатуры lds dx,csld_09h int 21h mov ax,252fh ; для мультиплексного прерывания lds dx,csld_2fh 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 |
20.12.2014, 06:58 | #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 ; esi->хвост в PSP mov si,offset tail ; dsi ->поле tail 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 csld_2fh,bx mov word ptr csld_2fh+2,es mov ax,3509h ; чтение и сохранение вектора 09h int 21h mov word ptr csld_09h,bx mov word ptr csld_09h+2,es 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 |