Created
January 14, 2020 16:00
-
-
Save PashokSy/14686e45bda26fd0c1b4893877773dc7 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 - $" | |
MES2 DB 0DH,"ENTER YOUR NUMBER FOR SEARCH:$" | |
MES3 DB 0DH,"ENTER YOUR ARRAY IN LINE (16 ELEMS, SQUARE ARRAY ONLY)$" | |
MES4 DB 0DH,"COORDINATES FOUND: $" | |
MES5 DB "( $" | |
MES6 DB " ; $" | |
MES7 DB " ) $" | |
MES8 DB " $" | |
N EQU 16 | |
SRCH DW ? | |
I DW 0 | |
J DW 0 | |
MAS DW 17 DUP (?) | |
TMP DW ? | |
DSEG ENDS | |
WRT MACRO STRING | |
MOV AH,9 ; Функция вывода строки | |
LEA DX,STRING ; Загружаем адрес строки | |
INT 21H ; Вызов прерывания DOS | |
ENDM | |
;-------------------------------------------------------------------------- | |
;* СОЗДАНИЕ СЕГМЕНТА КОДА * | |
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 * | |
; ПОЛУЧИТЬ ПОИСКОВЫЙ | |
WRT MES2 ; ПОПРОСИТЬ ВВЕСТИ ПОИСКОВЫЙ | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
CALL INPUT_POISKOVIY ; ПОЛУЧИТЬ ОТ ПОЛЬЗОВАТЕЛЯ ПОИСКОВЫЙ | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
;* | |
; ПОЛУЧИТЬ МАССИВ ОТ ПОЛЬЗОВАТЕЛЯ | |
WRT MES3 ; ПОПРОСИТЬ ВВЕСТИ МАССИВ | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
CALL ARRAY_INPUT_PROC ; ЗАПИСАТЬ МАССИВ В ПЕРЕМЕННУЮ MAS | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
;* | |
; НАЙТИ КООРДИНАТЫ ВХОЖДЕНИЯ | |
WRT MES4 ; "ENTRY FOUND" | |
CALL FIND_COORDINATES ;НАЙТИ ВХОЖДЕНИЯ И ВЫВЕСТИ ИХ НА ЭКРАН | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
;* | |
RET ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ ВЫЗЫВАЮЩЕЙ ПРОЦЕДУРЕ | |
MAIN ENDP | |
;* КОНЕЦ ОСНОВНОЙ ПРОЦЕДУРЫ | |
;-------------------------------------------------------------------------- | |
ARRAY_INPUT_PROC PROC | |
MOV SI,0 | |
MOV CX,N | |
ENTER_ARRAY: | |
MOV AH,1H | |
INT 21H | |
SUB AL,30H | |
XOR AH,AH | |
MOV MAS[SI],AX | |
ADD SI,2 | |
LOOP ENTER_ARRAY | |
RET | |
ARRAY_INPUT_PROC ENDP | |
;-------------------------------------------------------------------------- | |
FIND_COORDINATES PROC | |
MOV I,0 ; НАЧАТЬ С ПЕРВОГО ЭЛЕМЕНТА | |
MOV J,0 | |
MOV CX,16 ; 16 ЭЛЕМЕНТОВ В МАССИВЕ | |
FORLOOP: | |
; ПРЕОБРАЗОВАТЬ 'I' | |
MOV BX,I | |
MOV AX,8 ; (4*2) 4 ДЛИНА РЯДКА, 2 ИЗ-ЗА DW | |
MUL BX | |
MOV BX,AX | |
; ПРЕОБРАЗОВАТЬ 'J' | |
MOV SI,J | |
SHL SI,1 | |
MOV AX,MAS[BX+SI] ; ВЗЯТЬ ЭЛЕМЕНТ МАССИВА ПО АДРЕСУ | |
MOV BX,SRCH | |
CMP J,4 | |
JNE CONTINUE_LINE | |
MOV J,0 | |
ADD I,1 | |
CONTINUE_LINE: | |
CMP AX,BX ; СРАВНИТЬ С ПОИСКОВЫМ | |
JNE NOT_PRINT_COORD ; ЕСЛИ НЕ СОВПАЛИ ПЕРЕПРЫГУНТЬ ВЫВОД КООРДИНАТЫ НА ЭКРАН | |
MOV TMP,CX ; 'OUTPUT_PROC' ЗАТИРАЕТ 'CX' | |
;ВЫВОД КООРДИНАТЫ НА ЭКРАН | |
CALL KARETKA_JMP_PROC ; ПЕРЕВЕСТИ КАРЕТКУ | |
WRT MES5 ; "( " | |
MOV AX,I ; 'OUTPUT_PROC' РАБОТАЕТ С 'AX' | |
INC AX ; НЕ ПРОГРАММИСТСТСТСКАЯ КООРДИНАТА | |
CALL OUTPUT_PROC ; ВЫВОДИТ ЦИФРУ | |
WRT MES6 ; " ; " | |
MOV AX,J ; 'OUTPUT_PROC' РАБОТАЕТ С 'AX' | |
INC AX ; НЕ ПРОГРАММИСТСТСТСКАЯ КООРДИНАТА | |
CALL OUTPUT_PROC ; ВЫВОДИТ ЦИФРУ | |
WRT MES7 ; " )" | |
;* | |
MOV CX,TMP ; ВОЗВРАЩАЕТСЯ СЧЕТЧИК | |
NOT_PRINT_COORD: | |
ADD J,1 | |
LOOP FORLOOP | |
RET | |
FIND_COORDINATES ENDP | |
;-------------------------------------------------------------------------- | |
KARETKA_JMP_PROC PROC | |
XOR AX,AX | |
MOV AL,0AH ; ПЕРЕЙТИ НА СЛЕДУЩУЮ СТРОКУ | |
INT 29H | |
XOR AX,AX | |
MOV AL,0DH | |
INT 29H | |
RET | |
KARETKA_JMP_PROC ENDP | |
;-------------------------------------------------------------------------- | |
INPUT_POISKOVIY PROC | |
MOV AH,01H ; СЧИТАТЬ СИМВОЛ В РЕГИСТР 'AL' | |
INT 21H | |
SUB AL,30H | |
XOR AH,AH ; ПОЧИСТИТЬ 'AX' ОТ '01H' | |
MOV SRCH,AX ; ЗАПОМНИТЬ ПОИСКОВЫЙ | |
RET | |
INPUT_POISKOVIY 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