Часы 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

Объяснение кода листинга программы

Список элементов:

  1. bcd_asc proc - процедура обработки чисел в формате BCD
  2. db 0d4h, 10h - описание диапазона значений для регистра AL
  3. AH частное(старший разряд), AL остаток(младший разряд) - описание диапазона значений для регистра AH и AL
  4. add ax, 3030h - сложение регистра AX и 3030h
  5. xchg al, ah - обмен значениями между регистрами AL и AH
  6. ret - возврат из процедуры
  7. bcd_asc endp - окончание описания процедуры

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5