Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- assume cs: cseg, ds: dseg, ss: sseg
- sseg segment stack
- db 256 dup (?)
- sseg ends
- dseg segment
- arr dw 1, -9, 7, 6
- N dw ($-arr)/type arr
- dseg ends
- cseg segment
- OutInt proc
- push bp
- mov bp, sp
- push ax
- push bx
- push cx
- push dx
- ; Проверяем число на знак.
- mov ax, [bp+4]
- test ax, ax
- jns oi1
- ; Если оно отрицательное, выведем минус и оставим его модуль.
- mov cx, ax
- mov ah, 02h
- mov dl, '-'
- int 21h
- mov ax, cx
- neg ax
- ; Количество цифр будем держать в CX.
- 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
- pop bp
- ret 2
- OutInt endp
- ; +8h: right
- ; +6h: left
- ; +4h: arr
- qsort proc
- push bp ;бп - для абсолютной адресации
- mov bp, sp
- push ax
- push bx
- push cx
- push dx
- push si
- mov ax, [bp+6] ; левая граница
- mov bx, [bp+8] ; правая граница
- ; cx = arr[(left + right) / 2]
- mov si, ax
- add si, bx
- add si, [bp+4]
- mov cx, [si]
- ;if ax>bx:
- ; end_while1
- cmp ax, bx
- ; ja - это для безнаковых
- ja end_while1 ; если левая больше правой то выход1
- begin_while1:
- loop_while2:
- ;if arr[first]>=arr[avg]:
- ; end_while2
- ;ax=ax+1 => first++
- ;loop_while2
- mov si, ax
- shl si, 1
- add si, [bp+4]
- cmp [si], cx ;сравниваем первый элемент и средний со знаком
- jge end_while2
- inc ax
- jmp loop_while2
- end_while2:
- loop_while3:
- ;if arr[last]<=arr[avg]:
- ; end_while3
- ;bx=bx-1 => last++
- ;loop_while3
- mov si, bx
- shl si, 1
- add si, [bp+4]
- cmp [si], cx
- jle end_while3
- dec bx
- jmp loop_while3
- end_while3:
- ;if first>last:
- ; end_if1
- ;if first==last:
- ; no_change
- cmp ax, bx
- ja end_if1
- jz no_change
- ; if first<last:
- ; swap(arr[first], arr[last])
- push cx
- ; cx = arr[ax]
- mov si, ax
- shl si, 1
- add si, [bp+6]
- mov cx, [si]
- push si
- ; dx = arr[bx]
- mov si, bx
- shl si, 1
- add si, [bp+6]
- mov dx, [si]
- ; swap(arr[bx], arr[ax])
- mov [si], cx
- pop si
- mov [si], dx
- pop cx
- no_change:
- inc ax
- dec bx
- end_if1:
- ;if first<=last:
- ; begin_while1
- cmp ax, bx
- jbe begin_while1
- end_while1:
- ;if left>=bx:
- ; end_if2
- cmp [bp+6h], bx
- jae end_if2
- push bx
- push [bp+6h]
- push [bp+4h]
- call qsort
- end_if2:
- ; if ax>=right:
- ; end_if3
- cmp ax, [bp+8h]
- jae end_if3
- push [bp+8h]
- push ax
- push [bp+4h]
- call qsort
- end_if3:
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- pop bp
- ret 6
- endp
- start:
- mov ax,dseg
- mov ds, ax
- push N-1
- push 0
- push arr
- call qsort
- mov cx, N
- mov si, arr
- cycle:
- push [si]
- call OutInt
- add si, 2
- loop cycle
- mov ax,4c00h
- int 21h
- cseg ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement