Перевод числа в римские цифры - 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 для перевода числа в римские цифры.