Skip to content

Instantly share code, notes, and snippets.

@PashokSy
Created January 13, 2020 15:19
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/9a51d2bb9da69be2a595bb582ec6af28 to your computer and use it in GitHub Desktop.
Save PashokSy/9a51d2bb9da69be2a595bb582ec6af28 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 0DH,"START ARRAY - $"
MES2 DB 0DH,"SORTED ARRAY - $"
MES3 DB 0DH,"ELEMENT SUM - $"
MES4 DB 0DH,"MAX ELEMENT - $"
N EQU 9
MAS DW 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 *
LEA DX,MES1 ; ЗАЛОЖИТЬ СООБЩЕНИЕ ДЛЯ ВЫВОДА
CALL PRINT_MSG ; ВЫВЕСТИ ЗАЛОЖЕННОЕ СООБЩЕНИЕ
CALL ARRAY_MSG_PROC ; ВЫВЕСТИ ИЗНАЧАЛЬНЫЙ МАССИВ НА ЭКРАН
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ
; ПОДСЧЕТ СУММЫ ЭЛЕМЕНТОВ И ВЫВОД НА ЭКРАН
CALL ARRAY_SUM_PROC
LEA DX,MES3 ; ЗАЛОЖИТЬ СООБЩЕНИЕ ДЛЯ ВЫВОДА
CALL PRINT_MSG ; ВЫВЕСТИ ЗАЛОЖЕННОЕ СООБЩЕНИЕ
CALL OUTPUT_PROC ; 'OUTPUT_PROC' РАБОТАЕТ С 'AX'*
;*
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ
; НАХОЖДЕНИЕ МАКСИМАЛЬНОГО ЭЛЕМЕНТА И ВЫВОД НА ЭКРАН
CALL ARRAY_MAX_PROC
LEA DX,MES4 ; ЗАЛОЖИТЬ СООБЩЕНИЕ ДЛЯ ВЫВОДА
CALL PRINT_MSG ; ВЫВЕСТИ ЗАЛОЖЕННОЕ СООБЩЕНИЕ
CALL OUTPUT_PROC ; 'OUTPUT_PROC' РАБОТАЕТ С 'AX'*
;*
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ
; СОРТИРОВКА МАСИВА И ВЫВОД НА ЭКРАН
CALL ARRAY_SORT_PROC ; БЕЗ 'ПУЗЫРЬКА' НЕ РАЗОБРАТЬСЯ
LEA DX,MES2 ; ЗАЛОЖИТЬ СООБЩЕНИЕ ДЛЯ ВЫВОДА
CALL PRINT_MSG ; ВЫВЕСТИ ЗАЛОЖЕННОЕ СООБЩЕНИЕ
CALL ARRAY_MSG_PROC ; ВЫВЕСТИ ОТСОРТИРОВАНЫЙ МАССИВ НА ЭКРАН
;*
RET ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ ВЫЗЫВАЮЩЕЙ ПРОЦЕДУРЕ
MAIN ENDP
;* КОНЕЦ ОСНОВНОЙ ПРОЦЕДУРЫ
;--------------------------------------------------------------------------
PRINT_MSG PROC
MOV BX,AX ; ЧТО БЫ НЕ ПОТЕРЯТЬ ЗНАЧЕНИЕ В РЕГИСТРЕ
MOV AH,09H ; ВЫВЕСТИ ТО ЧТО ПОЛОЖЕНО В 'DX'
INT 21H
MOV AX,BX ; ВЕРНУТЬ ЗНАЧЕНИЕ В 'AX'
RET
PRINT_MSG ENDP
;--------------------------------------------------------------------------
ARRAY_MSG_PROC PROC
MOV CX,N ; КОЛ-ВО ЭЛЕМЕНТОВ МАССИВА В СЧЕТЧИК
MOV SI,0 ; НАЧИНАЕТЬСЯ С НУЛЕВОГО
FORLOOP:
MOV DX,MAS[SI] ; ЗАКЛАДЫВАЕТЬСЯ ЭЛЕМЕНТ МАСИВА
ADD DL,'0' ; ПРЕОБРАЗОВЫВАЕТСЯ В ASCII
MOV AH,02H ; ВЫВОДИТЬСЯ НА ЭКРАН
INT 21H
ADD SI,2 ; ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ
LOOP FORLOOP
RET
ARRAY_MSG_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_SUM_PROC PROC
XOR AX,AX ; ОБНУЛЯЕМ 'AX'
MOV CX,N ; КОЛ-ВО ЭЛЕМЕНТОВ МАССИВА В СЧЕТЧИК
MOV SI,0 ; НАЧИНАЕТЬСЯ С НУЛЕВОГО
FORLOOP1:
MOV DX,MAS[SI] ; ЗАКЛАДЫВАЕТЬСЯ ЭЛЕМЕНТ МАСИВА
ADD AX,DX ; СУММИРУЮТЬСЯ ЭЛЕМЕНТЫ
ADD SI,2 ; ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ
LOOP FORLOOP1
RET
ARRAY_SUM_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_MAX_PROC PROC
MOV AX,MAS[0] ;ПЕРВЫЙ ЭЛЕМЕНТ ПОМЕЩАЕТСЯ В 'AX'
MOV TMP,AX ;СЧИТАЕМ ЕГО МАКСИМАЛЬНЫМ И ЗАПОМИНАЕМ
MOV CX,N ; КОЛ-ВО ЭЛЕМЕНТОВ МАССИВА В СЧЕТЧИК
DEC CX ; ТАК КАК ПЕРВЫЙ УЖЕ ЭЛЕМЕНТ УЖЕ ПРОЙДЕН
MOV SI,2 ;ОДИН ЭЛЕМЕНТ ЯЧЕЙКИ ЗАНИМАЕТ ДВА БИТА
FORLOOP2:
MOV AX,MAS[SI] ;СЛЕДУЮЩИЙ ЕЛЕМЕНТ ЗАКЛАДЫВАЕТСЯ В 'AX'
CMP TMP,AX ;СРАВНИВАЕТСЯ С ПРЕДПОЛАГАЕМЫМ МАКСИВАЛЬНЫМ
JL JNGMAX ;ЕСЛИ НОВЫЙ ЭЛЕМЕНТ БОЛЬШЕ*
JMP NOTMAX ;ИНЧЕ-
JNGMAX:
MOV AX,MAS[SI] ; "НА ВСЯКИЙ"
MOV TMP,AX ;*СЧИТАЕМ ЕГО МАКСИМАЛЬНЫМ
NOTMAX:
ADD SI,2 ;-ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ
LOOP FORLOOP2
MOV AX,TMP ; 'AX' = РЕЗУЛЬТАТ
RET
ARRAY_MAX_PROC ENDP
;--------------------------------------------------------------------------
ARRAY_SORT_PROC PROC
XOR CX,CX ;ОЧИСТКА СЧЕТЧИКА
START_SORT:
MOV CX,N ; КОЛ-ВО ЭЛЕМЕНТОВ МАССИВА В СЧЕТЧИК
DEC CX ; ЧТО БЫ ИСПОЛЬЗОВАТЬ КАК АДРЕС (ОТ 0 ДО 8)
SHL CX,1 ; ТАК КАК ХРАНИТЬСЯ СЛОВО. (СДВИГ БИТА ВЛЕВО/УМНОЖЕНИЕ НА 2)
CYCL_START:
MOV BX,CX ;ДЛЯ ИСПОЛЬЗОВАНИЯ В ИНДЕКСАЦИИ
MOV AX,MAS[BX] ; ЗАПИСАТЬ В 'AL' ТЕКУЩИЙ ЭЛЕМЕНТ МАССИВА
CMP AX,MAS[BX-2] ; СРАВНЕНИЕ ТЕКУЩЕГО ЭЛЕМЕНТА массива с предыдущим
JL EXCHANGE ; ЕСЛИ "СТАРШИЙ" ЭЛМЕНТ БОЛЬШЕ ПЕРЕХОДИМ В 'EXCHANGE'
DEC CX
LOOP CYCL_START ; ИНЧЕ ПРОДОЛЖИТЬ ПРОХОД ПО МАССИВУ
JMP CYCL_CLOSE ; ЕСЛИ ЦИКЛ ЗАКОНЧЕН НА ВЫХОД ИЗ ПРОЦЕДУРЫ
EXCHANGE: ;ПОМЕНЯТЬ ЭЛЕМЕНТЫ МЕСТАМИ ЕСЛИ УСЛОВИЕ ВЫПОЛНЕНО
MOV DX,MAS[BX] ; ЗАПОМНИТЬ ТЕКУЩИЙ ЭЛЕМЕНТ
MOV AX,MAS[BX-2] ;ЗАПОМНИТЬ "МЛАДШИЙ ЭЛЕМЕНТ"
MOV MAS[BX],AX ;ПОММЕНЯТЬ ЕГО МЕСТАМИ С "СТАРШИМ"
MOV MAS[BX-2],DX ;-//-
JMP START_SORT
JMP CYCL_START
CYCL_CLOSE:
XOR DX,DX ; НА ВСЯКИЙ ИЗБАВИТСЯ ОТ МУСОРА В 'DX'
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
;* КОНЕЦ ПРОЦЕДУРЫ "ВЫВОДА ДАННЫХ"
;--------------------------------------------------------------------------
KARETKA_JMP_PROC PROC
MOV BX,AX ; ЧТО БЫ НЕ ПОТЕРЯТЬ ЗНАЧЕНИЕ
MOV AL,0AH ; ПЕРЕЙТИ НА СЛЕДУЩУЮ СТРОКУ
INT 29H
MOV AX,BX ; *ВЕРНУТЬ ЗНАЧЕНИЕ В 'AX'..
RET
KARETKA_JMP_PROC ENDP
;--------------------------------------------------------------------------
CSEG ENDS ; КОНЕЦ СЕГМЕНТА КОДА
END MAIN ; ВЫХОД ИЗ ПРОГРАММЫ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment