Перевод числа в римские цифры - 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 для перевода числа в римские цифры.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д