Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ подфункция 03h функции 10h прерывания Int 10h

Автор: Infinity 3.09.2004 1:54

привет всем smile.gif
помогите пожалста разобраться с сабжем. на сколько я знаю эта подфункция переключает 7-ой бит байта атрибутов, который управляет мерцанием символов, тока вот интересно как оно работает...
мне надо в цикле переключать значение этого бита, так чтобы цвет сиволов на экране менялся соответсвующим образом.
я лабу сделала, но мне надо именно эту функцию там употребить.. помогите плиззз

Автор: xds 3.09.2004 13:16

Привет smile.gif

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 была smile.gif;
- вывод средствами 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

Автор: Infinity 15.09.2004 0:00

я так тож делала, только у меня это не работает sad.gif
в том то всё и дело..

Автор: 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 аттрибут символа
переход на след символ
пишем все это в память т.е. на экран выводим
переходим в видеопамяти дальше
повтор пока не выведем всю строку smile.gif
======================
    push ds
   mov ax,ss
   mov ds,ax

т.к. это PASAL а Я все это сделал в процедуре, а в процедуре
начала блока данных идет от стека
---
адрес DS сегмента данных нужно сохранить
----
а потом востановить при выходе из процедуры
    pop ds

------
Справочная литература
В.Ю. Пирогов ASSEMBLER учебный курс



Прикрепленные файлы
Прикрепленный файл  TEXT_VID.zip ( 499 байт ) Кол-во скачиваний: 416

Автор: Infinity 17.09.2004 3:42

Спасибо большое SHADOW!!!!! буду разбираться smile.gif

Автор: 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