привет всем помогите пожалста разобраться с сабжем. на сколько я знаю эта подфункция переключает 7-ой бит байта атрибутов, который управляет мерцанием символов, тока вот интересно как оно работает... мне надо в цикле переключать значение этого бита, так чтобы цвет сиволов на экране менялся соответсвующим образом. я лабу сделала, но мне надо именно эту функцию там употребить.. помогите плиззз
xds
3.09.2004 13:16
Привет
7-ой бит аттрибута имеет два назначения. Во-первых, он, как ты заметила, управляет мерцанием символа (если = 1, то символ мерцает). Такой режим обычно установлен по умолчанию. Во-вторых, 7-й бит может быть использован для задания повышенной яркости заднего фона (аналогично 3-ему биту для переднего).
Сабж непосредственно выбирает тот или другой режим: если BL = 1, то 7-й бит управляет мерцанием; BL = 0 - задает яркость заднего фона.
; выбираем управление мерцанием mov ax,1003h mov bl,1 int 10h
; ...
; выбираем управление яркостью заднего фона mov ax,1003h xor bl,bl int 10h
В Windows мерцание работает только в полноэкранном режиме.
Infinity
12.09.2004 2:27
пасиба бааальшое, но это я всё знала, а вот где в проге эту штуку лучше ставить чтобы она управляла чем надо? допустим есть надпись на экране и цикл: в начале спрашивается что надо юзеру мерцание или яркость и в зависиомсти от ответа переходит на метку где ставиться мерцание надписи на экране или яркость фона. я знаю как это все реализовать но вот как применить к этому сабж...
Например:
; в сегменте кодов: ; вывод строк на экран
again: xor ah, ah int 16h cmp al, 30h je zero cmp al, 31h je one cmp ah, 01h je exit jmp again
zero: mov ax,1003h xor bl,bl int 10h jmp again
one: mov ax,1003h mov bl, 1 int 10h jmp again
exit: ;выход из проги
только это у меня не работает и тут ещё вопрос появляется какой из множества способов вывести строки на экран лучше?
xds
12.09.2004 10:13
Как ты верно заметила, в среде MS-DOS существует множество способов вывода строк. В общем случае можно выделить три категории: - вывод средствами MS-DOS/int 21h: обычный телетайпный вывод, ничего не знающий об атрибутах, установке положения курсора, очистке экрана и т.п.; полезен в тех случаях, когда необходимо чтобы программа поддерживала перенаправление вывода; абсолютно совместимый (главное, чтобы DOS была ; - вывод средствами BIOS/int 10h: знает про атрибуты, курсор и п.р., но не всегда удобен: не удается добиться одним вызовом требуемого результата; ничего не знает об устройствах DOS и стандартном выводе; - вывод напрямую в видеопамять: работает максимально быстро и всегда так, как требуется; удобен при полноэкранном выводе; наименее совместимый подход.
Вывод строки: в DOS - int 21h / AH = 9h; в BIOS - int 10h / AH = 13h; напрямую - lodsb/stosb ;)
Я дополнил твой код выводом через BIOS:
.model tiny .code
.startup
;Очистка экрана: средствами BIOS достигается с помощью повторной установки ;текущего видеорежима mov ah,0Fh ;получить текущий режим в AL int 10h xor ah,ah ;снова его установить int 10h
;Вывод тестовой строки с атрибутом 1Eh mov ax,1301h ;функция 13h, подфункция 1 - вывод с перемещением курсора xor dx,dx ;начальная позиция вывода: DH = строка, DL = столбец mov bx,1Eh ;BH = номер страницы; BL = атрибут lea bp,test1E ;ES:BP -> строка mov cx,5 ;CX = длина строки int 10h
;Вывод тестовой строки с атрибутом 9Eh mov ax,1301h mov dx,100h mov bx,9Eh lea bp,test9E mov cx,5 int 10h
again: xor ah, ah int 16h cmp al,30h je zero cmp al,31h je one cmp ah,01h je exit jmp again
zero: mov ax,1003h xor bl,bl int 10h jmp again
one: mov ax,1003h mov bl,1 int 10h jmp again
exit: ;выход из проги
mov ax,4C00h int 21h
msg db 'Что сделать?',13,10 db ' 0 - выключить мерцание',13,10 db ' 1 - включить мерцание',13,10 db 'ESC - выход',13,10 msg_len equ $-msg
test1E db ' 1Eh ' test9E db ' 9Eh '
end
Infinity
15.09.2004 0:00
я так тож делала, только у меня это не работает в том то всё и дело..
Infinity
15.09.2004 0:02
не работает в том смысле что при нажатии на 1 и 0 ничего не меняется на экране
Shadow
15.09.2004 3:53
Infinity ---- смотри присоединенный файл он на PAS, но целиком все сделанно на ASSEMBLERE Думаю переделать не составит труда ---- Вот изменение атрибутов символа на экране, но только через видеопамять напрямую.. думаю пригодится ---- Сама программа неимеет оптимизаций и т.д. она просто работает ---- там именно в видеопамять пишеться аттрибут символа и код самого символа
mov ax,0b800h mov es,ax
адресс видопамяти в текстовом режиме
lea si,S mov ah,0 mov al,[si]
грузим адрес строки причем в ah = 0 ,а в al - код символа
mov cx,ax inc si
первый симол это длина строки я ее не пропускаю т.к. она потом мне нужна будет для счетчика цикла ---------------- cохраняем регитр ax и увеличиваем счетчик т.е. переходим на след символ
@out: mov al,[si] {Symbol} mov ah,c {attribut} inc si {nex symbol} mov es:[di],ax {to video memory} inc di {movenau to video memory} inc di {increment 2 se also for 1 symbol 2 byte memory} loop @out
ню вот в al код символа, а в ah аттрибут символа переход на след символ пишем все это в память т.е. на экран выводим переходим в видеопамяти дальше повтор пока не выведем всю строку ======================
push ds mov ax,ss mov ds,ax
т.к. это PASAL а Я все это сделал в процедуре, а в процедуре начала блока данных идет от стека --- адрес DS сегмента данных нужно сохранить ---- а потом востановить при выходе из процедуры
pop ds
------ Справочная литература В.Ю. Пирогов ASSEMBLER учебный курс
Infinity
17.09.2004 3:42
Спасибо большое SHADOW!!!!! буду разбираться
what the diffencebetween venlafa
26.09.2021 16:55
Amoxicillin Clav Side Effects
buy cialis online with prescript
1.11.2021 12:22
Buy Plavix Uk
buy prednisone without perscriti
11.11.2021 4:27
Can Amoxicillin Be Used For Proctitis
how long does gabapentin stay in
7.12.2021 18:19
Cialis Von Lilly Lycos
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.