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

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

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

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

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

textual
Листинг программы
    .model flat
    .data
x   db 0,1,2,3,4,5,6,7,8,9
n   equ $-x
    .code
public main
 
revers proto C :dword, :dword
 
main proc
    invoke revers, addr x, addr x[n-1]
 
    xor ax, ax
    ret
main endp
 
revers proc C first:dword, last:dword
    mov ebx, first
    mov esi, last
 
l:  cmp ebx, esi
    jae stop
    mov al, [ebx]
    xchg al, [esi]
    xchg [ebx], al
 
    inc ebx
    dec esi 
    jb l
 
stop:   
    ret
revers endp
 
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
Похожие ответы