Перевод из десятичной в пятеричную систему счисления [tasm] - Assembler
Формулировка задачи:
Нужно решить задачу
Преобразовать двухразрядное Десятичное число в пятеричное. Результат с текстовым сообщением вывести на экран. Десятичное число вводится с клавиатуры. Предусмотреть приглашение к вводу числа.
Решение задачи: «Перевод из десятичной в пятеричную систему счисления [tasm]»
textual
Листинг программы
.MODEL Small .DATA KeyBuf db 3, 0, 3 dup(0) ;max,len,string,CR(0dh) CR_LF db 0Dh, 0Ah, '$' Prompt db 'Введите число: ', '$' Res10 db 'Введено число (десятичное): ', '$' Res08 db 'Введено число (пятеричное): ', '$' Error01 db 'Ошибка ввода числа',0Dh, 0Ah, '$' Numer dw ? .CODE ; выводит число в регистре AX на экран ; входные данные: ; cx - система счисления (не больше 10) ; ax - число для отображения Show_ax PROC ; mov cx, 10 xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@show ret Show_ax ENDP ; преобразования строки в число ; на входе: ; ds:[si] - строка с числом ; ds:[di] - адрес числа ; на выходе ; ds:[di] - число ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен) Str2Num PROC push ax push bx push cx push dx push ds push es push ds pop es mov cl, ds:[si] xor ch, ch inc si mov bx, 10 xor ax, ax @@Loop: mul bx ; умножаем ax на 10 ( dx:ax=ax*bx ) mov [di], ax ; игнорируем старшее слово cmp dx, 0 ; проверяем, результат на переполнение jnz @@Error mov al, [si] ; Преобразуем следующий символ в число cmp al, '0' jb @@Error cmp al, '9' ja @@Error sub al, '0' xor ah, ah add ax, [di] jc @@Error ; Если сумма больше 65535 inc si loop @@Loop mov [di], ax clc pop es pop ds pop dx pop cx pop bx pop ax ret @@Error: xor ax, ax mov [di], ax stc pop es pop ds pop dx pop cx pop bx pop ax ret Str2Num ENDP Main PROC FAR mov ax, @DATA mov ds, ax mov es, ax ; ввод числа с клавиатуры (строки) lea dx, Prompt mov ah, 09h int 21h mov ah, 0Ah mov dx, offset KeyBuf int 21h ; перевод строки (на новую строку) lea dx, CR_LF mov ah, 09h int 21h ; преобразование строки в число lea si, KeyBuf+1 lea di, Numer call Str2Num ; проверка на ошибку jnc @@NoError ; если есть ошибка ввода - напечатать сообщение об ошибке lea dx, Error01 mov ah, 09h int 21h jmp @@Exit ; если нет ошибки ввода - напечатать число @@NoError: ; в десятичном представлении lea dx, Res10 mov ah,09h int 21h mov ax, Numer mov cx, 10 call Show_ax lea dx, CR_LF mov ah, 09h int 21h ; в восьмеричном представлении lea dx, Res08 mov ah, 09h int 21h mov ax, Numer mov cx, 5 call Show_ax lea dx, CR_LF mov ah, 09h int 21h ; выход @@Exit: ; ожидание нажатия любой клавиши mov ah, 01h int 21h mov ax, 4c00h int 21h Main ENDP .STACK 100h END Main
Объяснение кода листинга программы
Код написан на ассемблере и выполняет следующие действия:
- Ввод числа с клавиатуры в виде строки.
- Преобразование строки в число с помощью функции Str2Num.
- Проверка на ошибку ввода числа.
- Вывод введённого числа в десятичной системе счисления.
- Вывод введённого числа в пятеричной системе счисления.
- Ожидание нажатия любой клавиши для завершения работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д