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