Created
January 13, 2020 18:54
-
-
Save PashokSy/d1192603738131556c1ea01bfb78c76f 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 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