Перевод из десятичной в пятеричную систему счисления [tasm] - Assembler

Узнай цену своей работы

Формулировка задачи:

Нужно решить задачу Преобразовать двухразрядное Десятичное число в пятеричное. Результат с текстовым сообщением вывести на экран. Десятичное число вводится с клавиатуры. Предусмотреть приглашение к вводу числа.

Решение задачи: «Перевод из десятичной в пятеричную систему счисления [tasm]»

textual
Листинг программы
.MODEL  Small
 
.DATA
 
KeyBuf  db      3, 0, 3 dup(0)      ;max,len,string,CR(0dh)
CR_LF   db      0Dh, 0Ah, '$'
 
Prompt  db      'Введите число: ', '$'
Res10   db      'Введено число (десятичное): ', '$'
Res08   db      'Введено число (пятеричное): ', '$'
Error01 db      'Ошибка ввода числа',0Dh, 0Ah, '$'
 
Numer   dw      ?
 
.CODE
 
; выводит число в регистре AX на экран
; входные данные:
; cx - система счисления (не больше 10)
; ax - число для отображения
Show_ax PROC
;        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@show
        ret
Show_ax ENDP
 
; преобразования строки в число
; на входе:
; ds:[si] - строка с числом
; ds:[di] - адрес числа
; на выходе
; ds:[di] - число
; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num PROC
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
        mov     bx, 10
        xor     ax, ax
 
@@Loop:
        mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
        mov     [di], ax   ; игнорируем старшее слово
        cmp     dx, 0      ; проверяем, результат на переполнение
        jnz     @@Error
 
        mov     al, [si]   ; Преобразуем следующий символ в число
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error    ; Если сумма больше 65535
        inc     si
 
        loop    @@Loop
 
        mov     [di], ax
        clc
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Str2Num ENDP
 
Main    PROC    FAR
        mov     ax, @DATA
        mov     ds, ax
        mov     es, ax
 
        ; ввод числа с клавиатуры (строки)
        lea     dx, Prompt
        mov     ah, 09h
        int     21h
 
        mov     ah, 0Ah
        mov     dx, offset KeyBuf
        int     21h
 
        ; перевод строки (на новую строку)
        lea     dx, CR_LF
        mov     ah, 09h
        int     21h
 
 
        ; преобразование строки в число
        lea     si, KeyBuf+1
        lea     di, Numer
        call    Str2Num
 
        ; проверка на ошибку
        jnc     @@NoError
 
        ; если есть ошибка ввода - напечатать сообщение об ошибке
        lea     dx, Error01
        mov     ah, 09h
        int     21h
        jmp     @@Exit
 
        ; если нет ошибки ввода - напечатать число
@@NoError:
        ; в десятичном представлении
        lea     dx, Res10
        mov     ah,09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 10
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah, 09h
        int     21h
 
        ; в восьмеричном представлении
        lea     dx, Res08
        mov     ah, 09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 5
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah, 09h
        int     21h
 
        ; выход
@@Exit:
        ; ожидание нажатия любой клавиши
        mov     ah, 01h
        int     21h
 
        mov     ax, 4c00h
        int     21h
Main    ENDP
 
.STACK  100h
 
        END     Main

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

Код написан на ассемблере и выполняет следующие действия:

  1. Ввод числа с клавиатуры в виде строки.
  2. Преобразование строки в число с помощью функции Str2Num.
  3. Проверка на ошибку ввода числа.
  4. Вывод введённого числа в десятичной системе счисления.
  5. Вывод введённого числа в пятеричной системе счисления.
  6. Ожидание нажатия любой клавиши для завершения работы программы.

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


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

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

13   голосов , оценка 3.923 из 5
Похожие ответы