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