; 32 bit ; Вариант 5 2 2 ; 5. Отрицательные элементы массива записываются в начале, положительные -- в ; конце ; 2. Конечный массив состоит из элементов исходного, которые больше среднего ; арифметического наибольшего и последнего элементов ; 2. Для обработки исходного массива должна использоваться индексная адресация, ; для формированя конечного -- базовая. ; Сегмент стека. Область памяти, используемая для хранения промежуточных ; значений в вычислениях. ; Сегмент данных. Область памяти, в которой содержатся два массива: исходный ; и конечный. .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data ARR1 DW 3,-5,7,21,-3,9,0,11,-14,2 ; Исходные значения ARR2 DW 10 DUP(0) ; Место для конечного массива ; Сегмент кода. Исполняемая часть содержимого оперативной памяти. .code START: PUSH ARR1[2*10-2] ; Сохраняем последний элемент ; Перестановка элементов исходного массива. XOR ESI, ESI ; Очистка указателя на текущее число XOR EDI, EDI MOV CX, 10 ; Инициализация счётчика MOV DI, CX ; Инициализация указателя на группу DEC DI ; неотрицательных элементов SHL DI, 1 ; (DI = 2*(число элементов - 1)) TRANSFOR: ; Начало цикла обхода MOV AX, ARR1[SI] ; Считывание текущего элемента CMP AX, 0 ; Сравнение его с 0 JGE SWAP ; Если он меньше, то NOSWAP: ; массив оставляем без изменений, ADD SI, 2 ; переходим к следующему элементу DEC CX ; и уменьшаем счётчик JMP LOOP1_END ; и к следующей итерации SWAP: ; Если больше, то MOV BX, ARR1[DI] ; меняем элемент перед положительными MOV ARR1[DI], AX ; с текущим элементом, используя MOV ARR1[SI], BX ; дополнительно регистр BX, SUB DI, 2 ; после чего сдвигаем границу группы LOOP1_END: ; Конец итерации LOOP TRANSFOR ; и переход к следующей или из цикла ; Поиск наибольшего элемента исходного массива. MOV DX, ARR1[0] ; Максимальным считаем первое число MOV SI, 2 ; Очистка указателя на текущее число MOV CX, 9 ; Инициализация счётчика FIND: ; Начало цикла поиска MOV AX, ARR1[SI] ; Считывание текущего элемента CMP AX, DX ; Сравнение с найденным максимальным JLE LOOP2_END ; элементом, и если больше, NEWMAX: ; то записываем на место найденного MOV DX, AX ; новый наибольший. LOOP2_END: ; Выходим из тела цикла, ADD SI, 2 ; выбирая следующий элемент LOOP FIND ; и переходя к следующей итерации ; Поиск среднего арифметического последнего и наибольшего элементов ; исходного массива. POP AX ; Берём из стека последний элемент ADD DX, AX ; Складываем с максимальным SAR DX, 1 ; и делим результат пополам ; Формируем конечный массив. ; LEA DS, ARR1 ; Определяем адрес исходного массива LEA EBX, ARR2 ; и адрес конечного массива XOR ESI, ESI ; Обнуляем указатели на их элементы XOR EDI, EDI ; для смещения в индексной записи MOV CX, 10 ; Инициализируем счётчик COPY_LOOP: ; Начало цикла копирования MOV AX, ARR1[SI] ; Считываем текущий элемент CMP AX, DX ; Сравниваем с контрольным значением JLE LOOP4_END ; Если текущий элемент больше, COPY: ; то копируем его в конечный массив MOV [EBX+EDI], AX ; по заданному индексу ADD DI, 2 ; и увеличиваем смещение LOOP4_END: ; Затем, скопировали или нет, ADD SI, 2 ; приращиваем смещение для исходного LOOP COPY_LOOP ; и начинаем следующую итерацию invoke ExitProcess, NULL END START