Задание. Написать программу изменяющую время в BIOSe.
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
Msg DB 10,13,10,’Текущая дата: $’
Msg1 DB 13,10,’Текущее время: $’
Msg2 DB 13,10,’МЕНЮ’,13,10,’1-изменить дату’,13,10
DB ‘2-изменить время’,13,10,’3-выход’,13,10,’=>$’
tmp_data DB ‘00.00.0000$’
tmp_time DB ‘00:00:00$’
Msg3 DB 10,13,10,’=Изменение даты=’,13,10,’День: $’
Msg4 DB 13,10,’Месяц: $’
Msg5 DB 13,10,’Год: $’
Msg6 DB 13,10,’Нажмите 1 для изменения=>$’
Msg7 DB 13,10,’ОШИБКА!!!$’
Msg8 DB 10,13,10,’=Изменение времени=’,13,10,’Часы: $’
Msg9 DB 13,10,’Минуты: $’
Msg10 DB 13,10,’Секунды: $’
.CODE
;
; Процедура преобразования числа в код ASCII
; вход: al - число
; выход: ax - число в коде ASCII
NumInStrByte PROC
mov ah,al
shr al,1 ; сдвиг (10111110=>00001011)
shr al,1
shr al,1
shr al,1
cmp al,9 ; проверить al - цифра или буква
ja label1 ; al>9 т.е. буква A,B,C,D,E,F
add al,48 ; al - цифра 0,1,2,3,4,5,6,7,8,9
jmp label2
label1: add al,55 ; al - буква
label2: and ah,00001111b ; снять биты (10111110=>00001110)
cmp ah,9 ; проверить ah - цифра или буква
ja label3 ; ah>9 т.е. буква A,B,C,D,E,F
add ah,48 ; ah - цифра 0,1,2,3,4,5,6,7,8,9
jmp label4
label3: add ah,55 ; ah - буква
label4: ret
NumInStrByte ENDP
;
; Процедура ждет ввода шестнадцатеричной цифры
; выход: al - число в коде ASCII (нажатая клавиша)
; ah - число
ReadDigit PROC
L01: mov ah,10h
int 16h
mov ah,al ; скан код заменить на ASCII код
cmp al,’0′
jl L01 ; меньше
cmp al,’9′
jle L05 ; меньше или равно
cmp al,’a’
jl L01 ; меньше
cmp al,’f’
jle L04 ; меньше или равно
jmp L01
L04: sub ah,39 ; отнять 86, а потом 1
L05: sub ah,48
push ax
mov ah,2 ; вывести символ
mov dl,al
int 21h
pop ax
ret
ReadDigit ENDP
Каждому предприятию понадобится аренда склада в Одессе на очень выгодных условиях.






