Skip to content

Instantly share code, notes, and snippets.

@PashokSy
Created January 13, 2020 18:54
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/d1192603738131556c1ea01bfb78c76f to your computer and use it in GitHub Desktop.
Save PashokSy/d1192603738131556c1ea01bfb78c76f 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 - $"
N EQU 9
TMP DW ?
I DW 1
J DW 1
MAS DW 4,5,6,6
DW 7,8,9,0
DW 1,2,3,4
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 *
MOV BX,I
MOV AX,4
MUL BX
SHL AX,1
MOV BX,AX
MOV SI,J
SHL SI,1
MOV AX,MAS[BX+SI]
XOR AH,AH
MOV DX,AX
ADD DX,'0'
MOV AH,02
INT 21H
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 DX,DX
; 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
; ;--------------------------------------------------------------------------
; INPUT_PROC PROC
; MOV SI,0
; MOV CX,N
; enter_text:
; MOV AH,1H
; INT 21H
; sub AL,30H
; XOR AH,AH
; mov MAS[si],AX
; ADD si,2
; LOOP enter_text
; RET
; INPUT_PROC ENDP
; ;--------------------------------------------------------------------------
CSEG ENDS ; КОНЕЦ СЕГМЕНТА КОДА
END MAIN ; ВЫХОД ИЗ ПРОГРАММЫ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment