Инвертировать порядок элементов в массиве - Assembler

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

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

Доброго времени суток, есть задание где нужно инвертировать порядок элементов в массиве, вот в чем вопрос, нужно создавать второй массив и записывать сначала в него инвертированный порядок, а потом записывать в исходный? Или же можно сделать все в одном массиве? Если да, то как? а если же верно решение с двумя массивами, то второй нужно создавать динамически? Если да, то как?

Решение задачи: «Инвертировать порядок элементов в массиве»

textual
Листинг программы
  1.     .model flat
  2.     .data
  3. x   db 0,1,2,3,4,5,6,7,8,9
  4. n   equ $-x
  5.     .code
  6. public main
  7.  
  8. revers proto C :dword, :dword
  9.  
  10. main proc
  11.     invoke revers, addr x, addr x[n-1]
  12.  
  13.     xor ax, ax
  14.     ret
  15. main endp
  16.  
  17. revers proc C first:dword, last:dword
  18.     mov ebx, first
  19.     mov esi, last
  20.  
  21. l:  cmp ebx, esi
  22.     jae stop
  23.     mov al, [ebx]
  24.     xchg al, [esi]
  25.     xchg [ebx], al
  26.  
  27.     inc ebx
  28.     dec esi
  29.     jb l
  30.  
  31. stop:  
  32.     ret
  33. revers endp
  34.  
  35. end

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

Код представлен на языке Assembler и выполняет следующие действия:

  1. .model flat — устанавливает модель памяти, указывая, что переменные будут размещены в плоской памяти.
  2. .data — секция данных, где размещается массив x.
  3. x db 0,1,2,3,4,5,6,7,8,9 - определение массива x, содержащего 10 целых чисел.
  4. n equ $-x — переменная n содержит длину массива x в байтах (используется знаковое поле).
  5. .code — секция кода, где размещаются процедуры и функции.
  6. public main — объявление точки входа в программу.
  7. main proc — определение процедуры main.
  8. invoke revers, addr x, addr x[n-1] — вызов функции revers для инвертирования порядка элементов в массиве x.
  9. xor ax, ax — очистка регистра AX перед возвратом в точку вызова.
  10. ret — возврат в точку вызова.
  11. revers proc C first:dword, last:dword — определение процедуры revers, принимающей два параметра: первый указывает на начало массива, а второй — на его конец.
  12. mov ebx, first — перемещение адреса начала массива в регистр EBX.
  13. mov esi, last — перемещение адреса конца массива в регистр ESI.
  14. l: cmp ebx, esi — сравнение содержимого регистров EBX и ESI.
  15. jae stop — если EBX больше или равно ESI, то переход к метке stop.
  16. mov al, [ebx] — перемещение значения байта из массива в регистр AL.
  17. xchg al, [esi] — обмен значениями регистров AL и ESI.
  18. xchg [ebx], al — обмен значениями регистров AL и EBX.
  19. inc ebx — увеличение адреса в EBX на 1.
  20. dec esi — уменьшение адреса в ESI на 1.
  21. jb l — повторение цикла до тех пор, пока EBX больше ESI.
  22. stop: ret — завершение рекурсивного вызова функции revers.
  23. end — конец программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

15   голосов , оценка 3.8 из 5

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

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

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