Написать программу обработки массива под DOS - Assembler

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

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

Нужно сделать так: все отрицательные элементы поместить в начало, остальные - в конец массива. Желательно чтобы их порядок не нарушался, т.е., если массив1 ={3,-5,7,21,-3,9,0,11,-14,2}, то после обработки должно получиться {-5,-3,-14,3,7,21,9,0,11,2} или на худой конец {-5,-3,-14,2,11,0,9,21,7,3}. Важно: адресация должна быть БАЗОВАЯ. Пожалуйста, не кидайте ссылки на алгоритмы сортировки, я их уже видел и использовал (очевидно, что там порядок нарушается). У меня есть идея, что как-нибудь можно модифицировать алгоритм сортировки, например, пузырьком, поменяв в сравнении элемент массива на ноль. Вот "слепленная" заготовка кода:
stack segment para stack 'stack'
        db 100h dup(?)
stack ends
 
data segment para public 'data'
        arr1 db 3,-5,7,21,-3,9,0,11,-14,2
        n=$-arr1
data ends
 
code segment para public 'code'
        assume cs: code, ds: data, ss: stack
start:
        mov ax,data
        mov ds,ax
 
;это нужно сделать здесь
        
;вывод массива
mov si,offset arr1
        mov cx,n
outpt:
        xor ax,ax
        lodsb
        cbw
        call OutInt
        mov ah,02h
        mov dl,' '
        int 21h
        loop outpt
        mov ax,4c00h
        int 21h
OutInt proc
        push ax
        push bx
        push cx
        push dx
        test ax,ax
        jns oi1
        mov cx,ax
        mov ah,02h
        mov dl,'-'
        int 21h
        mov ax,cx
        neg ax
oi1:
        xor cx,cx
        mov bx,10
oi2:
        xor dx,dx
        div bx
        push dx
        inc cx
        test ax,ax
        jnz oi2
        mov ah,02h
oi3:
        pop dx
        add dl,'0'
        int 21h
        loop oi3
pop dx
pop cx
pop bx
pop ax
        ret
OutInt endp
        mov ax,4c00h
        int 21h
code ends
end start

Решение задачи: «Написать программу обработки массива под DOS»

textual
Листинг программы
        mov     cx, n-1
        mov     si, offset arr1
        add     cx, si
 
restart:
        mov     bx, si
 
next:
        mov     al, [bx]
        mov     dl, [bx+1]
        or      al, 0
        js      skip
 
        or      dl, 0
        jns     skip
 
        mov     [bx], dl
        mov     [bx+1], al
 
skip:
        inc     bx
        cmp     bx, cx
        jb      next
 
        dec     cx
        cmp     cx, si
        ja      restart

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

12   голосов , оценка 4.333 из 5