Установка времени

Для установки времени можно использовать функцию 2Dh:

Регистры на входе: AH = 2Dh CH = часы (0-24); CL = минуты (0-59); DH = секунды(0-59); DL = сотые доли секунды (0-99)
Регистры на выходе: AL = 0, если установка выполнена правильно; AL = FFh, если при установке были заданы неправильные параметры

Пример 2: Вывести текущее время на экран, использую функцию 02h прерывания 1Ah. В программе нет резидентной части.

.186; для pusha/popa и сдвигов

CSEG segment

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

org 100h

Start:

mov ah,02h; Функция 02h прерывания 1Ah:

int 1Ah; чтение времени из RTC,

jc exit_handler; если часы заняты - в другой раз

mov al,ch; CH = час в BCD-формате

call bcd2asc; преобразовать в ASCII,

mov byte ptr output_line[2],ah; поместить их в

mov byte ptr output_line[3],al; строку output_line

mov byte ptr output_line[4],':'

mov al,cl; CL = минута в BCD-формате

call bcd2asc

mov byte ptr output_line[5],ah

mov byte ptr output_line[6],al

mov byte ptr output_line[7],':'

mov al,dh; DH = секунда в BCD-формате

call bcd2asc

mov byte ptr output_line[8],ah

mov byte ptr output_line[9],al

mov byte ptr output_line[10],'$'

mov ah,9

mov dx,offset output_line

int 21h

int 20h

exit_handler:

mov ah,9

mov dx,offset string1

int 21h

int 20h

; процедура bcd2asc

; преобразует старшую цифру упакованного BCD-числа из AL в ASCII-символ,

; который будет помещен в АН, а младшую цифру - в ASCII-символ в AL

bcd2asc proc near

mov ah,al

and al,0Fh; оставить младшие 4 бита в AL

shr ah,4; сдвинуть старшие 4 бита в АН

or ax,3030h; преобразовать в ASCII-символы

ret

bcd2asc endp

string1 db 'V drygoy raz.$'

output_line db?

CSEG ends

Пример 3: Вывести текущее время на экран, использую функцию 02h прерывания 1Ah. Программа должна содержать резидентную часть.

.model tiny

.code

.186; для pusha/popa и сдвигов

org 100h

Start:

mov ax, 3;

int 10h;

startproc proc near

; сохранить адрес предыдущего обработчика прерывания 1Ch

mov ax,351Ch; АН = 35h, AL = номер прерывания

int 21h; функция DOS: определить адрес обработчика

mov word ptr old_int1Ch,bx; прерывания

mov word ptr old_int1Ch+2,es; (возвращается в ES:BX)

; установить наш обработчик

mov ax,251Ch; АН = 25h, AL = номер прерывания

mov dx,offset int1Ch_handler; DS:DX - адрес обработчика

int 21h; установить обработчик прерывания 1Ch

; здесь размещается собственно программа, например вызов command.com

mov ah,1

int 21h; ожидание нажатия на любую клавишу

; конец программы

; восстановить предыдущий обработчик прерывания 1Ch

mov ax,251Ch; АН = 25h, AL = номер прерывания

mov dx,word ptr old_int1Ch+2

mov ds,dx

mov dx,word ptr cs:old_int1Ch; DS:DX - адрес обработчика

int 21h

ret

old_int1Ch dd?; здесь хранится адрес предыдущего обработчика

start_position dw 0; позиция на экране, в которую выводится текущее время

startproc endp

; обработчик для прерывания 1Ch

; выводит текущее время в позицию start_position на экране

; (только в текстовом режиме)

int1Ch_handler proc far

pusha; обработчик аппаратного прерывания

push es; должен сохранять ВСЕ регистры

push ds

push cs; на входе в обработчик известно только

pop ds; значение регистра CS

mov ah,02h; Функция 02h прерывания 1Ah:

int 1Ah; чтение времени из RTC,

jc exit_handler; если часы заняты - в другой раз

mov al,ch; CH = час в BCD-формате

call bcd2asc; преобразовать в ASCII,

mov byte ptr output_line[2],ah; поместить их в

mov byte ptr output_line[4],al; строку output_line

mov al,cl; CL = минута в BCD-формате

call bcd2asc

mov byte ptr output_line[10],ah

mov byte ptr output_line[12],al

mov al,dh; DH = секунда в BCD-формате

call bcd2asc

mov byte ptr output_line[16],ah

mov byte ptr output_line[18],al

mov cx,output_line_l; число байт в строке - в СХ

push 0B800h

pop es; адрес в видеопамяти

mov di,word ptr start_position; в ES:DI

mov si,offset output_line; адрес строки в DS:SI

cld

rep movsb; скопировать строку

exit_handler:

pop ds; восстановить все регистры

pop es

popa

jmp cs:old_int1Ch; передать управление предыдущему обработчику

; процедура bcd2asc

; преобразует старшую цифру упакованного BCD-числа из AL в ASCII-символ,

; который будет помещен в АН, а младшую цифру - в ASCII-символ в AL

bcd2asc proc near

mov ah,al

and al,0Fh; оставить младшие 4 бита в AL

shr ah,4; сдвинуть старшие 4 бита в АН

or ax,3030h; преобразовать в ASCII-символы

ret

bcd2asc endp

; строка " 00: 00:00 " с атрибутом 1Fh (белый на синем) после каждого символа

output_line db ' ',1Fh,'0',1Fh,'0',1Fh,':',1Fh

db ' ',1Fh,'0',1Fh,'0',1Fh,':',1Fh

db '0',1Fh,'0',1Fh,' ',1Fh

output_line_l equ $ - output_line

int1Ch_handler endp

end start


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: