Распределить элементы исходного массива по критерию

оздать программу для сортировки массива чисел с заданной условием согласно варианту N (табл. 2). Порядок размещения массивов в сегменте данных:

  1. Начальный массив.
  2. отсортированный массив № 1 (его элементы не упорядочены).
  3. отсортированный массив № 2 (если есть согласно варианту). Условие: 1-й массив - Xi имеют парное количество единиц в двоичном коде и xi>1; 2-й массив - все остальные.

Есть пример программы, только с таким условием: 1-й массив - Xi имеют "1" в 7-ом разряде; 2-й массив - Xi имеют "0" в 5-ом разряде. Пример кода к этому условию:

format PE64 console
entry main
 
include 'win64ax.inc'
 
section '.data' data readable writable
A dq 100,200,300,400,500,600,700,800,900,1000   ; Исходный массив
Size=($-A)/8                  ; Размер массива
B dq Size dup ?               ; Резервирование памяти под массивы B и C
C dq Size dup ?
SizeB dq 0                    ; Размеры массивов B и C
SizeC dq 0
fmt_out   db '%llu ',0        ; Формат вывода - беззнаковый
msg_B     db 'Array 1: ',0
msg_C     db 'Array 2: ',0
msg_empty db 'empty!',0       ; Сообщение опустом массиве
newline   db 13,10,0          ; Перевод строки
cmd_pause db 'pause',0        ; Команда паузы
 
section '.text' code executable
proc main
mov r8,B             ; Указатели на массивы B и C
mov r9,C
mov rcx,Size         ; Размер входного массива
cld                  ; Направление сканирования - вперёд
mov rsi,A            ; Указатель на входной массив
; Обработка входного массива
@@:lodsq             ; Загрузка элемента
   test rax,0x80     ; Проверка бита 7
   jz ToC            ; 0 - перейти к проверке бита 5
   mov [r8],rax      ; 1 - записать элемент в массив B
   add r8,8          ; сдвинуть указатель массива B
   inc [SizeB]       ; и инкрементировать его размер
   ToC:
   test rax,0x20     ; Проверка бита 5
   jnz Next          ; 1 - перейти к следующему элементу
   mov [r9],rax      ; 0 - записать элемент в массив C
   add r9,8          ; сдвинуть указатель массива C
   inc [SizeC]       ; и инкрементировать его размер
   Next:loop @b      ; Переход к следующему элементу
 
; Вывод массива B
invoke printf_s,msg_B
cmp [SizeB],0        ; Массив пуст - вывести сообщение
jne OutB
invoke printf_s,msg_empty
jmp OutC1
OutB:
cld              ; Направление - вперёд
mov rcx,[SizeB]  ; Размер массива B
mov rsi,B        ; Указатель на начало массива B
@@:lodsq         ; Цикл поэлементного вывода
   push rcx
   invoke printf_s,fmt_out,rax  ; Вывод результата
   pop rcx
   loop @b
invoke printf_s,newline
; Вывод массива C полностью аналогично
OutC1:
invoke printf_s,msg_C
cmp [SizeC],0
jne OutC
invoke printf_s,msg_empty
jmp Fin
OutC:
mov rcx,[SizeC]
mov rsi,C
@@:lodsq
   push rcx
   invoke printf_s,fmt_out,rax
   pop rcx
   loop @b
 
Fin:
invoke printf_s,newline      ; Перевод строки
invoke system,cmd_pause      ; Ожидание нажатия клавиши
xor rax,rax
ret
endp
 
section '.idata' import data readable writeable
library msvcrt,'msvcrt.dll'
import  msvcrt,\
        system,'system',\
        scanf_s,'scanf_s',\
        printf_s,'printf_s'

Ответы (0 шт):