Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.150.167] |
|
Сообщ.
#1
,
|
|
|
Код разделен на три части: 1). void setpointer()
2). void clock_p_s 3). void retpointer(). Что делается в каждой из частей? _TEXT segment byte public 'CODE' _TEXT ends DGROUP group _DATA,_BSS assume cs:_TEXT,ds:DGROUP _DATA segment word public 'DATA' _off_1ch equ 1ch*4 _maskf db 7 _position dw 0 _DATA ends _BSS segment word public 'BSS' _oldoffset1c dw ? _oldsegemnt1c dw ? _BSS ends _DATA segment word public 'DATA' _counttakts dw 0 _timeend dw 20 _oldsec dw 0 _DATA ends _TEXT segment byte public 'CODE' ; ************************************************************************ ; void setpointer() ; ************************************************************************ assume cs:_TEXT @setpointer$qv proc near cli mov ax,0 mov es,ax ;таблица находится в 0м сегменте mov bx,_off_1ch ;засылаем в bx смещение mov ax,[es:bx] ;засылаем в аккумулятор значение по ардесу es:bx смещение ;(первые 2 байта адреса системного обработчика) mov _oldoffset1c,ax ;засылаем в oldoffset1c cмещение ... mov ax,[es:bx+2] ;аналогично, только сегмент mov _oldsegemnt1c, ax ;записать новый вектор в таблицу векторов прерываний mov ax, offset @clock_p_s$qv;смещение нового обработчика в ax mov bx,_off_1ch mov [es:bx],ax push cs pop ax ;настройка ax на cs mov [es:bx+2],ax ;запись сегмента mov ax, 0b800h mov es, ax mov cx, 3838 mov ax,32+7*256 m0: mov bx, cx mov [es:bx],ax dec cx loop m0 sti ret @setpointer$qv endp ; ************************************************************************ ; void clock_p_s() ; ************************************************************************ assume cs:_TEXT @clock_p_s$qv proc near ;сохранение в стеке используемых регистров push ax push bx push dx ;dx портит imul и idiv push es push ds ; настройка ds на cs push cs pop ds inc _counttakts ;инкремент counttakts mov ax,_counttakts mov dx,10 imul dx mov bx,182 idiv bx cmp ax,_oldsec jz endprog mov _oldsec,ax sub ax,_timeout jl endprog dec _timeend mov ax,2Ah ;запись в es адреса начала видеопамяти - B800:0000 mov bx, 0b800h mov es, bx mov bx, _position ;позицию на экране - в bx mov ah, _maskf ;маску вывода - в ah mov es:[bx],ax ;вывод символа в центр экрана ;восстановление используемых регистров: inc _position inc _position endprog: pop ds pop es pop dx pop bx pop ax iret @clock_p_s$qv endp ; ************************************************************************ ; void retpointer() ; ************************************************************************ assume cs:_TEXT @retpointer$qv proc near cli ;восстановление вектора прерывания от таймера ;запрет аппаратных прерываний xor ax, ax ;снова настройка es на начало таблицы mov es, ax ;векторов прерываний mov ax, _oldoffset1c ;запись в таблицу смещения старого mov bx,_off_1ch mov [es:bx],ax ;обработчика прерывания от таймера mov ax,_oldsegemnt1c ;запись сегмента mov [es:bx+2], ax sti ;разрешение аппаратных прерываний ret @retpointer$qv endp _TEXT ends _DATA segment word public 'DATA' _DATA ends _TEXT segment byte public 'CODE' _TEXT ends public @clock_p_s$qv public @retpointer$qv public @setpointer$qv extrn _timeout:word public _oldsec public _timeend public _counttakts public _oldsegemnt1c public _oldoffset1c public _position public _maskf public _off_1ch end |
Сообщ.
#2
,
|
|
|
M Используем тег [code] для добавления текста программы в пост! Устное предупреждение! Читаем правила! |
Сообщ.
#3
,
|
|
|
Прямо до боли напоминает сдачу лабораторных по асму в колледже...
Там же все в комментариях написано 1. Вешается свой обработчик на прерывание таймера 2. Выводится символ по центру экрана 3. Восстанавливается прежний обработчик прерывания. |