mov ax,vseg
mov ds,ax
mov al,4ah
mov ah,25h
int 21h
; завершаем работу программы
mov ax,4c00h
int 21h ; завершаем работу программы
;--------------------------------------------------------------------------
alarm proc far ; процедура обработчика прерывания по таймеру
;--------------------------------------------------------------------------
push ax ; сохраняем регистры
push dx
mov ah,2 ; выдаем звуковой сигнал
mov dl,7
int 21h
pop dx ; восстанавливаем регистры
pop ax
iret ; возврат из прерывания
endp alarm
;--------------------------------------------------------------------------
prtime proc ; процедура вывода времени
; регистры д.б.в том виде, в каком возвращает
; функция 2 прерывания 1ah
;--------------------------------------------------------------------------
mov bh,20h
mov bl,ch
call bcd ; выводим часы, перед ними пробел
mov bh,':'
mov bl,cl
call bcd ; выводим минуты, перед ними двоеточие
mov bh,':'
mov bl,dh
call bcd ; выводим секунды, передними двоеточие
mov dl,0ah
mov ah,02
int 21h ; выводим перевод строки
ret
endp prtime
;--------------------------------------------------------------------------
bcd proc ; процедура вывода числа в формате bcd
; bh - префикс, bl - число в формате bcd
;--------------------------------------------------------------------------
mov dl,bh
mov ah,02
int 21h ; выводим префикс
mov dl,bl
shr dl,4 ; выделяем левую тетраду
add dl,30h ; корректируем до символа
mov ah,02
int 21h ; и выводим
mov dl,bl
and dl,0Fh ; выделяем правую тетраду
add dl,30h ; корректируем до символа
mov ah,02
int 21h ; и выводим
ret
endp bcd
;--------------------------------------------------------------------------
bcd2int proc ; процедура перевода числа в формате bcd
; в двоичный формат
; bl - число в формате bcd
; результат в al
;--------------------------------------------------------------------------
mov al,bl
shr al,4 ; выделяем левую тетраду
mov bh,10
mul bh ; умножаем значение на 10
and bl,0Fh ; выделяем правую тетраду
add al,bl ; добавляем к значению
ret
endp bcd2int
;--------------------------------------------------------------------------
int2bcd proc ; процедура перевода двоичного числа в
; форимат bcd
; bl - двоичное число
; результат в al
;--------------------------------------------------------------------------
xor ah,ah ; очищаем ah
mov al,bl ; грузим преобразуемое число
mov bl,10
div bl ; делим его на 10
shl al,4 ; сдвигаем частное влево на 4 разряда
or al,ah ; накладываем на него остаток
ret
endp int2bcd
;-------------------------------------------------------------------------
InInt proc ; процедура интерпретации знаковых целых чисел
; параметры: si - смещение буфера
; результат возвращается в регистре ax
;-------------------------------------------------------------------------
push cx
push dx
push bx
push si
push di
; обрабатываем содержимое буфера
cmp byte ptr [si],"-" ; если первый символ минус
jnz ii1
mov di,1 ; устанавливаем флаг
inc si ; и пропускаем его
ii1:
xor ax,ax
mov bx,10 ; основание сc
ii2:
mov cl,[si] ; берем символ из буфера
cmp cl,0dh ; проверяем не последний ли он
jz endin
; если символ не последний, то проверяем его на правильность
cmp cl,'0' ; если введен неверный символ <0
jl endin
cmp cl,'9' ; если введен неверный символ >9
ja endin ; на этом разбор введенного числа заканчивается
sub cl,'0' ; делаем из символа число
mul bx ; умножаем на 10
add ax,cx ; прибавляем к остальным
inc si ; указатель на следующий символ
jmp ii2 ; повторяем
; все символы из буфера обработаны число находится в ax
endin:
cmp di,1 ; если установлен флаг, то
jnz ii3
neg ax ; делаем число отрицательным
ii3:
pop di
pop si
pop bx
pop dx
pop cx
ret
InInt endp
;-------------------------------------------------------------------------
end main
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.