Обменять первый четный с последним нечетным элементом в массиве - 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

Объяснение кода листинга программы

Вот что получилось:

  1. Код написан на ассемблере.
  2. Обменивает местами первый чётный и последний нечётный элемент в массиве.
  3. Предполагается, что входной массив A отсортирован по возрастанию.
  4. Если в массиве есть только чётные или только нечётные числа, выводится соответствующее сообщение об ошибке.
  5. Используется стек для временного хранения чисел при переводе в символьный формат и при обмене местами.
  6. Выводом на экран чисел занимается функция Show_AX.
  7. Выводом на экран строк занимается функция int 21h.
  8. При обмене местами используется техника xchg ax, [si], xchg ax, [di] для обмена регистра AX с элементами массива.
  9. Код не проверяет, достаточно ли в массиве места для обмена.
  10. Код не обрабатывает ситуацию, когда в массиве отсутствуют и чётные, и нечётные числа.

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы