Skip to content

Instantly share code, notes, and snippets.

@PashokSy
Created January 12, 2020 19:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PashokSy/a8c7da7623b527080f2013a07ecdf5bf to your computer and use it in GitHub Desktop.
Save PashokSy/a8c7da7623b527080f2013a07ecdf5bf to your computer and use it in GitHub Desktop.
;* СОЗДАНИЕ СЕГМЕНТА СТЭКА *
STACKSEG SEGMENT PARA "STACK"
DW 32 DUP(0)
STACKSEG ENDS
;* СОЗДАНИЕ СЕГМЕНТА ДАННЫХ *
DSEG SEGMENT PARA PUBLIC "DATA"
MES1 DB 0AH,0DH,"START ARRAY - $"
MES2 DB 0AH,0DH,"SORTED ARRAY - $"
N EQU 9
MAS DB 2,7,0,1,9,3,6,5,8
TMP DW ?
I DW 0
J DW 0
DSEG ENDS
;--------------------------------------------------------------------------
;* СОЗДАНИЕ СЕГМЕНТА КОДА *
CSEG SEGMENT PARA PUBLIC "CODE"
;* НАЧАЛО ОСНОВНОЙ ПРОЦЕДУРЫ
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, SS: STACKSEG
;* MAGIC * (РАЗМЕЩЕНИЕ ПРОГРАММЫ В ПАМЯТИ?)
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DSEG ; *ИНИЦИАЛИЗАЦИЯ СЕГМЕНТНОГО
MOV DS, AX ; РЕГИСРА 'DS'*
;* MAGIC END'S *
CALL ARRAY_MSG_PROC
CALL ARRAY_SUM_PROC
MOV BX,AX
MOV AL,0AH
INT 29H
MOV AX,BX
CALL OUTPUT_PROC
CALL ARRAY_MAX_PROC
MOV BX,AX
MOV AL,0AH
INT 29H
MOV AX,BX
CALL OUTPUT_PROC
CALL ARRAY_SORT_PROC
CALL ARRAY_MSG_PROC
RET ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ ВЫЗЫВАЮЩЕЙ ПРОЦЕДУРЕ
MAIN ENDP
;* КОНЕЦ ОСНОВНОЙ ПРОЦЕДУРЫ
;--------------------------------------------------------------------------
ARRAY_MSG_PROC PROC
MOV AH,09H
LEA DX,MES1
INT 21H
MOV CX,9
MOV SI,0
FORLOOP:
MOV DL,MAS[SI]
ADD DL,'0'
MOV AH,02H
INT 21H
ADD SI,1
LOOP FORLOOP
RET
ARRAY_MSG_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_SUM_PROC PROC
XOR AX,AX
MOV CX,9
MOV SI,0
FORLOOP1:
MOV DL,MAS[SI]
ADD AX,DX
ADD SI,1
LOOP FORLOOP1
RET
ARRAY_SUM_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_MAX_PROC PROC
MOV AL,MAS[0]
MOV TMP,AX
MOV CX,8
MOV SI,2 ;ОДИН ЭЛЕМЕНТ ЯЧЕЙКИ ЗАНИМАЕТ ДВА БИТА
FORLOOP2:
MOV AL,MAS[SI]
CMP TMP,AX
JL JNGMAX
JMP NOTMAX
JNGMAX:
MOV AL,MAS[SI]
MOV TMP,AX
NOTMAX:
ADD SI,1
LOOP FORLOOP2
MOV AX,TMP
RET
ARRAY_MAX_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_SORT_PROC PROC
xor cx, cx
;чистим регистр cx
j2:
mov cl,9
; заносим num в cl
dec cl
; отнимаем 1 из cl
c0:
mov bx, cx
; заносим cx в bx
mov AL, mas[bx]
; заносим mas[bx] (текущий элемент массива) в al
cmp AL, mas[bx-1]
; сравниваем текущий элемент массива с предыдущим
jL j1
; если al (а значит mas[bx]) больше, то перехидим на метку j1
loop c0
; если нет то: if(cx>0) (cx=cx-1, goto c0);
jmp j0
; заканчиваем алгоритм
; Метка j1 меняет текущий и предыдущий элемент мессива
j1:
mov AH, mas[bx-1];
mov mas[bx], AH
mov mas[bx-01h], AL
jmp j2
jmp c0
j0:
RET
ARRAY_SORT_PROC ENDP
;--------------------------------------------------------------------------
;* НАЧАЛО ПРОЦЕДУРЫ "ВЫВОДА ДАННЫХ"
OUTPUT_PROC PROC
MOV BX,AX ; РАЗМЕЩЕНИЕ ЧИСЛА В РЕГИСТРЕ AX
OR BX,BX ; *ЕСЛИ ЧИЛО ПОЛОЖИТЕЛЬНОЕ
JNS M1 ; ПЕРЕЙТИ В M1.
MOV AL,"-" ; ИНЧЕ РАЗМЕСТИТ В РЕЗУЛЬТАТЕ СИМВОЛ МИНУСА.
INT 29H ; ВЫВЕСТИ МИНУС НА ЭКРАН*
NEG BX ; ИЗМЕНИТЬ СТАРШИЙ БИТ ЧИСЛА("УБРАТЬ МИНУС")
M1: ; ТОЧКА ПРЕХОДА ЕСЛИ ЧИСЛО ПОЗИТИВНОЕ
MOV AX,BX ; ОБНОВИТЬ ЧИСЛО В РЕГИСТРЕ 'AX'(ИЗ-ЗА "NEG BX")
XOR CX,CX ; ОБНУЛИТЬ РЕГИСТР СЧЕТЧИКА
MOV BX,10 ; ДЛЯ РАЗДЕЛЕНИЯ ЧИСЛА НА РАЗРЯДЫ
M2: ; НАЧАЛО ЦИКЛА "РАЗМЕЩЕНИЕ ЧИСЛА В СТЕКЕ"
XOR DX,DX ; ОБНУЛЕНИЕ 'DX'
DIV BX ; ДЕЛЕНИЕ 'AX' НА 'BX'(ОТДЕЛЕНИЕ РАЗРЯДА)
ADD DL,"0" ; DECIMAL TO ASCII
PUSH DX ; РАЗМЕЩЕНИЕ РЕЗУЛЬТАТА В СТЕКЕ
INC CX ; УВЕЛИЧЕНИЕ СЧЕТЧИКА
TEST AX,AX ; *ЕСЛИ ЕЩЕ ОСТАЛИСЬ ЦИФРЫ В ЧИСЛЕ
JNZ M2 ; ПОВТОРИТЬ "РАЗМЕЩЕНИЕ В СТЕКЕ"
M3: ; НАЧАЛО ЦИКЛА ВЫВОДА ЧИСЛА ИЗ СТЕК НА ЭКРАН
POP AX ; ДОСТАТЬ ВЕРХНЮЮ ЦИФРУ ИЗ СТЭКА
INT 29H ; ВЫВЕСТИ ЕЁ НА ЭКРАН
LOOP M3 ; ПОВТОРИТЬ 'M3' ПОКА СЧЕТЧИК НЕ '0'
RET ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ ВЫЗЫВАЮЩЕЙ ПРОЦЕДУРЕ
OUTPUT_PROC ENDP
;* КОНЕЦ ПРОЦЕДУРЫ "ВЫВОДА ДАННЫХ"
;--------------------------------------------------------------------------
CSEG ENDS ; КОНЕЦ СЕГМЕНТА КОДА
END MAIN ; ВЫХОД ИЗ ПРОГРАММЫ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment