Обменять первый четный с последним нечетным элементом в массиве - 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 с элементами массива.
- Код не проверяет, достаточно ли в массиве места для обмена.
- Код не обрабатывает ситуацию, когда в массиве отсутствуют и чётные, и нечётные числа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д