Распределить элементы исходного массива по критерию
оздать программу для сортировки массива чисел с заданной условием согласно варианту N (табл. 2). Порядок размещения массивов в сегменте данных:
- Начальный массив.
- отсортированный массив № 1 (его элементы не упорядочены).
- отсортированный массив № 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'