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

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

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

Нужно написать программу, которая переводит число в римские цифры. Программа должна содержать макрос (! вот с ним особая проблема!) и должна быть в 16рязрядном режиме (сейчас она далеко не в нем)
.model tiny
.code
.486
org 100h
START:
  mov ah,9
  mov dx,offset pin
  int 21h
 
  mov ah,10
  mov dx,offset strNumber
  int 21h                 ;вводим  с клавиатуры
 
  mov ah,9
  mov dx,offset rom       ;roman number is
  int 21h
 
  ;преобразуем строку в число
  movzx cx,[strNumber+1]
  mov   si,offset strNumber+2
  xor   eax,eax
  cdq
  str2int:lodsb
        imul dx,10
        add dx,ax
        sub dx,48
  loop str2int          ;Теперь в edx число
 
  mov ax,dx
  xor bx,bx
  jmp begincycle
 
  int2Rom:cwd
          div  word ptr[Base+bx]
          mov  cx,ax
          mov  ax,dx
          jcxz skip
          mov dx,[Roman+bx]
          pusha
          outnum:mov ah,9
                 int 21h
          loop outnum
          popa
          skip:add  bx,2
          begincycle:test ax,ax
  jne int2Rom
 
opr
  xor ax,ax
  int 16h
  dec al
  jne START ;если нажат esc - выход
 
  ret
 
  strNumber db 5, 6 DUP(0)
  Base      dw 100,90,50,40,10,9,5,4,1
  Roman     dw m,cm,d,cd,c,xc,l,xl,x,ix,v,iv,i
  pin       db 13,10,"Please, input the number(0...99): $"
  rom       db 13,10,"Roman number is:$"
  c         db  "C$"                           ;  C db   100
  xc        db "XC$"                           ;  XC db   90
  l         db  "L$"                           ;  L db    50
  xl        db "XL$"                           ;  XL db   40
  x         db  "X$"                           ;  X db    10
  ix        db "IX$"                           ;  IX db    9
  v         db  "V$"                           ;  V db     5
  iv        db "IV$"                           ;  IV db    4
  i         db  "I$"                           ;  I db     1
END START

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

textual
Листинг программы
.model tiny
.code
.486
org 100h
 
input macro A
  mov ah,10
  mov dx,offset A
  int 21h
endm
 
output macro A
  mov ah,9
  mov dx,offset A
  int 21h
endm
 
getkey macro
  xor ax,ax
  int 16h
endm
 
START:
  output pin
  input strNumber                 ;вводим  с клавиатуры
  output rom         ;roman number is
 
  ;преобразуем строку в число
  movzx cx,[strNumber+1]
  jcxz exit
  mov   si,offset strNumber+2
  xor   eax,eax
  cdq
  str2int:lodsb
        imul dx,10
        add dx,ax
        sub dx,48
  loop str2int          ;Теперь в edx число
 
  mov ax,dx
  xor bx,bx
  jmp begincycle
 
  int2Rom:cwd
          div  word ptr[Base+bx]
          mov  cx,ax
          mov  ax,dx
          jcxz skip
          mov dx,[Roman+bx]
          pusha
          outnum:mov ah,9
                 int 21h
          loop outnum
          popa
          skip:add  bx,2
          begincycle:test ax,ax
  jne int2Rom
 
  getkey
  dec al
  jne START ;если нажат esc - выход
exit: 
  int 20h
 
  strNumber db 5, 6 DUP(0)
  Base      dw 100,90,50,40,10,9,5,4,1
  Roman     dw c,xc,l,xl,x,ix,v,iv,i
  pin       db 13,10,"Please, input the number(0...99): $"
  rom       db 13,10,"Roman number is:$"
  c         db  "C$"                           ;  C db   100
  xc        db "XC$"                           ;  XC db   90
  l         db  "L$"                           ;  L db    50
  xl        db "XL$"                           ;  XL db   40
  x         db  "X$"                           ;  X db    10
  ix        db "IX$"                           ;  IX db    9
  v         db  "V$"                           ;  V db     5
  iv        db "IV$"                           ;  IV db    4
  i         db  "I$"                           ;  I db     1
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
Похожие ответы