Ввод массива и вывод из него на экран сначала чётных, а потом нечётных символов - Assembler
Формулировка задачи:
Нужно ввести массив и вывести из него на экран сначала чётные символы,а потом нечётные заранее спасибо
Решение задачи: «Ввод массива и вывод из него на экран сначала чётных, а потом нечётных символов»
textual
Листинг программы
LOCALS .model small .stack 100h .data PromptN db 'N=', '$' PromptA1 db 'A[', '$' PromptA2 db ']=', '$' CrLf db 0Dh, 0Ah, '$' msgEven db 'Even elements', 0Dh, 0Ah, '$' msgOdd db 'Odd elements', 0Dh, 0Ah, '$' N dw ? ;размер массива A dw 10 dup (0) kbdBuffer db 6, 0, 6 dup(0) .code ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 ; cx - основание системы счисления xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp ; преобразования строки в беззнаковое число ; на входе: ; ds:[si] - строка с числом ; ds:[di] - адрес числа ; на выходе ; ds:[di] - число ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен) Str2Num proc push ax push bx push cx push dx push ds push es push si push ds pop es mov cl, ds:[si] xor ch, ch inc si cmp [si], byte ptr '-' jne @@IsPositive inc si dec cx @@IsPositive: jcxz @@Error 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 pop si push si or ax, ax js @@Error cmp [si+1], byte ptr '-' jne @@Positive neg ax or ax, ax jns @@Error @@Positive: mov [di], ax clc pop si pop es pop ds pop dx pop cx pop bx pop ax ret @@Error: xor ax, ax mov [di], ax stc pop si pop es pop ds pop dx pop cx pop bx pop ax ret Str2Num endp ;Ввод массива ;cx - количество вводимых элементов ;ds:dx - адрес массива InputArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: ;вывод приглашения ввода элемента mov ah, 09h lea dx, PromptA1 int 21h mov ax, si call Show_AX mov ah, 09h lea dx, PromptA2 int 21h ;ввод числа mov ah, 0Ah ;ввод строки mov dx, offset kbdBuffer int 21h mov ah,09h ;перевод строки (на новую строку) lea dx, CrLf int 21h push si lea si, kbdBuffer+1 ; преобразование строки в число call Str2Num pop si ; проверка на ошибку jnc @@NoError ; если есть ошибка ввода - повторить ввод jmp @@ForI ; если нет ошибки ввода - сохранить число @@NoError: ;сохранение введённого числоа в массиве ;mov [di], ax ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret InputArray endp main proc mov ax, @data mov ds, ax ;ввод N @@InputN: mov ah, 09h lea dx, PromptN int 21h mov ah, 0Ah ;ввод строки mov dx, offset kbdBuffer int 21h mov ah, 09h ;перевод строки (на новую строку) lea dx, CrLf int 21h lea si, kbdBuffer+1 ; преобразование строки в число lea di, N call Str2Num ; проверка на ошибку jnc @@NoError mov ax, N or ax, ax jns @@InputN ; если есть ошибка ввода - повторить ввод jmp @@NoError ; если нет ошибки ввода - сохранить число @@NoError: ;ввод массива mov cx, N lea dx, A call InputArray ;вывод чётных элементов массива mov ah, 09h lea dx, msgEven int 21h lea si, A mov cx, N @@Even: mov ax, [si] add si, 2 test ax, 1 jnz @@NoEven call Show_AX mov ah, 02h mov dl, ' ' int 21h @@NoEven: loop @@Even mov ah, 09h lea dx, CrLf int 21h ;вывод нечётных элементов массива mov ah, 09h lea dx, msgOdd int 21h lea si, A mov cx, N @@Odd: mov ax, [si] add si, 2 test ax, 1 jz @@NoOdd call Show_AX mov ah, 02h mov dl, ' ' int 21h @@NoOdd: loop @@Odd mov ah, 09h lea dx, CrLf int 21h mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
- В блоке
.data
определяются переменные:PromptN
- строка для приглашения ввода числаN
PromptA1
- строка для приглашения ввода элемента массиваPromptA2
- строка для вывода символа ']'CrLf
- строка для перевода на новую строкуmsgEven
- строка для вывода чётных элементовmsgOdd
- строка для вывода нечётных элементовN
- переменная для хранения размера массиваA
- массив для хранения элементовkbdBuffer
- массив для буфера клавиатуры
- В блоке
.code
определяются процедуры:Show_AX
- процедура для вывода числа из регистра AX на экранStr2Num
- процедура для преобразования строки в беззнаковое числоInputArray
- процедура для ввода массива
- В процедуре
main
:@@InputN
- происходит ввод числаN
и его преобразование в беззнаковое числоcall InputArray
- вызов процедуры для ввода массива- Далее выполняется вывод на экран чётных и нечётных элементов массива. Таким образом, данный код описывает работу с массивом: ввод числа N, ввод массива и вывод чётных и нечётных элементов массива на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д