привет всем
помогите пожалста разобраться с сабжем. на сколько я знаю эта подфункция переключает 7-ой бит байта атрибутов, который управляет мерцанием символов, тока вот интересно как оно работает...
мне надо в цикле переключать значение этого бита, так чтобы цвет сиволов на экране менялся соответсвующим образом.
я лабу сделала, но мне надо именно эту функцию там употребить.. помогите плиззз
Привет
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
пасиба бааальшое, но это я всё знала, а вот где в проге эту штуку лучше ставить чтобы она управляла чем надо?
допустим есть надпись на экране и цикл: в начале спрашивается что надо юзеру мерцание или яркость и в зависиомсти от ответа переходит на метку где ставиться мерцание надписи на экране или яркость фона. я знаю как это все реализовать но вот как применить к этому сабж...
Например:
; в сегменте кодов:
; вывод строк на экран
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:
;выход из проги
Как ты верно заметила, в среде 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
;Вывод меню
mov ax,1301h
mov dx,300h
mov bx,7
lea bp,msg
mov cx,msg_len
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
я так тож делала, только у меня это не работает
в том то всё и дело..
не работает в том смысле что при нажатии на 1 и 0 ничего не меняется на экране
Infinity
----
смотри присоединенный файл он на PAS, но целиком все сделанно
на ASSEMBLERE Думаю переделать не составит труда
----
Вот изменение атрибутов символа на экране, но только через видеопамять
напрямую.. думаю пригодится
----
Сама программа неимеет оптимизаций и т.д. она просто работает
----
там именно в видеопамять пишеться аттрибут символа и код самого символа
mov ax,0b800h
mov es,ax
lea si,S
mov ah,0
mov al,[si]
mov cx,ax
inc si
@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
push ds
mov ax,ss
mov ds,ax
pop ds
Спасибо большое SHADOW!!!!! буду разбираться
Amoxicillin Clav Side Effects
Buy Plavix Uk
Can Amoxicillin Be Used For Proctitis
Cialis Von Lilly Lycos