Пояснить несколько строк в сортировке - Assembler
Формулировка задачи:
Добрый день, можете объяснить несколько строк в сортировке пузырьком
Интересует этот код:
Я понимаю, что тут мы меняем эл-ты местами, и идем с конца массива, не могу понять смысл команды setna bl
sort proc Arr:DWORD, Lngth:DWORD mov esi, Arr ;позиционируемся на массив a2: mov eax, [Lngth] mov ecx,[eax] xor ebx,ebx a3: mov eax,[esi+ecx*4-4] ;получаем значение очередного элемента cmp [esi+ecx*4],eax ;сравниваем со значением соседнего элемента jnb a1 ;если больше или равен - идем к следующему элементу setna bl xchg eax,[esi+ecx*4] ;меняем значение элементов местами mov [esi+ecx*4-4],eax a1: loop a3 ;двигаемся вверх до границы массива add esi,4 ;сдвигаем границу отсортированного массива dec ebx ;проверяем были ли перестановки jnz exit ;если перестановок не было - заканчиваем сортировку dec Lngth ;уменьшаем количество неотсортированных элементов jnz a2;если есть еще неотсортированные элементы - начинаем новый проход exit: ret sort endp end
a3: mov eax,[esi+ecx*4-4] ;получаем значение очередного элемента cmp [esi+ecx*4],eax ;сравниваем со значением соседнего элемента jnb a1 ;если больше или равен - идем к следующему элементу setna bl xchg eax,[esi+ecx*4] ;меняем значение элементов местами mov [esi+ecx*4-4],eax
Команды, обозначаемые (в книгах, не в программах!) SETcc, осуществляют запись в указанный байтовый операнд 1 или 0 в зависимости от одного из 16 условий, определяемых флагами состояния. Если условие ее выполняется, команда записывает в операнд 1; если условие не выполняется - 0.В качестве операнда можно использовать байтовый регистр или 8-битовую ячейку памяти.
В составе команд процессора предусмотрены следующие команды условной установки байта:
SETNA r/m8
Установить байт, если не выше (CF=1 или ZF=1)
Можете пояснить что именно в этой функции setna делает?
Решение задачи: «Пояснить несколько строк в сортировке»
textual
Листинг программы
mov edx,[esi+ecx*4] mov [esi+ecx*4],eax mov eax,edx
Объяснение кода листинга программы
mov edx,[esi+ecx*4]
- из памяти по адресу, который содержит значение смещения от элемента в массиве (esi) и индекс элемента в массиве (ecx), берется значение (edx).mov [esi+ecx*4],eax
- значение (eax), которое было получено из предыдущей операции, записывается в память по адресу, который содержит значение смещения от элемента в массиве (esi) и индекс элемента в массиве (ecx).mov eax,edx
- значение (edx), которое было получено из первой операции, записывается в регистр (eax), который в дальнейшем будет использоваться в арифметических операциях.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д