Skip to content

Instantly share code, notes, and snippets.

@PashokSy
Created January 15, 2020 19:18
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/cb184085ae46ee7f260bc73b779a8fd9 to your computer and use it in GitHub Desktop.
Save PashokSy/cb184085ae46ee7f260bc73b779a8fd9 to your computer and use it in GitHub Desktop.
;* СОЗДАНИЕ СЕГМЕНТА СТЭКА *
STACKSEG SEGMENT PARA PUBLIC "STACK"
DW 32 DUP(0)
STACKSEG ENDS
;* СОЗДАНИЕ СЕГМЕНТА ДАННЫХ *
DSEG SEGMENT PARA PUBLIC "DATA"
; ПРОМЕЖУТОЧНЫЕ ПЕРЕМЕННЫЕ ДЛЯ УРАВНЕНИЙ
X DW ?
REZ DW ?
REZ2 DW ?
FL DB 0 ; ФЛАГ НЕГАТИВНОГО(1)/ПОЗИТИВНОГО(0) ЧИСЛА
DUMP DB 5, ?, 4 DUP('?') ; СТРУКТКРА ДАННЫХ ДЛЯ ХРАНЕНИЯ ВВОДА
ERRCD DB 0 ; ФЛАГ ОШИБКИ
; 0 - ОШИБОК НЕТ
; 1 - ОШИБКА
ERRTXT DB '*ERROR*'
DB ' - SOMETHING WENT WRONG$'
MSGTXT DB 'ENTER YOUR NUMBER:$'
MSG2TXT DB 'ANSWER: $'
CELOETXT DB 'CELOE: $'
OSTATOKTXT DB 'OSTATOK: $'
DSEG ENDS
;--------------------------------------------------------------------------
INCLUDE MACROSI.ASM
;--------------------------------------------------------------------------
;* СОЗДАНИЕ СЕГМЕНТА КОДА *
CSEG SEGMENT PARA PUBLIC "CODE"
;* НАЧАЛО ОСНОВНОЙ ПРОЦЕДУРЫ
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, SS: STACKSEG
MAGIC DSEG
NEWLINE
PRINTF MSGTXT
NEWLINE
INPUT DUMP,ERRCD,X,FL
CMP ERRCD,1
JNE NO_ERROR
PRINTF ERRTXT ;ИНАЧЕ ВЫВЕСТИ СООБЩЕНИЕ ОБ ОШИБКЕ
MOV AX,4C00H
INT 21H
NO_ERROR:
NEWLINE
NEWLINE
PRINTF MSG2TXT ;'ANSWER'
NEWLINE
NEWLINE
; ПРОВЕРКА ТРЕТЬЕГО УСЛОВИЯ X<0
CMP FL,1 ; X < 0
JNE NOEQ3 ;ЕСЛИ НЕ МЕНЬШЕ 0 ПРЫГНУТЬ
;ИНАЧЕ
EQUATION3 X,REZ,REZ2 ;НАЙТИ РЕЗУЛЬТАТ
CALL PRINT_RESULT ;ВЫВЕСТИ РЕЗУЛЬТАТ
NOEQ3:
;*
; ПРОВЕРКА ВТОРОГО УСЛОВИЯ X = 0
CMP X,0
JNE NOEQ2 ;ЕСЛИ НЕ РАВНО 0, НЕ ВЫПОЛНЯТЬ
EQUATION2 REZ
OUTPUT REZ
NOEQ2:
;*
; ПРОВЕРКА ТРЕТЬЕГО УСЛОВИЯ X>0
CMP X,0
JE NOEQ1
JL NOEQ1
EQUATION1 X,REZ,REZ2
CALL PRINT_RESULT ;ВЫВЕСТИ РЕЗУЛЬТАТ
NOEQ1:
;*
NEWLINE
RET ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ ВЫЗЫВАЮЩЕЙ ПРОЦЕДУРЕ
MAIN ENDP
;* КОНЕЦ ОСНОВНОЙ ПРОЦЕДУРЫ
;--------------------------------------------------------------------------
PRINT_RESULT PROC
PRINTF CELOETXT
OUTPUT REZ
NEWLINE
PRINTF OSTATOKTXT
OUTPUT REZ2
MOV AL,'/'
INT 29H
OUTPUT X
RET
ENDP
CSEG ENDS ; КОНЕЦ СЕГМЕНТА КОДА
END MAIN ; ВЫХОД ИЗ ПРОГРАММЫ
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 DUMP,ERRCD,X,FL
MOV ERRCD,0 ; ОБНУЛЕНИЕ КОДА ОШИБКИ
;* ВВОД ДАННЫХ С КЛАВИТУРЫ *
LEA DX,DUMP ; РАЗМЕЩЕНИЕ В 'DX' СТРУКТУРЫ 'DUMP'
MOV AH,10 ; КОД '10' ПРЕРЫВНИЯ 21..
INT 21H ; ..ОТВЕЧАЕТ ЗА ВВОД ДАННЫХ С КЛАВИАТУРЫ
;* КОНЕЦ ПРОЦЕДУРЫ "ВВОДА ДАННЫХ"
;* ОПРЕДЕЛЕНИЕ КОЛ-ВА ВВЕДЕНЫХ СИМОВЛОВ
LEA SI,DUMP+1 ; РАЗМЕЩЕНИЕ В 'SI' АДРЕСА С КОЛ-ВОМ ВВЕДЕНЫХ ЗНАКОВ
XOR CX,CX ; ОБНУЛЕНИЕ СЧЕТЧИКА
MOV CL,[SI] ; "УСТАНОВКА" СЧЕТЧИКА
CMP CX,0 ; *ЕСЛИ НИЧЕГО НЕ ВВЕДЕНО
JE SOME_ERR ; ВЫВЕСТИ КОД ОШИБКИ
;* ОПРЕДЕЛЕНИЕ ПОЗИТИВНОСТИ ЧИСЛА
MOV FL,0 ; ДЛЯ СБРОСА ФЛАГА ПОЗ/НЕГ ЧИСЛА
INC SI ; *ПЕРЕХОД С КОЛ-ВА ВВЕДЕНЫХ СИМВОЛОВ
; НА ПЕРВЫЙ ВВЕДЕННЫЙ СИМВОЛ.
MOV AL,[SI] ; РАЗМЕЩЕНИЕ ЕГО В РЕГИСТР ДЛЯ ОБРАБОТКИ.
CMP AL,'-' ; ПРОВЕРКА МИНУС ЛИ ЭТО.
JNE NO_MINUS ; ЕСЛИ МИНУСА НЕТ - ПЕРЕХОД*
MOV FL,1 ; УСТАНОКА ФЛАГА НЕГАТИВНОГО ЧИСЛА
DEC CL ; УЧЕСТЬ МИНУС В КОЛ-ВЕ ВВЕДЕННЫХ СИМВОЛОВ
CMP CX,0 ; *ЕСЛИ КРОМЕ МИНУСА НИЧЕГО НЕ ВВЕДЕНО
JE SOME_ERR ; ВЫЙТИ ИЗ ПРОГРАММЫ*
INC SI ; ПЕРЕЙТИ К СЛЕДУЮЩЕМУ РАЗРЯДУ ЧИСЛА
NO_MINUS: ;* НАЧАЛО РАБОТЫ С ЧИСЛОМ
XOR AX,AX ; ОЧИСТКА 'AX'
XOR DI,DI ; ОЧИСТКА 'DI'
MOV DI,10 ; ДЛЯ РАЗДЕЛЕНИЯ ЧИСЛА НА РАЗРЯДЫ
DEC SI ; ВОЗВРАЩАЕМСЯ К РАБОЧЕМУ СИМВОЛУ
FOR_LOOP: ; НАЧАЛО ЦИКЛА ПРОХОДА ПО ЧИСЛУ(ПОРАЗРЯДНО)
INC SI ; ПЕРЕХОД К ПЕРВОМУ СИМВОЛУ
XOR BX,BX ; ОБНУЛЕНИЕ 'BX'
MOV BL,[SI] ; РАЗМЕЩЕНИЕ ЧИСЛА В РЕГИСТР
SUB BL,'0' ; ПРЕОБРАЗОВАНИЕ ASCII TO DEC
CMP BL,9 ; *ЕСЛИ ВВЕДЕНА НЕ ЦИФРА
JA SOME_ERR ; ВЫЙТИ ИЗ ПРОГРАММЫ*
MUL DI ; *УМНОЖАЕМ 'AX' НА 10 ДЛЯ ДОБАВЛЕНИЯ МЕСТА
; ПОД НОВЫЙ СИМВОЛ* (1 -> 10 + 'BX' = 11)
ADD AX,BX ; ПРИБАВЛЯЕМ К ЧИСЛУ В 'AX' ПОЛУЧЕННУЮ ЦИФРУ
LOOP FOR_LOOP ; "КОНЕЦ" ЦИКЛА ПРОХОДА ПО ЧИСЛУ
CMP FL,1 ; *ЕСЛИ ЧИСЛО НЕ ОТРИЦАТЕЛЬНОЕ
JNE NOT_NEG ; НИЧЕГО НЕ ДЕЛАЕМ.
NEG AX ; ИНЧЕ - ДЕЛАЕМ ЕГО НЕГАТИВНЫМ.
NOT_NEG:
CMP ERRCD,0 ; *ЕСЛИ ОШИБОК НЕТ
JE EXIT ; НА ВЫХОД ИЗ ПРОЦЕДУРЫ*
SOME_ERR:
MOV ERRCD,1 ; ПОДНЯТЬ ФЛАГ ОШИБКИ - 1
EXIT:
MOV X,AX
ENDM
OUTPUT MACRO NUMBER
MOV AX,NUMBER
MOV BX,AX ; РАЗМЕЩЕНИЕ ЧИСЛА В РЕГИСТРЕ AX
OR BX,BX ; *ЕСЛИ ЧИЛО ПОЛОЖИТЕЛЬНОЕ
JNS $+8 ; ПЕРЕЙТИ В M1.
MOV AL,"-" ; ИНЧЕ РАЗМЕСТИТ В РЕЗУЛЬТАТЕ СИМВОЛ МИНУСА.
INT 29H ; ВЫВЕСТИ МИНУС НА ЭКРАН*
NEG BX ; ИЗМЕНИТЬ СТАРШИЙ БИТ ЧИСЛА("УБРАТЬ МИНУС")
;$+8: ; ТОЧКА ПРЕХОДА ЕСЛИ ЧИСЛО ПОЗИТИВНОЕ
MOV AX,BX ; ОБНОВИТЬ ЧИСЛО В РЕГИСТРЕ 'AX'(ИЗ-ЗА "NEG BX")
XOR CX,CX ; ОБНУЛИТЬ РЕГИСТР СЧЕТЧИКА
MOV BX,10 ; ДЛЯ РАЗДЕЛЕНИЯ ЧИСЛА НА РАЗРЯДЫ
;$-11: ; НАЧАЛО ЦИКЛА "РАЗМЕЩЕНИЕ ЧИСЛА В СТЕКЕ"
XOR DX,DX ; ОБНУЛЕНИЕ 'DX'
DIV BX ; ДЕЛЕНИЕ 'AX' НА 'BX'(ОТДЕЛЕНИЕ РАЗРЯДА)
ADD DL,"0" ; DECIMAL TO ASCII
PUSH DX ; РАЗМЕЩЕНИЕ РЕЗУЛЬТАТА В СТЕКЕ
INC CX ; УВЕЛИЧЕНИЕ СЧЕТЧИКА
TEST AX,AX ; *ЕСЛИ ЕЩЕ ОСТАЛИСЬ ЦИФРЫ В ЧИСЛЕ
JNZ $-11 ; ПОВТОРИТЬ "РАЗМЕЩЕНИЕ В СТЕКЕ"
;$-3: ; НАЧАЛО ЦИКЛА ВЫВОДА ЧИСЛА ИЗ СТЕК НА ЭКРАН
POP AX ; ДОСТАТЬ ВЕРХНЮЮ ЦИФРУ ИЗ СТЭКА
INT 29H ; ВЫВЕСТИ ЕЁ НА ЭКРАН
LOOP $-3 ; ПОВТОРИТЬ 'M3' ПОКА СЧЕТЧИК НЕ '0'
ENDM
EQUATION3 MACRO X,REZ,REZ2
MOV AX,X
MOV BX,X ;'BX' = X
IMUL BX ;'AX' = X*X
NEG AX ; КВАДРАТ УБИРЕТ МИНУС
MOV BX,5 ;'BX' = 5
IMUL BX ;'AX' = 5*X*X
MOV REZ,AX ;'REZ' = 5*X*X
MOV AX,X ;'AX' = X
MOV BX,1 ;'BX' = 1
SUB AX,BX ;'AX' = 1-X
MOV X,AX ;'X' = 1-X
NEG X ; ЧТО БЫ В ЗНАМИНАТЕЛЕ БЫЛО БЕЗ МИНУСА
MOV BX,AX ;'REZ2' = 1-X
MOV AX,REZ ;'AX' = 5*X*X
IDIV BX ;'AX' = 5*X*X/1-X
NEG DX ; ВСЕ МИНУСЫ ПРОПАСТЬ ДОЛЖНЫ
MOV REZ,AX ; ПОМЕСТИТЬ ЧАСТНОЕ В REZ
MOV REZ2,DX ; ПОМЕСТИТЬ ОСТАТОК В REZ2
ENDM
EQUATION2 MACRO REZ
MOV REZ,5
ENDM
EQUATION1 MACRO X,REZ,REZ2
MOV AX,X ; 'AX' = X
MOV BX,20 ; 'BX' = 20
MUL BX ; 'AX' = 20X
ADD AX,25 ; 'AX' = 20X + 25
MOV REZ,AX ; 'REZ' = 20X + 25
MOV AX,X ; 'AX' = X
MOV BX,AX ; 'AX' = X
MUL BX ; 'AX' = X*X
MOV BX,3 ; 'BX' = 3
MUL BX ; 'AX' = 3*X*X
MOV REZ2,AX ; 'REZ2' = 3*X*X
MOV AX,X ; 'AX' = X
MOV BX,9 ; 'BX' = 9
MUL BX ; 'AX' = 9X
ADD AX,REZ2 ; 'AX' = 3XX + 9X
ADD AX,6 ; 'AX' = 3XX + 9X + 6
MOV BX,AX ; 'BX' = 3XX + 9X + 6
MOV X,AX ; 'X' = 3XX + 9X + 6
MOV AX,REZ ; 'AX' = 20X+25
DIV BX ; 'AX' - ЧАСТНОЕ
; 'DX' - ОСТАТОК
MOV REZ,AX ; ПОМЕСТИТЬ ЧАСТНОЕ В REZ
MOV REZ2,DX ; ПОМЕСТИТЬ ОСТАТОК В REZ2
ENDM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment