Часы BIOS - Assembler
Формулировка задачи:
Помогите пожалуйста, не могу понять почему вместо датиы у меня выводится какая хрень. Всю голову сломал.
.386 text segment use16 assume cs:text,ds:data begin: mov bx,data mov ds,bx mov ah,02h ;функция чтения времени int 1Ah ;прерывание BIOS mov al,ch ;заберем в al часы call bcd_asc ;преобразуем в символы mov word ptr time,ax ;занесем в строку mov al,cl ;заберем в al Минуты call bcd_asc ;преобразуем в символы mov word ptr time+3,ax ;занесем в строку mov al,dh ;заберем в al ссекунды call bcd_asc ;преобразуем в символы mov word ptr time+6,ax ;занесем в строку mov ah,09h ;функция вывода на экран mov dx,offset clock ;смещение строки int 21h ;подпрограмма преобразования упакованного bcd-числа в символы ;На входе BCD в AL. На выходе символы AX bcd_asc proc mov ah,al ;занесем число и в al and ah,0fh ;выделим в ah малдшую цифру add ah,'0' ;преобразуем в ASCII and al,0f0h ;выделим в al старшую цифру add ah,4 ;сдвиг в начало регистра. КОМАНДА 80386! add al,'0' ;преобразуем в ASCII ret bcd_asc endp text ends data segment use16 clock db 'This time is= ' time db 0,0,':',0,0,':',0,0,'$' data ends stk segment stack db 256 dup(0) stk ends end begin
САм, разобрался. похоже что бубен закипел и я я начал печатать рандом символы.
Ошибка была в процедуре bcd_asc.
вот правильный вариант:
bcd_asc proc mov ah,al ;занесем число и в al and ah,0fh ;выделим в ah малдшую цифру add ah,'0' ;преобразуем в ASCII and al,0f0h ;выделим в al старшую цифру shr al,4 ;сдвиг в начало регистра. КОМАНДА 80386! add al,'0' ;преобразуем в ASCII ret bcd_asc endp
Решение задачи: «Часы BIOS»
textual
Листинг программы
bcd_asc proc db 0d4h, 10h ; AL / 10h ; AH частное(старший разряд), AL остаток(младший разряд) add ax, 3030h xchg al, ah ret bcd_asc endp
Объяснение кода листинга программы
Список элементов:
- bcd_asc proc - процедура обработки чисел в формате BCD
- db 0d4h, 10h - описание диапазона значений для регистра AL
- AH частное(старший разряд), AL остаток(младший разряд) - описание диапазона значений для регистра AH и AL
- add ax, 3030h - сложение регистра AX и 3030h
- xchg al, ah - обмен значениями между регистрами AL и AH
- ret - возврат из процедуры
- bcd_asc endp - окончание описания процедуры
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д