Переставить положительные элементы в обратном порядке, не меняя положения остальных элементов массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Условие задачи: Переставить положительные элементы в обратном порядке, не меняя положения остальных элементов массива; Незнаю в чем ошибка. Посоветуйте что-нибудь пожалуйста.
; multi-segment executable file template.
        include 'emu8086.inc'
data segment
    ; add your data here! 
   
    mas dw 1,0,4,30,-2,-1,5,7,-28,-12,0,0,13,25  
    n   dw 4
    
ends
 
stack segment
    dw   256  dup(0)
ends
 
code segment
start:
; set segment registers:
           mov ax, data
           mov ds, ax
           mov es, ax
           xor si,si
           xor di,di 
           mov cx,n  
 
;--nachalo koda---------------------------------
                                     
            xor dl, dl
            xor cx, cx
            xor al, al
            xor si, si    
            xor di, di   
            mov di, 27
            mov cx, 14               ; obnylili i zanesli v cx kol-vo prohodov
                                
CYCL0:                                         
CYCL1:      mov ax, mas[si]         ; zanosim v dx perviy element       
            TEST AX,8000h           ;                                           
            
            LOOPE CYCL1
           
CYCL2:      mov bx, mas[di]         ; zanosim v dx perviy element       
            TEST AX,8000h           ;                                           
           
            LOOPE CYCL2
             
            CMP SI,DI               ; sravnivaem SI i DI
            JL L1                   ; esli men'she to perehod
            jmp vix                 ; esli ravno ili men'she to prigaem na vix

        L1: mov ax, mas[si]         ; zanosim v ax, zna4enie polojitel'nogo elementa     
            mov bx, mas[di]         ; zanosim v bx, zna4enie polojitel'nogo elementa     
            mov mas[si],bx          ; zanosim zna4enie iz mas[di] v mas[si]
            mov mas[di], ax         ; zanosim zna4enie iz mas[si] v mas[di]
            inc si                  ; dobal9em k si 1
            inc si                  ; dobal9em k si 1         
            dec si                  ; otnimaem ot si 1
            dec si                  ; otnimaem ot si 1  
LOOP CYCL0
 vix:    
 
 xor si,si
 mov cx, 4 
 
 CALL   pthis
   DB 13,10, 'otsortirovannii massiv= ', 0   
 ld: mov ax,mas[si]
cbw
    inc si  
    inc si
   CALL   print_num 
   CALL   pthis
   DB  ', ', 0
loop ld     
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
      DEFINE_SCAN_NUM          
    DEFINE_CLEAR_SCREEN
    DEFINE_PTHIS 
    DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
end start ; set entry point and stop the assembler.

Решение задачи: «Переставить положительные элементы в обратном порядке, не меняя положения остальных элементов массива»

textual
Листинг программы
; multi-segment executable file template.
        include 'emu8086.inc'
data segment
    ; add your data here! 
   
    mas dw 1,0,4,30,-2,-1,5,7,-28,-12,0,0,13,25  
    n   dw 4
    
ends
 
stack segment
    dw   256  dup(0)
ends
 
code segment
start:
; set segment registers:
           mov ax, data
           mov ds, ax
           mov es, ax
           xor si,si
           xor di,di 
           mov cx,n  
 
;--nachalo koda---------------------------------
                                     
            xor dl, dl
            xor cx, cx
            xor al, al
            mov si, -2    
            xor di, di   
            mov di, 28
            mov cx, 14              
                                
CYCL0:      push cx
            mov cx, 14
            mov ax,cx                                        
CYCL1:      inc si
            inc si
            mov ax, mas[si]            
            TEST AX,8000h           
            LOOPNE CYCL1
            jnz vix
            sub dx,cx
            mov cx, 14 
CYCL2:      dec di
            dec di
            mov bx, mas[di]          
            TEST bx,8000h                                                  
            LOOPNE CYCL2
            
            CMP SI,DI            
            Jl vix          
            mov cx,1
            jmp  vix1: 
      vix:  mov ax, mas[si]          
            mov bx, mas[di]            
            mov mas[si],bx        
            mov mas[di], ax        
 
            pop cx
 vix1: 
LOOP CYCL0
    
 
 xor si,si
 mov cx, 4 
 
 CALL   pthis
   DB 13,10, 'otsortirovannii massiv= ', 0   
 ld: mov ax,mas[si]
cbw
    inc si  
    inc si
   CALL   print_num 
   CALL   pthis
   DB  ', ', 0
loop ld     
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
      DEFINE_SCAN_NUM          
    DEFINE_CLEAR_SCREEN
    DEFINE_PTHIS 
    DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
end start ; set entry point and stop the assembler.

Объяснение кода листинга программы

  1. Объявляются переменные в сегменте данных:    - название переменной: mas, значение переменной: массив чисел {1,0,4,30,-2,-1,5,7,-28,-12,0,0,13,25}    - название переменной: n, значение переменной: 4
  2. Устанавливаются начальные значения регистров и переменных:    - устанавливаются значения регистров ds и es для доступа к данным    - устанавливаются значения переменных si и di в 0    - устанавливается переменная cx равной значению переменной n (4)
  3. Выполняется операция перестановки положительных элементов массива в обратном порядке:    - цикл перебора элементов массива: проверяется каждый элемент массива на положительность и выполнение условия сравнения    - если элемент положительный, он меняется местами с последним положительным элементом    - выводится отсортированный массив чисел
  4. Программа завершается и передает управление операционной системе. Код представляет собой сегментированную программу на языке Assembler для перестановки положительных элементов в массиве в обратном порядке и вывода результата.

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы