Запись числа прописью - Assembler

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

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

Перевод числа из десятичной формы (<255) в прописную Написать программу, которая вводит и и записывает(выводит)однобайтовое целое число без знака прописью, например 128 = сто двадцать восемь. Был бы рад любой помощи, он полной до частичной, а иначе меня ждет призыв летний в армию. Думаю разницы нет, но компилировать могу в FASM. И EMY8086.

Решение задачи: «Запись числа прописью»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf    db      0Dh, 0Ah, '$'
  9.  
  10.         _100    db      'сто', '$'
  11.         _200    db      'двести', '$'
  12.         _20     db      'двадцать', '$'
  13.         _30     db      'тридцать', '$'
  14.         _40     db      'сорок', '$'
  15.         _50     db      'пятьдесят', '$'
  16.         _60     db      'шестьдесят', '$'
  17.         _70     db      'семьдесят', '$'
  18.         _80     db      'восемьдесят', '$'
  19.         _90     db      'девяносто', '$'
  20.         _10     db      'десять', '$'
  21.         _11     db      'одиннадцать', '$'
  22.         _12     db      'двенадцать', '$'
  23.         _13     db      'тринадцать', '$'
  24.         _14     db      'четырнадцать', '$'
  25.         _15     db      'пятнадцать', '$'
  26.         _16     db      'шестнадцать', '$'
  27.         _17     db      'семнадцать', '$'
  28.         _18     db      'восемнадцать', '$'
  29.         _19     db      'девятнадцать', '$'
  30.         _0      db      'ноль', '$'
  31.         _1      db      'один', '$'
  32.         _2      db      'два', '$'
  33.         _3      db      'три', '$'
  34.         _4      db      'четыре', '$'
  35.         _5      db      'пять', '$'
  36.         _6      db      'шесть', '$'
  37.         _7      db      'семь', '$'
  38.         _8      db      'восемь', '$'
  39.         _9      db      'девять', '$'
  40.  
  41.         hundreds        label
  42.                 dw      offset  _100
  43.                 dw      offset  _200
  44.         dozens2         label
  45.                 dw      offset  _20
  46.                 dw      offset  _30
  47.                 dw      offset  _40
  48.                 dw      offset  _50
  49.                 dw      offset  _60
  50.                 dw      offset  _70
  51.                 dw      offset  _80
  52.                 dw      offset  _90
  53.         dozens1         label
  54.                 dw      offset  _10
  55.                 dw      offset  _11
  56.                 dw      offset  _12
  57.                 dw      offset  _13
  58.                 dw      offset  _14
  59.                 dw      offset  _15
  60.                 dw      offset  _16
  61.                 dw      offset  _17
  62.                 dw      offset  _18
  63.                 dw      offset  _19
  64.         units           label
  65.                 dw      offset  _0
  66.                 dw      offset  _1
  67.                 dw      offset  _2
  68.                 dw      offset  _3
  69.                 dw      offset  _4
  70.                 dw      offset  _5
  71.                 dw      offset  _6
  72.                 dw      offset  _7
  73.                 dw      offset  _8
  74.                 dw      offset  _9
  75.  
  76.         N       db      0
  77.  
  78.         kbdBuf  db      4, 0, 4 dup(0)
  79.         Prompt  db      'Input number: ', '$'
  80. .code
  81.  
  82. main    proc
  83.         mov     ax,     @data
  84.         mov     ds,     ax
  85.  
  86.         ;ввод числа в виде строки
  87.         mov     ah,     09h
  88.         lea     dx,     Prompt
  89.         int     21h
  90.         mov     ah,     0Ah
  91.         lea     dx,     kbdBuf
  92.         int     21h
  93.         mov     ah,     09h
  94.         lea     dx,     CrLf
  95.         int     21h
  96.         ;преобразования строки в число
  97.         lea     si,     kbdBuf+1
  98.         call    StrToUInt8
  99.         mov     N,      al
  100.  
  101.         ;получение числа прописью
  102.         mov     ax,     0
  103.         mov     al,     N
  104.         mov     ch,     1       ;число равно нулю
  105. @@Hundreds:
  106.         mov     cl,     100
  107.         div     cl
  108.         cmp     al,     0
  109.         je      @@Dozens
  110.         mov     ch,     0       ;не нужно выводить "ноль"
  111.         lea     si,     Hundreds
  112.         mov     bx,     0
  113.         mov     bl,     al
  114.         dec     bx
  115.         add     bx,     bx
  116.         mov     dx,     [si+bx]
  117.         push    ax
  118.         mov     ah,     09h
  119.         int     21h
  120.         mov     ah,     02h
  121.         mov     dl,     ' '
  122.         int     21h
  123.         pop     ax
  124. @@Dozens:
  125.         cmp     ah,     20
  126.         jae     @@Dozens2
  127.         cmp     ah,     10
  128.         jb      @@Dozens2
  129.         lea     si,     Dozens1
  130.         mov     bx,     0
  131.         mov     bl,     ah
  132.         sub     bx,     10
  133.         add     bx,     bx
  134.         mov     dx,     [si+bx]
  135.         push    ax
  136.         mov     ah,     09h
  137.         int     21h
  138.         mov     ah,     02h
  139.         mov     dl,     ' '
  140.         int     21h
  141.         pop     ax
  142.         jmp     @@Exit
  143.  
  144. @@Dozens2:
  145.         mov     al,     ah
  146.         mov     ah,     0
  147.         mov     cl,     10
  148.         div     cl
  149.         cmp     al,     0
  150.         je      @@Units
  151.         mov     ch,     0
  152.         lea     si,     Dozens2
  153.         mov     bx,     0
  154.         mov     bl,     al
  155.         sub     bx,     2
  156.         add     bx,     bx
  157.         mov     dx,     [si+bx]
  158.         push    ax
  159.         mov     ah,     09h
  160.         int     21h
  161.         mov     ah,     02h
  162.         mov     dl,     ' '
  163.         int     21h
  164.         pop     ax
  165. @@Units:
  166.         ;требуется выводить ноль?
  167.         or      ch,     ah
  168.         jz      @@Exit
  169.         lea     si,     Units
  170.         mov     bx,     0
  171.         mov     bl,     ah
  172.         add     bx,     bx
  173.         mov     dx,     [si+bx]
  174.         push    ax
  175.         mov     ah,     09h
  176.         int     21h
  177.         pop     ax
  178.  
  179.  
  180.  
  181. @@Exit:
  182.         mov     ax,     4C00h
  183.         int     21h
  184. main    endp
  185.  
  186. ;Преобразование строки Pascal типа в беззнаковое число размером 1 байт
  187. ;на входе:
  188. ;  ds:si - указатель на строку Pascal типа
  189. ;на выходе:
  190. ;  al - считанное число
  191. ;  ah=0
  192. StrToUInt8      proc
  193.         push    bx
  194.         push    cx
  195.         push    dx
  196.         push    si
  197.         push    di
  198.  
  199.         mov     ax,     0       ;итоговое число
  200.         mov     cx,     0       ;количество символов в строке
  201.         mov     cl,     [si]
  202.         mov     bx,     10      ;множитель
  203.         inc     si              ;si - теперь указывает на символьный массив
  204.         jcxz    @@Exit
  205. @@For:
  206.         mul     bl              ;ax=al*10
  207.         cmp     ah,     0       ; проверяем, результат на переполнение
  208.         jne     @@Error
  209.         mov     di,     ax      ;сохраняем промежуточный результат
  210.  
  211.         mov     al,     [si]    ; Преобразуем следующий символ в число
  212.         ;проверка, что символ - цифра
  213.         cmp     al,     '0'
  214.         jb      @@Error
  215.         cmp     al,     '9'
  216.         ja      @@Error
  217.         ;преобразование символа цифры в число
  218.         sub     al,     '0'
  219.         add     ax,     di      ;
  220.         cmp     ah,     0       ; проверяем, результат на переполнение
  221.         jne     @@Error
  222.  
  223.         inc     si
  224.         loop    @@For
  225.  
  226.         clc                     ;нет ошибки
  227.         jmp     @@Exit
  228. @@Error:
  229.         mov     ax,     0
  230.         stc                     ;признак ошибки
  231. @@Exit:
  232.         pop     di
  233.         pop     si
  234.         pop     dx
  235.         pop     cx
  236.         pop     bx
  237.         ret
  238. StrToUInt8      endp
  239.  
  240. end     main

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

  1. Создание переменных:
    • CrLf - байтовая последовательность для перевода строки в консоли
    • _100, _200, _20, _30, _40, _50, _60, _70, _80, _90, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9 - строковые переменные, содержащие числительные
    • hundreds, dozens2, dozens1, units - метки
    • N - байтовая переменная для хранения числа
    • kbdBuf - массив байтов для ввода числа в виде строки
    • Prompt - строка для приглашения ввести число
  2. Ввод числа:
    • Вывод приглашения ввести число
    • Считывание числа в виде строки
    • Преобразование строки в число
  3. Преобразование числа в числительное:
    • Определение сотен, десятков и единиц в числе и вывод их названий в консоль
  4. Обработка ошибок и завершение программы. *примечание: указанный код написан на ассемблере, который приближен к x86 Assembly.

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


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

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

8   голосов , оценка 4.5 из 5

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

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

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