По введенному целому числу М распечатать все трёхзначные десятичные числа, сумма цифр которых равна М - Assembler

Узнай цену своей работы

Формулировка задачи:

По введенному целому числу М распечатать все трёхзначные десятичные числа, сумма цифр которых равна М. Желательно использовать model tiny

Решение задачи: «По введенному целому числу М распечатать все трёхзначные десятичные числа, сумма цифр которых равна М»

textual
Листинг программы
.model tiny
 
.code
 
        org     100h
main    proc
 
        jmp     start
 
        ;Данные
        a1              db      0
        a2              db      0
        a3              db      0
        CrLf            db      0Dh, 0Ah, '$'
        M               dw      0
        KeyBuf          db      3, 4 dup(0)
start:
        ;программа
 
        mov     ah,     0Ah
        lea     dx,     [KeyBuf]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        lea     si,     [KeyBuf+1]
        lea     di,     [M]
        call    Str2Num
 
        mov     bl,     1
        For1:
                mov     bh,     0
                For2:
                        mov     cl,     0
                        For3:
                                mov     ax,     0
                                add     al,     bl
                                add     al,     bh
                                add     al,     cl
                                cmp     ax,     [M]
                                jne     Next3
 
                                push    bx
                                push    cx
                                add     bx,     '00'
                                add     cx,     '00'
                                mov     [a1],   bl
                                mov     [a2],   bh
                                mov     [a3],   cl
                                mov     ah,     09h
                                lea     dx,     [a1]
                                int     21h
                                pop     cx
                                pop     bx
                        Next3:
                                inc     cl
                                cmp     cl,     9
                        jbe     For3
 
                        inc     bh
                        cmp     bh,     9
                jbe     For2
 
                inc     bl
                cmp     bl,     9
        jbe     For1
        int     20h
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
 
end     main

Объяснение кода листинга программы

Код написан на ассемблере для платформы Windows (x86). Список переменных и их значений:

  1. a1, a2, a3 - три трёхзначных числа, сумма цифр которых равна М.
  2. CrLf - символ, обозначающий перевод строки (0Dh, 0Ah, '$').
  3. M - двубайтовое число, содержащее сумму цифр введенного числа.
  4. KeyBuf - буфер для ввода числа с клавиатуры (3 символа).
  5. bl, bh, cl - булевые переменные, используемые в циклах.
  6. si, di - указатели на байты в памяти, используемые для передачи данных между процедурами. Описание действий:
  7. Ввод числа с клавиатуры с помощью процедуры int 21h.
  8. Проверка введенного числа с помощью процедуры Str2Num.
  9. Цикл, который выполняется до тех пор, пока не будет введено неверное число или не будут введены все числа от 0 до 9.
    • Вычисление следующего трёхзначного числа.
    • Проверка суммы цифр этого числа.
    • Если сумма цифр больше 65535, то цикл продолжается.
    • Если сумма цифр меньше или равна 65535, то она выводится на экран.
  10. Вывод на экран символа перевода строки. Процедура Str2Num выполняет следующие действия:
  11. Преобразование строки в число.
  12. Проверка на ошибки (переполнение или неверный символ).
  13. Возврат числа в память.

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

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