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

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

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

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

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

textual
Листинг программы
  1. .MODEL  Small
  2.  
  3. .DATA
  4.  
  5. KeyBuf  db      3, 0, 3 dup(0)      ;max,len,string,CR(0dh)
  6. CR_LF   db      0Dh, 0Ah, '$'
  7.  
  8. Prompt  db      'Введите число: ', '$'
  9. Res10   db      'Введено число (десятичное): ', '$'
  10. Res08   db      'Введено число (пятеричное): ', '$'
  11. Error01 db      'Ошибка ввода числа',0Dh, 0Ah, '$'
  12.  
  13. Numer   dw      ?
  14.  
  15. .CODE
  16.  
  17. ; выводит число в регистре AX на экран
  18. ; входные данные:
  19. ; cx - система счисления (не больше 10)
  20. ; ax - число для отображения
  21. Show_ax PROC
  22. ;        mov     cx, 10
  23.         xor     di, di          ; di - кол. цифр в числе
  24. @@Conv:
  25.         xor     dx, dx
  26.         div     cx              ; dl = num mod 10
  27.         add     dl, '0'         ; перевод в символьный формат
  28.         inc     di
  29.         push    dx              ; складываем в стэк
  30.         or      ax, ax
  31.         jnz     @@conv
  32.         ; выводим из стэка на экран
  33. @@Show:
  34.         pop     dx              ; dl = очередной символ
  35.         mov     ah, 2           ; ah - функция вывода символа на экран
  36.         int     21h
  37.         dec     di              ; повторяем пока di<>0
  38.         jnz     @@show
  39.         ret
  40. Show_ax ENDP
  41.  
  42. ; преобразования строки в число
  43. ; на входе:
  44. ; ds:[si] - строка с числом
  45. ; ds:[di] - адрес числа
  46. ; на выходе
  47. ; ds:[di] - число
  48. ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
  49. Str2Num PROC
  50.         push    ax
  51.         push    bx
  52.         push    cx
  53.         push    dx
  54.         push    ds
  55.         push    es
  56.  
  57.         push    ds
  58.         pop     es
  59.  
  60.         mov     cl, ds:[si]
  61.         xor     ch, ch
  62.  
  63.         inc     si
  64.  
  65.         mov     bx, 10
  66.         xor     ax, ax
  67.  
  68. @@Loop:
  69.         mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
  70.         mov     [di], ax   ; игнорируем старшее слово
  71.         cmp     dx, 0      ; проверяем, результат на переполнение
  72.         jnz     @@Error
  73.  
  74.         mov     al, [si]   ; Преобразуем следующий символ в число
  75.         cmp     al, '0'
  76.         jb      @@Error
  77.         cmp     al, '9'
  78.         ja      @@Error
  79.         sub     al, '0'
  80.         xor     ah, ah
  81.         add     ax, [di]
  82.         jc      @@Error    ; Если сумма больше 65535
  83.         inc     si
  84.  
  85.         loop    @@Loop
  86.  
  87.         mov     [di], ax
  88.         clc
  89.         pop     es
  90.         pop     ds
  91.         pop     dx
  92.         pop     cx
  93.         pop     bx
  94.         pop     ax
  95.         ret
  96. @@Error:
  97.         xor     ax, ax
  98.         mov     [di], ax
  99.         stc
  100.         pop     es
  101.         pop     ds
  102.         pop     dx
  103.         pop     cx
  104.         pop     bx
  105.         pop     ax
  106.         ret
  107. Str2Num ENDP
  108.  
  109. Main    PROC    FAR
  110.         mov     ax, @DATA
  111.         mov     ds, ax
  112.         mov     es, ax
  113.  
  114.         ; ввод числа с клавиатуры (строки)
  115.         lea     dx, Prompt
  116.         mov     ah, 09h
  117.         int     21h
  118.  
  119.         mov     ah, 0Ah
  120.         mov     dx, offset KeyBuf
  121.         int     21h
  122.  
  123.         ; перевод строки (на новую строку)
  124.         lea     dx, CR_LF
  125.         mov     ah, 09h
  126.         int     21h
  127.  
  128.  
  129.         ; преобразование строки в число
  130.         lea     si, KeyBuf+1
  131.         lea     di, Numer
  132.         call    Str2Num
  133.  
  134.         ; проверка на ошибку
  135.         jnc     @@NoError
  136.  
  137.         ; если есть ошибка ввода - напечатать сообщение об ошибке
  138.         lea     dx, Error01
  139.         mov     ah, 09h
  140.         int     21h
  141.         jmp     @@Exit
  142.  
  143.         ; если нет ошибки ввода - напечатать число
  144. @@NoError:
  145.         ; в десятичном представлении
  146.         lea     dx, Res10
  147.         mov     ah,09h
  148.         int     21h
  149.  
  150.         mov     ax, Numer
  151.         mov     cx, 10
  152.         call    Show_ax
  153.  
  154.         lea     dx, CR_LF
  155.         mov     ah, 09h
  156.         int     21h
  157.  
  158.         ; в восьмеричном представлении
  159.         lea     dx, Res08
  160.         mov     ah, 09h
  161.         int     21h
  162.  
  163.         mov     ax, Numer
  164.         mov     cx, 5
  165.         call    Show_ax
  166.  
  167.         lea     dx, CR_LF
  168.         mov     ah, 09h
  169.         int     21h
  170.  
  171.         ; выход
  172. @@Exit:
  173.         ; ожидание нажатия любой клавиши
  174.         mov     ah, 01h
  175.         int     21h
  176.  
  177.         mov     ax, 4c00h
  178.         int     21h
  179. Main    ENDP
  180.  
  181. .STACK  100h
  182.  
  183.         END     Main

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

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

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

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


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

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

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы