Вводится последовательность цифр. Посчитать количество четных и сумму нечетных элементов - Assembler
Формулировка задачи:
С клавиатуры вводится последовательность цифр. Вывести на экран количество четных и сумму нечетных элементов.
Tasm, DOSBox
Решение задачи: «Вводится последовательность цифр. Посчитать количество четных и сумму нечетных элементов»
textual
Листинг программы
_STACK segment para stack db 1024 dup(?) _STACK ends _DATA segment Msg db 'Vvedite cifry. Vyhod ENTER ', 0Dh, 0Ah, '$' MsgOdd db 0Dh, 0Ah, 'Summa nechetnyh ', '$' MsgEven db 0Dh, 0Ah, 'Kolichestvo chetnyh ', '$' CrLf db 0Dh, 0Ah, '$' _DATA ends _TEXT segment assume cs:_TEXT, ds:_DATA, ss:_STACK main proc ;инициализация сегментного регистра данных mov ax, _DATA mov ds, ax mov ah, 09h lea dx, [Msg] int 21h mov bl, 0 ;сумма нечётных элементов mov bh, 0 ;количество чётных элементов @@Repeat: mov ah, 01h int 21h cmp al, 0Dh jz @@Break sub al, '0' test al, 1 jz @@Even @@Odd: add bl, al ;сумма нечётных элементов jmp @@Repeat @@Even: inc bh ;количество чётных элементов jmp @@Repeat @@Break: mov ah, 09h lea dx, [MsgEven] int 21h mov al, bh aam add ax, '00' mov dl, ah mov dh, al mov ah, 02h int 21h mov dl, dh int 21h mov ah, 09h lea dx, [MsgOdd] int 21h mov al, bl aam add ax, '00' mov dl, ah mov dh, al mov ah, 02h int 21h mov dl, dh int 21h ;завершение программы mov ax, 4C00h int 21h main endp _TEXT ends end main
Объяснение кода листинга программы
В этом коде на языке Assembler с маленькой модификацией реализован алгоритм подсчёта количества четных и суммы нечётных чисел в последовательности. Он работает следующим образом:
- Сначала в регистр AX загружается стартовый адрес строки с сообщением «Vvedite cifry. Vyhod ENTER» в сегменте данных.
- Затем в регистр BL загружается начальное значение суммы нечётных чисел, а в регистр BH — начальное значение количества четных чисел.
- Далее выполняется цикл, в котором происходит следующее: — В каждый цикл с помощью команды int 21h с номером сервиса 01h (отображение одного символа) в регистр AL загружается очередной символ ввода. При этом, если введённый символ является десятичной цифрой, то он добавляется к сумме нечётных чисел (регистр BL) и к количеству четных чисел (регистр BH). — Если введённый символ является символом новой строки (0Dh), то выполняется переход на метку @@Break.
- Если введённый символ является нечётным числом, то происходит переход на метку @@Odd. В противном случае (если введённый символ является чётным числом) — на метку @@Even.
- Если введённый символ является символом новой строки (0Dh), то выполняется вывод суммы нечётных чисел (в сегменте данных по адресу [MsgOdd]) и количества четных чисел (в сегменте данных по адресу [MsgEven]) в регистре DX. Значения в регистрах BL и BH загружаются в регистр DX с предварительным добавлением символов «00» для корректного отображения результатов в 16-ричном формате.
- Если введённый символ является нечётным числом, то происходит переход на метку @@Odd. В противном случае (если введённый символ является чётным числом) — на метку @@Even.
- В конце программы выполняется вывод в регистре DX сообщения об успешном выполнении программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д