Определить порядок старшей цифры числа (единицы, десятки, сотни т.д.) - Assembler
Формулировка задачи:
Задано натуральное число, диапазон значений - слово. Определить порядок старшей цифры числа (единицы, десятки, сотни т.д.)
Решение задачи: «Определить порядок старшей цифры числа (единицы, десятки, сотни т.д.)»
textual
Листинг программы
@stack segment para stack db 1024 dup(?) @stack ends @data segment X dw ? CrLf db 0Dh, 0Ah, '$' KbdBuf db 6, ?, 6 dup(?) Prompt db 'Enter a number (dec): ', '$' MsgErr db 'Input error', 0Ah, 0Dh, '$' MsgRes db 'The number (hex): ', '$' TableOrder dw offset Units dw offset Tens dw offset Hundreds dw offset Thousands dw offset TensOfThousands Units db 'Units', '$' Tens db 'Tens', '$' Hundreds db 'Hundreds', '$' Thousands db 'Thousands', '$' TensOfThousands db 'Tens of thousands', '$' @data ends @code segment assume cs:@code, ds:@data, ss:@stack main proc ;инициализация сегментного регистра данных mov ax, @data mov ds, ax EnterNumber: ;ввод строки с числом в 10-й системе счисления mov ah, 09h lea dx, [Prompt] int 21h mov ah, 0Ah lea dx, [KbdBuf] int 21h ;перевод строки mov ah, 09h lea dx, [CrLf] int 21h ;преобразование введённой строки в число lea si, [KbdBuf+1] lea di, [X] call Str2Num jc Error jmp Process Error: mov ah, 09h lea dx, [MsgErr] int 21h jmp EnterNumber Process: mov ax, [X] mov si, 0 mov bx, 10 @@Repeat: inc si mov dx, 0 div bx test ax, ax jnz @@Repeat dec si add si, si mov ah, 09h mov dx, TableOrder[si] int 21h ;перевод строки mov ah, 09h lea dx, [CrLf] int 21h ;завершение программы mov ax, 4C00h int 21h main 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 @code ends end main