Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 20.12.2014, 07:58   #1
zhayr
 
Регистрация: 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
zhayr вне форума Ответить с цитированием
Старый 20.12.2014, 07:58   #2
zhayr
 
Регистрация: 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
это продолжение
zhayr вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить цвет текста кодом Legionevil Microsoft Office Excel 2 25.09.2011 18:11
Белый цвет становится прозрачным в некоторых местах Crystallon Общие вопросы Delphi 5 05.04.2010 18:13
Как изменить цвет текста всех компонентов на форме s2dentishe Помощь студентам 2 09.01.2010 18:29
Белый цвет segail Microsoft Office Excel 4 11.07.2009 13:48
Как изменить цвет текста на всей строке в RichEdit, если строка содержит определенное слово?? IIpopoK Общие вопросы Delphi 0 22.06.2008 07:57


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS