Первый четный элемент одномерного массива переставить в конец массива - Assembler
Формулировка задачи:
Вот к примеру задание: Первый четный элемент одномерного массива нужно переставить в конец массива. Тест: 1 2 6 7 3 Результат: 1 6 7 3 2 Я не знаю как делаются сдвиги. Буду очень рад, если поможете разобраться. Заранее Благодарю.
Решение задачи: «Первый четный элемент одномерного массива переставить в конец массива»
textual
Листинг программы
lea esi,[ach];знаешь mov ecx,[qach];тоже знаешь mFindEven: test [esi],1;проверка младшего бита [esi] на 1 jz mEx;переход на метку если младший бит [esi] есть 0 inc esi;знаешь loop mFindEven;наверное знаешь, раз ничего про это не написал mEx: mov al,[esi];знаешь mov edi,esi;знаешь inc esi;знаешь dec ecx;знаешь cld;сброс флага направления в 0 чтобы цепочечная команда производила инкремент esi и edi rep movsb;копируем из [esi] в [edi] mov [edi],al;знаешь
Объяснение кода листинга программы
Предположительно, код выполняет следующие действия:
- Задаются значения двух регистров: ESI и ECX.
- ESI указывает на первый элемент массива, а ECX указывает на количество элементов в массиве.
- Происходит проверка младшего бита элемента в ESI. Если он равен 1, то происходит переход к метке mEx.
- Если младший бит равен 0, то происходит инкремент ESI и повторная проверка.
- Если младший бит равен 1, то происходит копирование элемента из ESI в EDI и инкремент обоих регистров.
- Затем происходит уменьшение значения ECX на единицу и повторная проверка условия.
- Процесс повторяется до тех пор, пока ECX не станет равным нулю.
- Копирование происходит с помощью команды rep movsb, которая копирует символ из памяти в память до тех пор, пока флаг направления не станет равным 1.
- После копирования происходит сохранение первого байта в EDI в [EDI]. Список действий:
- Задаются значения ESI и ECX.
- Происходит проверка младшего бита элемента в ESI.
- Инкремент ESI и повторная проверка.
- Копирование элемента из ESI в EDI и инкремент обоих регистров.
- Уменьшение значения ECX на единицу и повторная проверка.
- Процесс повторяется до тех пор, пока ECX не станет равным нулю.
- Копирование происходит с помощью команды rep movsb.
- После копирования происходит сохранение первого байта в EDI в [EDI].