![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() ![]() |
![]() |
Infinity |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Репутация: ![]() ![]() ![]() |
привет всем
![]() помогите пожалста разобраться с сабжем. на сколько я знаю эта подфункция переключает 7-ой бит байта атрибутов, который управляет мерцанием символов, тока вот интересно как оно работает... мне надо в цикле переключать значение этого бита, так чтобы цвет сиволов на экране менялся соответсвующим образом. я лабу сделала, но мне надо именно эту функцию там употребить.. помогите плиззз |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Привет
![]() 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 мерцание работает только в полноэкранном режиме. -------------------- The idiots are winning.
|
Infinity |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Репутация: ![]() ![]() ![]() |
пасиба бааальшое, но это я всё знала, а вот где в проге эту штуку лучше ставить чтобы она управляла чем надо?
допустим есть надпись на экране и цикл: в начале спрашивается что надо юзеру мерцание или яркость и в зависиомсти от ответа переходит на метку где ставиться мерцание надписи на экране или яркость фона. я знаю как это все реализовать но вот как применить к этому сабж... Например: ; в сегменте кодов:
; вывод строк на экран
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:
;выход из проги
только это у меня не работает и тут ещё вопрос появляется какой из множества способов вывести строки на экран лучше? Сообщение отредактировано: volvo - 6.11.2009 22:39 |
xds |
![]()
Сообщение
#4
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Как ты верно заметила, в среде 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
-------------------- The idiots are winning.
|
Infinity |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Репутация: ![]() ![]() ![]() |
я так тож делала, только у меня это не работает
![]() в том то всё и дело.. |
Infinity |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Репутация: ![]() ![]() ![]() |
не работает в том смысле что при нажатии на 1 и 0 ничего не меняется на экране
|
Shadow |
![]()
Сообщение
#7
|
![]() Lonely_Raven ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 640 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 учебный курс Сообщение отредактировано: volvo - 6.11.2009 22:42 Прикрепленные файлы ![]() -------------------- Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ --------------------- RTFM - Read the fucking manual --------------------- http://www.livejournal.com/users/lonley_raven/ |
Infinity |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 13 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо большое SHADOW!!!!! буду разбираться
![]() |
![]() ![]() |
![]() |
Текстовая версия | 25.07.2025 2:38 |