Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.133.228] |
|
Сообщ.
#1
,
|
|
|
Кто может подсказать, как перехватывать прерывания от таймера? Мне нужно написать резидентную программу на Assemblere, которая через 1 минуту после запуска выводила какое-нибудь сообщение на экран. Может у кого-нибудь есть похожая прграмма?
|
Сообщ.
#2
,
|
|
|
Что-то в таком духе:
Цитата .286 LOCALS .MODEL TINY .CODE ORG 100h Start: jmp Init bDone DB 0 wCounter DW 1092 ;начальное значение счетчика времени szMessage DB "Hello World!",0 ;******************************************************************************* ;CharAddr3 определяет адрес символа в видеобуфере в текстовом режиме ;******************************************************************************* ;Вызов: DL = столбец (x) ; DH = строка (y) ; ;Возврат: ES = сегмент видеобуфера ; DI = смещение в видеобуфере ; ;Изменяемые ; регистры: DI,AX,Flags ;******************************************************************************* CharAddr3 PROC mov ax,40h mov es,ax ;ES = сегмент области данных видео-BIOS mov al,dl mov di,ax ;DI=x mov al,es:[4Ah] ;AL = число символов в строке (COLS) mul dh ;AX=y*COLS add di,ax ;DI=x+y*COLS shl di,1 ;DI=2*(x+y*COLS) mov ax,0B800h mov es,ax ;ES:DI -> видеобуфер ret CharAddr3 ENDP ;******************************************************************************* ;WriteStr3 выводит строку символов с атрибутами в текстовом режиме ;******************************************************************************* ;Использует: CharAddr3 ; ;Вызов: DS:SI -> ASCIIZ-строка ; BL = атрибут символов строки ; DL = координата x ; DH = координата y ; ;Возврат: нет ; ;Изменяемые ; регистры: AX,Flags ;******************************************************************************* WriteStr3 PROC push es push si push di call CharAddr3 ;ES:DI -> видеобуфер mov ah,bl ;AH = атрибут символов строки cld @@WriteLoop: lodsb ;AL = текущий символ строки or al,al ;конец строки? jz @@Exit stosw jmp @@WriteLoop @@Exit: pop di pop si pop es ret WriteStr3 ENDP Int8Handler PROC FAR ;Запуск старого обработчика прерывания pushf DB 09Ah ;call XXXX:XXXX fpOldInt8 DD ? cmp cs:[bDone],0 jne @@Exit dec cs:[wCounter] jnz @@Exit inc cs:[bDone] sti push ds pusha mov al,20h ;завершение прерывания out 20h,al ;Вывод строки push cs pop ds mov si,OFFSET szMessage mov bl,4Ah mov dx,0C23h call WriteStr3 popa pop ds @@Exit: iret Int8Handler ENDP Init: ;Сохранение старого обработчика и установка нового xor ax,ax mov es,ax cli mov ax,OFFSET Int8Handler xchg ax,es:[8*4] mov WORD PTR [fpOldInt8],ax mov ax,cs xchg ax,es:[8*4+2] mov WORD PTR [fpOldInt8+2],ax sti ;Освобождение сегмента среды mov es,ds:[2Ch] mov ah,49h int 21h ;Завершение программы и сохранение ее резидентной mov dx,OFFSET Init int 27h END Start |
Сообщ.
#3
,
|
|
|
Опоздал
Хотел первый ответить. Правда у меня хуже получилось. |