.model tiny .code .386 org 100h start: movzx ecx,len ;для цикла заносим длину массива shr ecx,1 ;так как длина в словах делим на 2 dec cl ;сравниваем со следующим, значит на 1 меньше xor esi,esi ;начальное значение индекса 0 lea ebx,massiv ;заносим адрес массива l1: mov ax,[ebx+esi*2] ;считываем первый элемент and ax,1000000000000000b ;проверяем старший бит - знак mov sign,ax ;сохраняем его mov dx,[ebx+esi*2+2] ;считываем второй элемент and dx,1000000000000000b cmp dx,sign ;сравниваем знаки je l2 ;если равны идем дальше mov ax,[ebx+esi*2] ;если нет берем предыдущий элемент xchg [ebx+esi*2+2],ax ;в меняет со следующим mov [ebx+esi*2],ax ;заносим в предыдущий jmp l2 l2: inc esi ;увеличиваем индекс loop l1 ;------------------------ ;блок вывода исходного массива после обработки ;------------------------ movzx ecx,len ;для вывода нужны все элементы shr ecx,1 xor esi,esi l3: mov ax,[ebx+esi*2] ;считываем элемент push ax xchg ah,al call print_all ;вывод старшей цифры pop ax call print_all ;вывод младшей цифры inc esi ;увеличиваем индекс loop l3 mov dx,offset ctrl ;адрес строки перевода mov ah,09h ;перевести строку int 21h ;------------------------ ;Блок вычисления максимального и среднего арифметического ;максимального и последнего элемента ;------------------------ movzx ecx,len shr ecx,1 dec cl push ebx ;адрес массива еще понадобится push ebx mov ax,[ebx] ;считываем первый элемент add ebx,2 ;переходим к следующему l6: cmp ax,[ebx] ;сравниваем со следующим jg l5 ;больше? mov ax,[ebx] ;нет - заносим в регистр l5: add ebx,2 ;да - переходим к следующему loop l6 pop ebx push eax ;это наибольший элемент movzx eax,len sub eax,2 add ebx,eax ;перемещаемся на последний элемент pop eax add ax,[ebx] ;добавляем к наибольшему push ax and ax,1000000000000000b ;определяем знак mov sign,ax pop ax shr ax,1 ;делим на 2 - среднее арифметическое двух чисел or ax,sign ;устанавливаем знак cmp sign,1000000000000000b ;знак минус? jne l4 ;нет - идем дальше dec ax ;да - увеличиваем среднее l4: pop ebx lea ebp,massiv1 ;заносим адрес нового массива push ebp movzx ecx,len ;заносим длину исходного массива shr ecx,1 l8: mov dx,[ebx] ;считываем элемент исходного массива cmp dx,ax ;он больше среднего арифметического? jle l7 ;нет - идем дальше mov [ebp],dx ;да - заносим его в новый массив add ebp,2 ;переводим указатель на следующий элемент нового массива inc len1 ;изменяем длину нового массива l7: add ebx,2 ;переходим к следующему элементу исходного массива loop l8 pop ebp movzx ecx,len1 ;длина нового массива test ecx,ecx ;она равна нулю? jz l10 ;да - выход l9: mov ax,[ebp] ;нет - считываем push ax ;и выводим xchg ah,al ;этот уже проходили call print_all pop ax call print_all add ebp,2 loop l9 l10: ret ;------------------------ ;Блок вывода цифр. Выводит в 16-ричной системе. ;Отрицательные выводит согласно 16-ричной системы. ;------------------------ print_all: mov dh,al ;сохраняем and dh,0Fh ;младшую цифру shr al,4 call print_n ;вывод старшей цифры mov al,dh ;восстанавливаем младшую и вывод print_n: cmp al,10 sbb al,69h das mov dl,al mov ah,2 int 21h ret massiv dw 1,-2,3,4,5,6,7,11,9,10 ;задан произвольно с произвольным количеством len db $-massiv sign dw ? max dw ? ctrl db 0Dh,0Ah,'$' len1 db 0 massiv1: end start