Помощь - Поиск - Пользователи - Календарь
Полная версия: подфункция 03h функции 10h прерывания Int 10h
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Infinity
привет всем smile.gif
помогите пожалста разобраться с сабжем. на сколько я знаю эта подфункция переключает 7-ой бит байта атрибутов, который управляет мерцанием символов, тока вот интересно как оно работает...
мне надо в цикле переключать значение этого бита, так чтобы цвет сиволов на экране менялся соответсвующим образом.
я лабу сделала, но мне надо именно эту функцию там употребить.. помогите плиззз
xds
Привет 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
пасиба бааальшое, но это я всё знала, а вот где в проге эту штуку лучше ставить чтобы она управляла чем надо?
допустим есть надпись на экране и цикл: в начале спрашивается что надо юзеру мерцание или яркость и в зависиомсти от ответа переходит на метку где ставиться мерцание надписи на экране или яркость фона. я знаю как это все реализовать но вот как применить к этому сабж...

Например:

; в сегменте кодов:
; вывод строк на экран

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
Как ты верно заметила, в среде 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
я так тож делала, только у меня это не работает sad.gif
в том то всё и дело..
Infinity
не работает в том смысле что при нажатии на 1 и 0 ничего не меняется на экране
Shadow
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 учебный курс
Infinity
Спасибо большое SHADOW!!!!! буду разбираться smile.gif
what the diffencebetween venlafa
Amoxicillin Clav Side Effects
buy cialis online with prescript
Buy Plavix Uk
buy prednisone without perscriti
Can Amoxicillin Be Used For Proctitis
how long does gabapentin stay in
Cialis Von Lilly Lycos
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.