Created
January 14, 2020 19:34
-
-
Save PashokSy/dc6f26146bb07b08b273d14f22691412 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
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' |
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
MAGIC MACRO DSEG | |
;* MAGIC * (РАЗМЕЩЕНИЕ ПРОГРАММЫ В ПАМЯТИ?) | |
PUSH DS | |
MOV AX, 0 | |
PUSH AX | |
MOV AX, DSEG ; *ИНИЦИАЛИЗАЦИЯ СЕГМЕНТНОГО | |
MOV DS, AX ; РЕГИСРА 'DS'* | |
;* MAGIC END'S * | |
ENDM | |
PRINTF MACRO STRING | |
MOV AH,9 ; Функция вывода строки | |
LEA DX,STRING ; Загружаем адрес строки | |
INT 21H ; Вызов прерывания DOS | |
ENDM | |
NEWLINE MACRO | |
MOV AL,0AH | |
INT 29H | |
ENDM | |
INPUT MACRO MAS | |
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 | |
ENDM | |
OUTPUT_ARRAY MACRO MAS | |
MOV CX,N ; КОЛ-ВО ЭЛЕМЕНТОВ МАССИВА В СЧЕТЧИК | |
MOV SI,0 ; НАЧИНАЕТЬСЯ С НУЛЕВОГО | |
;K | |
MOV DX,MAS[SI] ; ЗАКЛАДЫВАЕТЬСЯ ЭЛЕМЕНТ МАСИВА | |
ADD DL,'0' ; ПРЕОБРАЗОВЫВАЕТСЯ В ASCII | |
MOV AH,02H ; ВЫВОДИТЬСЯ НА ЭКРАН | |
INT 21H | |
ADD SI,2 ; ПЕРЕХОД К СЛЕДУЮЩЕМУ ЭЛЕМЕНТУ | |
LOOP $-14 | |
ENDM | |
ARRAY_SUM MACRO MAS,N,TMP | |
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 | |
MOV TMP,AX | |
ENDM | |
OUTPUT1 MACRO NUMBER | |
MOV AX,NUMBER | |
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' | |
ENDM | |
OUTPUT2 MACRO NUMBER | |
MOV AX,NUMBER | |
MOV BX,AX ; РАЗМЕЩЕНИЕ ЧИСЛА В РЕГИСТРЕ AX | |
OR BX,BX ; *ЕСЛИ ЧИЛО ПОЛОЖИТЕЛЬНОЕ | |
JNS M11 ; ПЕРЕЙТИ В M1. | |
MOV AL,"-" ; ИНЧЕ РАЗМЕСТИТ В РЕЗУЛЬТАТЕ СИМВОЛ МИНУСА. | |
INT 29H ; ВЫВЕСТИ МИНУС НА ЭКРАН* | |
NEG BX ; ИЗМЕНИТЬ СТАРШИЙ БИТ ЧИСЛА("УБРАТЬ МИНУС") | |
M11: ; ТОЧКА ПРЕХОДА ЕСЛИ ЧИСЛО ПОЗИТИВНОЕ | |
MOV AX,BX ; ОБНОВИТЬ ЧИСЛО В РЕГИСТРЕ 'AX'(ИЗ-ЗА "NEG BX") | |
XOR CX,CX ; ОБНУЛИТЬ РЕГИСТР СЧЕТЧИКА | |
MOV BX,10 ; ДЛЯ РАЗДЕЛЕНИЯ ЧИСЛА НА РАЗРЯДЫ | |
M22: ; НАЧАЛО ЦИКЛА "РАЗМЕЩЕНИЕ ЧИСЛА В СТЕКЕ" | |
XOR DX,DX ; ОБНУЛЕНИЕ 'DX' | |
DIV BX ; ДЕЛЕНИЕ 'AX' НА 'BX'(ОТДЕЛЕНИЕ РАЗРЯДА) | |
ADD DL,"0" ; DECIMAL TO ASCII | |
PUSH DX ; РАЗМЕЩЕНИЕ РЕЗУЛЬТАТА В СТЕКЕ | |
INC CX ; УВЕЛИЧЕНИЕ СЧЕТЧИКА | |
TEST AX,AX ; *ЕСЛИ ЕЩЕ ОСТАЛИСЬ ЦИФРЫ В ЧИСЛЕ | |
JNZ M22 ; ПОВТОРИТЬ "РАЗМЕЩЕНИЕ В СТЕКЕ" | |
M33: ; НАЧАЛО ЦИКЛА ВЫВОДА ЧИСЛА ИЗ СТЕК НА ЭКРАН | |
POP AX ; ДОСТАТЬ ВЕРХНЮЮ ЦИФРУ ИЗ СТЭКА | |
INT 29H ; ВЫВЕСТИ ЕЁ НА ЭКРАН | |
LOOP M33 ; ПОВТОРИТЬ 'M3' ПОКА СЧЕТЧИК НЕ '0' | |
ENDM | |
ARRAY_MAX MACRO MAS,TMP | |
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 | |
ENDM | |
ARRAY_SORT MACRO MAS,N | |
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' | |
ENDM |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment