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

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

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

Необходимо: Первый отрицательный обменять местами с последним четным элементом массива. (Примеры прикреплены)

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

textual
Листинг программы 1
    .model flat
    .data
x   dd 1,2,3,45,7,-7,5,9,7,1,11
n   equ $-x
    .code
public main
 
main proc 
    call ff
    xor ax, ax
    ret
main endp
 
ff proc 
    mov ebx, - type x
f1: add ebx, type x
    cmp ebx, n
    jae quit           ; не нашли отрицательного элемента
 
    cmp x[ebx], 0
    jl next            ; нашли первый отрицательный
    jmp f1
 
next:
    mov esi, n
f2: sub esi, type x
    cmp esi, 0
    jl  quit           ; не нашли четного
    
    mov eax, x[esi]
    shr eax, 1
    jnc final          ; нашли четный
    jmp f2
 
final:
    rcl  eax, 1
    xchg eax, x[ebx]
    mov  x[esi], eax
quit:
    ret
ff endp
end

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

В коде представлен алгоритм, который выполняет следующие действия:

  1. Организация процедур: Первый отрицательный обменять местами с последним четным элементом массива.
  2. .model flat: Указывает компилятору, что следует использовать плоский модель памяти.
  3. .data: Описывает данные, которые будут использоваться в программе. В данном случае это переменная x, которая содержит список чисел.
  4. x dd 1,2,3,45,7,-7,5,9,7,1,11: Определяет переменную x как двойной слова (dd), содержащие указанные числа.
  5. n equ $-x: Определяет переменную n как смещение от начала массива x до его последнего элемента.
  6. .code: Описывает кодовые сегменты, которые будут использоваться в программе.
  7. public main: Делает процедуру main доступной из других сегментов.
  8. main proc: Определяет сегмент кода для процедуры main.
  9. call ff: Вызывает процедуру ff из сегмента кода main.
  10. xor ax, ax: Очищает регистр ax.
  11. ret: Завершает выполнение процедуры main.
  12. ff proc: Определяет сегмент кода для процедуры ff.
  13. mov ebx, - type x: Перемещает в регистр ebx смещение до первого отрицательного элемента в массиве x.
  14. f1: add ebx, type x: Увеличивает смещение в регистре ebx на размер типа x.
  15. cmp ebx, n: Сравнивает смещение в регистре ebx с размером массива x. Если меньше, то продолжается поиск отрицательного элемента.
  16. cmp x[ebx], 0: Сравнивает значение элемента массива x с нулем. Если меньше, то найден первый отрицательный элемент.
  17. jl next: Если текущий элемент массива меньше нуля, то переходим к поиску следующего отрицательного элемента.
  18. mov esi, n: Перемещает в регистр esi смещение до последнего четного элемента в массиве x.
  19. f2: sub esi, type x: Уменьшает смещение в регистре esi на размер типа x.
  20. cmp esi, 0: Сравнивает смещение в регистре esi с нулем. Если меньше, то не найден четный элемент.
  21. mov eax, x[esi]: Перемещает в регистр eax значение элемента массива x, смещение которого в регистре esi.
  22. shr eax, 1: Сдвигает значение в регистре eax вправо на один бит. Если результат отрицательный, то элемент четный.
  23. jnc final: Если значение в регистре eax не изменилось при сдвиге вправо, то найден четный элемент.
  24. jmp f2: Переходит к началу цикла поиска четного элемента.
  25. final:: Если найден четный элемент, то выполняется обмен с первым отрицательным элементом.
  26. rcl eax, 1: Сдвигает значение в регистре eax влево на один бит.
  27. xchg eax, x[ebx]: Обменивает значение в регистре eax с элементом массива x, смещение которого в регистре ebx.
  28. mov x[esi], eax: Записывает обмененное значение в элемент массива x, смещение которого в регистре esi.
  29. quit:: Код, который будет выполнен при завершении работы программы.
  30. ret: Завершает выполнение процедуры ff.
  31. end: Конец описания сегмента кода для процедуры ff.
  32. end: Конец программы.
textual
Листинг программы 2
    cmp x[ebx], 0
    jl next            ; нашли первый отрицательный
    jmp f1
 
next:

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

  1. x - это массив, в котором происходит обмен элементов
  2. ebx - это регистр, который используется как индекс для обращения к элементам массива
  3. 0 - это значение, с которым сравнивается каждый элемент массива
  4. Если элемент массива меньше нуля (отрицательный), то переходим к процедуре обмена
  5. Если элемент массива больше или равен нулю (не отрицательный), то переходим к следующему элементу без обмена
  6. f1 - это метка, на которую происходит переход в случае нахождения первого отрицательного элемента

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

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