Обменять первый четный с последним нечетным элементом в массиве - Assembler

Узнай цену своей работы

Формулировка задачи:

Необходимо обменять местами первый четный и последний нечетный элемент массива. Как это сделать . С первым четным элементом не могу разобраться )) Благодарю за помощь)

Решение задачи: «Обменять первый четный с последним нечетным элементом в массиве»

textual
Листинг программы
  1. .model small
  2.  
  3. .stack 100h
  4.  
  5. .data
  6.         A               dw      17, 10, 22, 11, 45, 66, 88, 99, 78
  7.         Len             dw      ($-A) / 2
  8.         MsgNoEven       db      'No even', '$'
  9.         MsgNoOdd        db      'No odd', '$'
  10.         CrLf            db      0Dh, 0Ah, '$'
  11. .code
  12.  
  13. ; выводит число из регистра AX на экран
  14. ; входные данные:
  15. ; ax - число для отображения
  16. Show_AX proc
  17.         push    ax
  18.         push    bx
  19.         push    cx
  20.         push    dx
  21.         push    di
  22.  
  23.         mov     cx, 10          ; cx - основание системы счисления
  24.         xor     di, di          ; di - кол. цифр в числе
  25.  
  26.         ; если число в ax отрицательное, то
  27.         ;1) напечатать '-'
  28.         ;2) сделать ax положительным
  29.         or      ax, ax
  30.         jns     @@Conv
  31.         push    ax
  32.         mov     dx, '-'
  33.         mov     ah, 2           ; ah - функция вывода символа на экран
  34.         int     21h
  35.         pop     ax
  36.  
  37.         neg     ax
  38.  
  39. @@Conv:
  40.         xor     dx, dx
  41.         div     cx              ; dl = num mod 10
  42.         add     dl, '0'         ; перевод в символьный формат
  43.         inc     di
  44.         push    dx              ; складываем в стэк
  45.         or      ax, ax
  46.         jnz     @@Conv
  47.         ; выводим из стэка на экран
  48. @@Show:
  49.         pop     dx              ; dl = очередной символ
  50.         mov     ah, 2           ; ah - функция вывода символа на экран
  51.         int     21h
  52.         dec     di              ; повторяем пока di<>0
  53.         jnz     @@Show
  54.  
  55.         pop     di
  56.         pop     dx
  57.         pop     cx
  58.         pop     bx
  59.         pop     ax
  60.         ret
  61. Show_AX endp
  62.  
  63. ShowArray       proc
  64.         push    ax
  65.         push    cx
  66.         push    dx
  67.         push    si
  68.  
  69.         mov     cx,     Len
  70.         lea     si,     A
  71. @@For:
  72.         mov     ax,     [si]
  73.         call    Show_AX
  74.         mov     ah,     2
  75.         mov     dl,     ' '
  76.         int     21h
  77.         add     si,     2
  78.         loop    @@For
  79.  
  80.         mov     ah,     09h
  81.         lea     dx,     CrLf
  82.         int     21h
  83.  
  84.         pop     si
  85.         pop     dx
  86.         pop     cx
  87.         pop     ax
  88.         ret
  89. ShowArray       endp
  90.  
  91. main    proc
  92.         mov     ax,     @data
  93.         mov     ds,     ax
  94.  
  95.         call    ShowArray
  96.  
  97.         ;first even
  98. @@SearchEven:
  99.         mov     cx,     Len
  100.         lea     si,     A
  101. @@FirstEven:
  102.         test    word ptr [si], 1
  103.         jz      @@SearchOdd
  104.         add     si,     2
  105.         loop    @@FirstEven
  106.         ;если перебрали все элементы и не нашли чётных,
  107.         ;то оказались здесь.
  108.         ;вывод сообщения об ошибке и завершение программы
  109.         mov     ah,     09h
  110.         lea     dx,     MsgNoEven
  111.         int     21h
  112.         jmp     @@Exit
  113.  
  114. @@SearchOdd:
  115.         mov     di,     si      ;di - адрес первого чётного элемента
  116.  
  117.         mov     cx,     Len
  118.         lea     si,     A       ;si - адрес последнего элемента массива
  119.         add     si,     cx
  120.         add     si,     cx
  121.         sub     si,     2
  122. @@LastOdd:
  123.         test    word ptr [si], 1
  124.         jnz     @@Exchange
  125.         sub     si,     2
  126.         loop    @@LastOdd
  127.         ;если перебрали все элементы и не нашли нечётных,
  128.         ;то оказались здесь.
  129.         ;вывод сообщения об ошибке и завершение программы
  130.         mov     ah,     09h
  131.         lea     dx,     MsgNoOdd
  132.         int     21h
  133.         jmp     @@Exit
  134.  
  135. @@Exchange:
  136.         xchg    ax,     [si]
  137.         xchg    ax,     [di]
  138.         xchg    ax,     [si]
  139.  
  140.         call    ShowArray
  141.  
  142. @@Exit:
  143.  
  144.         mov     ax,     4C00h
  145.         int     21h
  146. main    endp
  147.  
  148. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы