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