Skip to content

Instantly share code, notes, and snippets.

@PashokSy PashokSy/lab42.asm
Created Jan 14, 2020

Embed
What would you like to do?
;* СОЗДАНИЕ СЕГМЕНТА СТЭКА *
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
You can’t perform that action at this time.