Перевод числа в римские цифры - Assembler

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

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

Нужно написать программу, которая переводит число в римские цифры. Программа должна содержать макрос (! вот с ним особая проблема!) и должна быть в 16рязрядном режиме (сейчас она далеко не в нем)
Листинг программы
  1. .model tiny
  2. .code
  3. .486
  4. org 100h
  5. START:
  6. mov ah,9
  7. mov dx,offset pin
  8. int 21h
  9. mov ah,10
  10. mov dx,offset strNumber
  11. int 21h ;вводим с клавиатуры
  12. mov ah,9
  13. mov dx,offset rom ;roman number is
  14. int 21h
  15. ;преобразуем строку в число
  16. movzx cx,[strNumber+1]
  17. mov si,offset strNumber+2
  18. xor eax,eax
  19. cdq
  20. str2int:lodsb
  21. imul dx,10
  22. add dx,ax
  23. sub dx,48
  24. loop str2int ;Теперь в edx число
  25. mov ax,dx
  26. xor bx,bx
  27. jmp begincycle
  28. int2Rom:cwd
  29. div word ptr[Base+bx]
  30. mov cx,ax
  31. mov ax,dx
  32. jcxz skip
  33. mov dx,[Roman+bx]
  34. pusha
  35. outnum:mov ah,9
  36. int 21h
  37. loop outnum
  38. popa
  39. skip:add bx,2
  40. begincycle:test ax,ax
  41. jne int2Rom
  42. opr
  43. xor ax,ax
  44. int 16h
  45. dec al
  46. jne START ;если нажат esc - выход
  47. ret
  48. strNumber db 5, 6 DUP(0)
  49. Base dw 100,90,50,40,10,9,5,4,1
  50. Roman dw m,cm,d,cd,c,xc,l,xl,x,ix,v,iv,i
  51. pin db 13,10,"Please, input the number(0...99): $"
  52. rom db 13,10,"Roman number is:$"
  53. c db "C$" ; C db 100
  54. xc db "XC$" ; XC db 90
  55. l db "L$" ; L db 50
  56. xl db "XL$" ; XL db 40
  57. x db "X$" ; X db 10
  58. ix db "IX$" ; IX db 9
  59. v db "V$" ; V db 5
  60. iv db "IV$" ; IV db 4
  61. i db "I$" ; I db 1
  62. END START

Решение задачи: «Перевод числа в римские цифры»

textual
Листинг программы
  1. .model tiny
  2. .code
  3. .486
  4. org 100h
  5.  
  6. input macro A
  7.   mov ah,10
  8.   mov dx,offset A
  9.   int 21h
  10. endm
  11.  
  12. output macro A
  13.   mov ah,9
  14.   mov dx,offset A
  15.   int 21h
  16. endm
  17.  
  18. getkey macro
  19.   xor ax,ax
  20.   int 16h
  21. endm
  22.  
  23. START:
  24.   output pin
  25.   input strNumber                 ;вводим  с клавиатуры
  26.   output rom         ;roman number is
  27.  
  28.   ;преобразуем строку в число
  29.   movzx cx,[strNumber+1]
  30.   jcxz exit
  31.   mov   si,offset strNumber+2
  32.   xor   eax,eax
  33.   cdq
  34.   str2int:lodsb
  35.         imul dx,10
  36.         add dx,ax
  37.         sub dx,48
  38.   loop str2int          ;Теперь в edx число
  39.  
  40.   mov ax,dx
  41.   xor bx,bx
  42.   jmp begincycle
  43.  
  44.   int2Rom:cwd
  45.           div  word ptr[Base+bx]
  46.           mov  cx,ax
  47.           mov  ax,dx
  48.           jcxz skip
  49.           mov dx,[Roman+bx]
  50.           pusha
  51.           outnum:mov ah,9
  52.                  int 21h
  53.           loop outnum
  54.           popa
  55.           skip:add  bx,2
  56.           begincycle:test ax,ax
  57.   jne int2Rom
  58.  
  59.   getkey
  60.   dec al
  61.   jne START ;если нажат esc - выход
  62. exit:
  63.   int 20h
  64.  
  65.   strNumber db 5, 6 DUP(0)
  66.   Base      dw 100,90,50,40,10,9,5,4,1
  67.   Roman     dw c,xc,l,xl,x,ix,v,iv,i
  68.   pin       db 13,10,"Please, input the number(0...99): $"
  69.   rom       db 13,10,"Roman number is:$"
  70.   c         db  "C$"                           ;  C db   100
  71.   xc        db "XC$"                           ;  XC db   90
  72.   l         db  "L$"                           ;  L db    50
  73.   xl        db "XL$"                           ;  XL db   40
  74.   x         db  "X$"                           ;  X db    10
  75.   ix        db "IX$"                           ;  IX db    9
  76.   v         db  "V$"                           ;  V db     5
  77.   iv        db "IV$"                           ;  IV db    4
  78.   i         db  "I$"                           ;  I db     1
  79. END START

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

  1. Создание макросов для ввода и вывода данных:
    • переменная input содержит макрос для ввода данных с клавиатуры
    • переменная output содержит макрос для вывода данных на экран
    • переменная getkey содержит макрос для получения нажатой клавиши
  2. Инициализация программы:
    • указание того, что используется модель tiny
    • определение начала кода
    • указание на использование процессора 486
    • задание начальной точки программы
  3. Вывод на экран приглашения к вводу и ввод числа с клавиатуры:
    • вывод на экран сообщения Please, input the number(0...99): $
    • ввод числа с клавиатуры и сохранение в переменной strNumber
  4. Преобразование строки в число:
    • инициализация переменных и цикла для преобразования строки в число
  5. Преобразование числа в римское число:
    • используются метки и операции для преобразования числа в римское
    • вызывается макрос для вывода результата на экран
    • проверяется нажата ли клавиша esc, если да, программа завершается
  6. Определение переменных:
    • переменная strNumber для хранения вводимого числа
    • переменная Base для хранения базовых значений римских цифр
    • переменная Roman для хранения значений римских цифр
    • переменные для хранения представления римских цифр
  7. Завершение программы:
    • остановка программы Данный код является последовательностью инструкций на языке ассемблера x86 для перевода числа в римские цифры.

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


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

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

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

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

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

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