Created
January 12, 2020 19:42
-
-
Save PashokSy/a8c7da7623b527080f2013a07ecdf5bf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;* СОЗДАНИЕ СЕГМЕНТА СТЭКА * | |
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