Обменять первый четный с последним нечетным элементом в массиве - Assembler
Формулировка задачи:
Необходимо обменять местами первый четный и последний нечетный элемент массива. Как это сделать . С первым четным элементом не могу разобраться )) Благодарю за помощь)
Решение задачи: «Обменять первый четный с последним нечетным элементом в массиве»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- A dw 17, 10, 22, 11, 45, 66, 88, 99, 78
- Len dw ($-A) / 2
- MsgNoEven db 'No even', '$'
- MsgNoOdd db 'No odd', '$'
- CrLf db 0Dh, 0Ah, '$'
- .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
- ShowArray proc
- push ax
- push cx
- push dx
- push si
- mov cx, Len
- lea si, A
- @@For:
- mov ax, [si]
- call Show_AX
- mov ah, 2
- mov dl, ' '
- int 21h
- add si, 2
- loop @@For
- mov ah, 09h
- lea dx, CrLf
- int 21h
- pop si
- pop dx
- pop cx
- pop ax
- ret
- ShowArray endp
- main proc
- mov ax, @data
- mov ds, ax
- call ShowArray
- ;first even
- @@SearchEven:
- mov cx, Len
- lea si, A
- @@FirstEven:
- test word ptr [si], 1
- jz @@SearchOdd
- add si, 2
- loop @@FirstEven
- ;если перебрали все элементы и не нашли чётных,
- ;то оказались здесь.
- ;вывод сообщения об ошибке и завершение программы
- mov ah, 09h
- lea dx, MsgNoEven
- int 21h
- jmp @@Exit
- @@SearchOdd:
- mov di, si ;di - адрес первого чётного элемента
- mov cx, Len
- lea si, A ;si - адрес последнего элемента массива
- add si, cx
- add si, cx
- sub si, 2
- @@LastOdd:
- test word ptr [si], 1
- jnz @@Exchange
- sub si, 2
- loop @@LastOdd
- ;если перебрали все элементы и не нашли нечётных,
- ;то оказались здесь.
- ;вывод сообщения об ошибке и завершение программы
- mov ah, 09h
- lea dx, MsgNoOdd
- int 21h
- jmp @@Exit
- @@Exchange:
- xchg ax, [si]
- xchg ax, [di]
- xchg ax, [si]
- call ShowArray
- @@Exit:
- mov ax, 4C00h
- int 21h
- main endp
- end main
Объяснение кода листинга программы
Вот что получилось:
- Код написан на ассемблере.
- Обменивает местами первый чётный и последний нечётный элемент в массиве.
- Предполагается, что входной массив A отсортирован по возрастанию.
- Если в массиве есть только чётные или только нечётные числа, выводится соответствующее сообщение об ошибке.
- Используется стек для временного хранения чисел при переводе в символьный формат и при обмене местами.
- Выводом на экран чисел занимается функция Show_AX.
- Выводом на экран строк занимается функция int 21h.
- При обмене местами используется техника xchg ax, [si], xchg ax, [di] для обмена регистра AX с элементами массива.
- Код не проверяет, достаточно ли в массиве места для обмена.
- Код не обрабатывает ситуацию, когда в массиве отсутствуют и чётные, и нечётные числа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д