Определить порядок старшей цифры числа (единицы, десятки, сотни т.д.) - 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

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы