По введенному целому числу М распечатать все трёхзначные десятичные числа, сумма цифр которых равна М - 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). Список переменных и их значений:
- a1, a2, a3 - три трёхзначных числа, сумма цифр которых равна М.
- CrLf - символ, обозначающий перевод строки (0Dh, 0Ah, '$').
- M - двубайтовое число, содержащее сумму цифр введенного числа.
- KeyBuf - буфер для ввода числа с клавиатуры (3 символа).
- bl, bh, cl - булевые переменные, используемые в циклах.
- si, di - указатели на байты в памяти, используемые для передачи данных между процедурами. Описание действий:
- Ввод числа с клавиатуры с помощью процедуры int 21h.
- Проверка введенного числа с помощью процедуры Str2Num.
- Цикл, который выполняется до тех пор, пока не будет введено неверное число или не будут введены все числа от 0 до 9.
- Вычисление следующего трёхзначного числа.
- Проверка суммы цифр этого числа.
- Если сумма цифр больше 65535, то цикл продолжается.
- Если сумма цифр меньше или равна 65535, то она выводится на экран.
- Вывод на экран символа перевода строки. Процедура Str2Num выполняет следующие действия:
- Преобразование строки в число.
- Проверка на ошибки (переполнение или неверный символ).
- Возврат числа в память.