Выполнение арифметических операций над числами с фиксированной запятой

Описание:
Тип работы: лабораторная работа
Создание программы ввода с клавиатуры двух чисел в 9-ричной системе счисления размером с слово, выполнение над ними деления и вывода результата в исходной системе счисления. Программа предусматривает контроль вводимой информации и результат операции.
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

Цель: ознакомиться с командами арифметических операций, вводом данных с клавиатуры и выводом данных на экран.

Задание: написать программу ввода с клавиатуры двух чисел в 9-ричной системе счисления размером с слово, выполнения над ними деления и вывода результата в исходной системе счисления. Программа должна предусматривать контроль вводимой информации, контроль диапазона чисел и результата операции (переполнение, невозможность деления).

Программа:

;-----------ЛАБОРАТОРНАЯ РАБОТА №3

 .MODEL SMALL

 .STACK 100H

 .186

 .DATA

S1 DB "ВВЕДИТЕ ДЕЛИМОЕ В ДЕВЯТИРИЧНОЙ СИСТЕМЕ"

DB " СЧИСЛЕНИЯ (ОТ -48848 ДО 1О8806): ",10,13,"$"

S2 DB "ВВЕДИТЕ ДЕЛИТЕЛЬ В ДЕВЯТИРИЧНОЙ СИСТЕМЕ"

DB " СЧИСЛЕНИЯ (ОТ -48848 ДО 1О8806): ",10,13,"$"

S3 DB "НЕВЕРНАЯ ЗАПИСЬ ЧИСЛА В ДЕВЯТИРИЧНОЙ"

DB " СИСТЕМЕ СЧИСЛЕНИЯ ИЗ ЗАДАННОГО ДИАПАЗОНА.","$"

S4 DB "ДЕЛЕНИЕ НЕВОЗМОЖНО: ДЕЛИТЕЛЬ РАВЕН НУЛЮ.","$"

S5 DB "ДЕЛЕНИЕ НЕВОЗМОЖНО: ДЕЛИТЕЛЬ БОЛЬШЕ ДЕЛИМОГО.","$"

S6 DB "ОСТАТОК: ",10,13,"$"

S7 DB "ЧАСТНОЕ: ",10,13,"$"

L DB "48848" ;МИНИМАЛЬНОЕ ЧИСЛО

H DB "108806" ;МАКСИМАЛЬНОЕ ЧИСЛО

SX DB 12 DUP("x") ;ДЕЛИМОЕ

SY DB 12 DUP("y") ;ДЕЛИТЕЛЬ

SZ DB 8 DUP("0"),"$" ;ЧАСТНОЕ

 .CODE

BEGIN: MOV AX, @DATA

 MOV DS, AX

;-----------ОЧИСТКА БУФЕРА КЛАВИАТУРЫ

START: CLI ;ЗАПРЕТ ПРЕРЫВАНИЙ

 SUB AX, AX

 MOV ES, AX

 MOV AL, ES:[41AH]

 MOV ES:[41CH], AL

 STI ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ

;-----------ОЧИСТКА ЭКРАНА

 CLD

 MOV AX, 0B800H

 MOV ES, AX

 MOV DI, 0

 MOV AL, 32

 MOV AH, 7

 MOV CX, 2000

REP STOSW

;-----------УСТАНОВКА КУРСОРА В ЛЕВЫЙ ВЕРХНИЙ УГОЛ ЭКРАНА

 MOV AH, 2 ;НОМЕР ФУНКЦИИ

 MOV BH, 0 ;НОМЕР СТРАНИЦЫ

 MOV DH, 0 ;СТРОКА

 MOV DL, 0 ;СТОЛБЕЦ

 INT 10H ;ПОЗИЦИОНИРОВАНИЕ КУРСОРА

;-----------ВЫВОД ПРИГЛАШЕНИЯ ВВОДА ДЕЛИМОГО

 LEA DX, S1

 MOV AH, 9

 INT 21H

;-----------ВВОД ДЕЛИМОГО

 LEA DX, SX

 MOV BX, DX

 MOV [BX], BYTE PTR 9 ;ПРЕДПОЛАГАЕМАЯ ДЛИНА СТРОКИ

 MOV AH, 0AH

 INT 21H

;-----------УСТАНОВКА КУРСОРА

 MOV AH, 2 ;НОМЕР ФУНКЦИИ

 MOV BH, 0 ;НОМЕР СТРАНИЦЫ

 MOV DH, 2 ;СТРОКА

 MOV DL, 0 ;СТОЛБЕЦ

 INT 10H ;ПОЗИЦИОНИРОВАНИЕ КУРСОРА

;-----------ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА ДЕЛИМОГО

 LEA DX, SX

 MOV BX, DX

 CALL CONTROL ;ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА

 MOV AL, [BX]

 CMP AL, "0"

 JE ZERO1 ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

 JMP NEAR PTR DELITEL

ZERO1: LEA DX, S3

 MOV AH, 9

 INT 21H

;===========ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ

 MOV AH, 7

 INT 21H

 JMP NEAR PTR START

;-----------ВЫВОД ПРИГЛАШЕНИЯ ВВОДА ДЕЛИТЕЛЯ

DELITEL: LEA DX, S2

 MOV AH, 9

 INT 21H

;-----------ВВОД ДЕЛИТЕЛЯ

INPUT: LEA DX, SY

 MOV BX, DX

 MOV [BX], BYTE PTR 9 ;ПРЕДПОЛАГАЕМАЯ ДЛИНА СТРОКИ

 MOV AH, 0AH

 INT 21H

;-----------УСТАНОВКА КУРСОРА

 MOV AH, 2 ;НОМЕР ФУНКЦИИ

 MOV BH, 0 ;НОМЕР СТРАНИЦЫ

 MOV DH, 4 ;СТРОКА

 MOV DL, 0 ;СТОЛБЕЦ

 INT 10H ;ПОЗИЦИОНИРОВАНИЕ КУРСОРА

;-----------ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА ДЕЛИТЕЛЯ

 LEA DX, SY

 MOV BX, DX

 CALL CONTROL ;ПРОВЕРКА ПРАВИЛЬНОСТИ ВВОДА

 CMP [BX], BYTE PTR "0"

 JE ZERO2 ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

 JMP NEAR PTR OK

ZERO2: LEA DX, S3

 MOV AH, 9

 INT 21H

;===========ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ

 MOV AH, 7

 INT 21H

;-----------ОЧИСТКА БУФЕРА КЛАВИАТУРЫ

 CLI

 SUB AX, AX

 MOV ES, AX

 MOV AL, ES:[41AH]

 MOV ES:[41CH], AL

 STI

;-----------ОЧИСТКА ЭКРАНА

 CLD

 MOV AX, 0B800H

 MOV ES, AX

 MOV DI, 480

 MOV AL, 32

 MOV AH, 7

 MOV CX, 480

REP STOSW

;-----------УСТАНОВКА КУРСОРА

 MOV AH, 2 ;НОМЕР ФУНКЦИИ

 MOV BH, 0 ;НОМЕР СТРАНИЦЫ

 MOV DH, 3 ;СТРОКА

 MOV DL, 0 ;СТОЛБЕЦ

 INT 10H ;ПОЗИЦИОНИРОВАНИЕ КУРСОРА

 JMP NEAR PTR INPUT

;-----------УСТАНОВКА КУРСОРА

OK: MOV AH, 2 ;НОМЕР ФУНКЦИИ

 MOV BH, 0 ;НОМЕР СТРАНИЦЫ

 MOV DH, 4 ;СТРОКА

 MOV DL, 0 ;СТОЛБЕЦ

 INT 10H ;ПОЗИЦИОНИРОВАНИЕ КУРСОРА

;-----------ПРОВЕРКА ВОЗМОЖНОСТИ ДЕЛЕНИЯ

 LEA BX, SX

 CALL CTRL0

 MOV AH, [BX]

 LEA BX, SY

 CALL CTRL0

 MOV AL, [BX]

 CMP AL, "0"

 JE NULL

 JMP N_NULL

;-----------ДЕЛИТЕЛЬ РАВЕН НУЛЮ

NULL: LEA DX, S4

 MOV AH, 9

 INT 21H

 JMP NEAR PTR ENDPROG

;-----------ДЕЛИТЕЛЬ НЕ РАВЕН НУЛЮ

N_NULL: CMP AH, "0"

 JNE DELENIE

;-----------ДЕЛИМОЕ РАВНО НУЛЮ

 LEA DX, S7

 MOV AH, 9

 INT 21H

 LEA BX, SZ

 MOV [BX], BYTE PTR "0"

 INC BX

 MOV [BX], BYTE PTR 10

 INC BX

 MOV [BX], BYTE PTR 13

 INC BX

 MOV [BX], BYTE PTR "$"

 LEA DX, SZ

 MOV AH, 9

 INT 21H

 LEA DX, S6

 MOV AH, 9

 INT 21H

 LEA DX, SZ

 MOV AH, 9

 INT 21H

 JMP NEAR PTR ENDPROG

;-----------ДЕЛИМОЕ И ДЕЛИТЕЛЬ НЕ РАВНЫ НУЛЮ

DELENIE: LEA SI, SX

 LEA DI, SY

 CALL COMPARE

 CMP [SI], BYTE PTR 1

 JE POSSIBLE

;-----------ДЕЛИТЕЛЬ БОЛЬШЕ ДЕЛИМОГО

 LEA DX, S5

 MOV AH, 9

 INT 21H

 JMP NEAR PTR ENDPROG

;-----------НАЧИНАЕТСЯ ДЕЛЕНИЕ

POSSIBLE: MOV BX, 7 ;BX - ИНДЕКС ДЛЯ ЧАСТНОГО

;-----------В СХ - ЧИСЛО РАЗРЯДОВ ДЕЛИТЕЛЯ

AGAIN: MOV CL, SY[1] ;CX - ЧИСЛО РАЗРАДОВ ДЕЛИТЕЛЯ

 MOV CH, 0

;-----------DI - НА МЛАДШИЙ РАЗРЯД ДЕЛИТЕЛЯ

 MOV DI, CX ;DI - ИНДЕКС ДЛЯ ДЕЛИТЕЛЯ

 INC DI

;-----------УДАЛЕНИЕ ВЕДУЩИХ НУЛЕЙ ДЕЛИТЕЛЯ

 MOV SI, 2 ;SI - ИНДЕКС ДЛЯ ДЕЛИМОГО

 MOV AL, SY[SI]

 CMP AL, "-"

 JNE BEFORE_C1

 INC SI

 DEC CX

BEFORE_C1: MOV AL, SY[SI]

 CMP AL, "0"

 JE SS1

 JMP LBLL

SS1: INC SI

 DEC CX

 JMP BEFORE_C1

;-----------SI - НА МЛАДШИЙ РАЗРЯД ДЕЛИМОГО

LBLL: MOV AL, SX[1]

 CBW ;АН - ДЛЯ ЗАПИСИ ПЕРЕНОСА

 MOV SI, AX

 INC SI

;-----------НАЧАЛО ЦИКЛА ДЕЛЕНИЯ

;===========СРАВНЕНИЕ ЦИФР РАЗРЯДА ДЕЛИМОГО И ДЕЛИТЕЛЯ

C1: MOV AL, SX[SI]

 CMP AL, SY[DI]

 JAE NEXT

;===========ЦИФРА ДЕЛИМОГО МЕНЬШЕ ЦИФРЫ ДЕЛИТЕЛЯ

 ADD AL, 9 ;ЗАЁМ ЕДИНИЦЫ

 SUB AL, SY[DI] ;ВЫЧИТАНИЕ

 ADD AL, "0" ;ПЕРЕВОД ЦИФРЫ В ЕЕ КОД

 SUB AL, AH ;ВЫЧИТАНИЕ ПЕРЕНОСА

 MOV SX[SI], AL ;РЕЗУЛЬТАТ - НА МЕСТО РАЗРЯДА ДЕЛИМОГО

 MOV AH, 1 ;ЗАПИСЬ ЗАЁМА

 JMP NEAR PTR DECREM ;НА КОНЕЦ ЦИКЛА

;===========ЦИФРА ДЕЛИМОГО БОЛЬШЕ ЦИФРЫ ДЕЛИТЕЛЯ

NEXT: SUB AL, SY[DI] ;ВЫЧИТАНИЕ

 SUB AL, AH ;ВЫЧИТАНИЕ ПЕРЕНОСА

 MOV AH, 0 ;ЗАЁМА НЕТ

 ADD AL, "0" ;ПЕРЕВОД ЦИФРЫ В ЕЕ КОД

 MOV SX[SI], AL ;РЕЗУЛЬТАТ - НА МЕСТО РАЗРЯДА ДЕЛИМОГО

;-----------SI, DI - НА БОЛЕЕ СТАРШИЙ РАЗРЯД

DECREM: DEC SI

 DEC DI

 LOOP C1 ;НА НАЧАЛО ЦИКЛА ДЕЛЕНИЯ

;-----------БЫЛ ЛИ ЗАЁМ ИЛИ НЕТ

 CMP AH, 1

 JNE SRAVN

;-----------ЗАЁМ БЫЛ

AGAIN1: CMP SX[SI], "0" ;СРАВНЕНИЕ ЦИФРЫ РАЗРЯДА С НУЛЁМ

 JE C2

 DEC SX[SI]

 JMP SRAVN

;-----------ЦИФРА РАЗРЯДА ДЕЛИТЕЛЯ РАВНА НУЛЮ

C2: MOV SX[SI], "8"

 DEC SI ;НА БОЛЕЕ СТАРШИЙ РАЗРЯД

 JMP AGAIN1 ;НА СРАВНЕНИЕ ЦИФРЫ РАЗРЯДА С НУЛЁМ

;===========ФОРМИРОВАНИЕ ЧАСТНОГО

;-----------ЕСТЬ ЛИ ПЕРЕНОС ПРИ УВЕЛИЧЕНИИ ЧАСТНОГО НА ЕДИНИЦУ

SRAVN: CMP SZ[BX], "8"

 JE PERENOS

;-----------ПЕРЕНОСА НЕТ

 ADD SZ[BX], 1 ;УВЕЛИЧЕНИЕ ЧАСТНОГО НА ЕДИНИЦУ

 MOV BX, 7 ;ВХ - НА МЛАДШИЙ РАЗРЯД

 JMP DEL ;НА СРАВНЕНИЕ ДЕЛИМОГО И ДЕЛИТЕЛЯ

;-----------ПЕРЕНОС ЕСТЬ

PERENOS: MOV SZ[BX], "0" ;В ДАННЫЙ РАЗРЯД - НУЛЬ

 DEC BX ;УВЕЛИЧЕНИЕ РАЗРЯДА

 JMP SRAVN ;НА СРАВНЕНИЕ РАЗРЯДА С "8"

;===========СРАВНЕНИЕ ДЕЛИМОГО И ДЕЛИТЕЛЯ

DEL: LEA SI, SX

 LEA DI, SY

 CALL COMPARE

 MOV AL, [SI]

 CMP AL, 1

 JNE QUIT ;ДЕЛЕНИЕ ЗАВЕРШЕНО

 JMP NEAR PTR AGAIN ;ДЕЛЕНИЕ ПРОДОЛЖАЕТСЯ

;-----------ОПРЕДЕЛЕНИЕ ЗНАКА ЧАСТНОГО

QUIT: MOV AH, SX[2]

 MOV AL, SY[2]

;-----------ВЫЯСНЕНИЕ ЗНАКА ДЕЛИМОГО

 CMP AH, "-"

 JE SX_

 JMP N_SX_

;-----------ДЕЛИМОЕ - ОТРИЦАТЕЛЬНОЕ

SX_: CMP AH, AL ;СРАВНЕНИЕ ЗНАКА ДЕЛИМОГО И ДЕЛИТЕЯ

 JE OUTP ;НА ВЫВОД ОСТАТКА

;-----------ДЕЛИТЕЛЬ - ПОЛОЖИТЕЛЬНЫЙ

;===========УДАЛЕНИЕ ВЕДУЩИХ НУЛЕЙ В ЧАСТНОМ

SY_: MOV BX, 0

SRCH: CMP SZ[BX], "0"

 JE DALEE

 JMP STOP

DALEE: INC BX

 JMP SRCH

;-----------ЗАПИСЬ МИНУСА ПЕРЕД СТАРШИМ РАЗРЯДОМ ЧАСТНОГО

STOP: DEC BX

 MOV SZ[BX], "-"

 JMP OUTP ;НА ВЫВОД ОСТАТКА

;-----------ДЕЛИМОЕ ПОЛОЖИТЕЛЬНОЕ

N_SX_: CMP AL, "-" ;ДЕЛИТЕЛЬ ОТРИЦАТЕЛЬНЫЙ?

 JE SY_ ;ЧАСТНОЕ ОТРИЦАТЕЛЬНОЕ

;-----------ВЫВОД ЧАСТНОГО

;===========ВЫВОД ОСТАТКА

;-----------ВЫВОД СТРОКИ "ОСТАТОК:"

OUTP: LEA DX, S6

 MOV AH, 9

 INT 21H

;ЗАПИСЬ В КОНЕЦ ОСТАТКА СИМВОЛОВ 10, 13 И "$"

 MOV BH, 0

 MOV BL, SX[1]

 ADD BX, 2 ;ВХ - ЗА МЛАДШИЙ РАЗРЯД

 MOV SX[BX], 10

 INC BX

 MOV SX[BX], 13

 INC BX

 MOV SX[BX], "$"

;-----------УДАЛЕНИЕ ВЕДУЩИХ НУЛЕЙ ОСТАТКА

 MOV AH, "0"

 LEA BX, SX ;ВХ - УКАЗЫВАЕТ НА ОСТАТОК

 INC BX

 INC BX

 MOV AL, [BX]

 CMP AL, "-"

 JE MN

 JMP N_MN

MN: MOV AH, "-"

 INC BX

N_MN: MOV AL, [BX]

 CMP AL, "0"

 JE EQ1

 JMP NEQ1

EQ1: INC BX

 JMP N_MN

NEQ1: MOV AL, [BX]

 DEC BX

 CMP AL, 10

 JE N_NUL

 MOV [BX], AH

 CMP AH, "-"

 JE EQQ

 JMP NEQQ

EQQ: MOV DX, BX

 JMP LBL

NEQQ: INC BX

 MOV AL, [BX]

 CMP AL, 10

 JE NUL

 JMP N_NUL

NUL: DEC BX

N_NUL: MOV DX, BX

LBL: MOV AH, 9

 INT 21H

;===========ВЫВОД ЧАСТНОГО

 LEA DX, S7

 MOV AH, 9

 INT 21H

 LEA BX, SZ

Q: MOV AL, [BX]

 CMP AL, "0"

 JE SM3

 JMP OUTPUT

SM3: INC BX

 JMP Q

OUTPUT: MOV DX, BX

 MOV AH, 9

 INT 21H

;-----------ВЫХОД ИЗ ПРОГРАММЫ

ENDPROG: MOV AH, 4CH

 INT 21H

;===========ПРОЦЕДУРА CONTROL - ЧИСЛО ДЕВЯТИРИЧНОЕ?

CONTROL PROC

 PUSHA ;СОХРАНЕНИЕ РЕГИСТРОВ В СТЕКЕ

 MOV BX, DX

 INC BX

 MOV AL, [BX]

 MOV AH, 0

 MOV CX, AX

;-----------ЯВЛЯЕТСЯ ЛИ СТРОКА ПУСТОЙ?

 CMP AL, 0

 JE ERR1 ;ЯВЛЯЕТСЯ

;-----------ПРОВЕРКА ДЛИНЫ СТРОКИ

 CMP AL, 6

 JA ERR1 ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

 INC BX

 MOV AH, [BX]

 CMP AH, "-"

 JE MINUS

 JMP NEAR PTR FOR1

MINUS: INC BX ;ЧИСЛО ОТРИЦАТЕЛЬНОЕ

 DEC CX

;-----------ВВЕДЕННОЕ ЧИСЛО ДЕВЯТИРИЧНОЕ?

FOR1: MOV AH, [BX]

 CMP AH, "9"

 JB N1

ERR1: JMP NEAR PTR ERROR ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

N1: CMP AH, "0"

 JB ERR1 ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

 INC BX

 LOOP FOR1

 MOV [BX], BYTE PTR "$" ;ДЛЯ ВЫВОДА СТРОКИ

 CMP AL, 6

 JNE RETURN ;ЕСЛИ ДЛИНА ЧИСЛА МЕНЬШЕ 6

 MOV BX, DX

 INC BX

 MOV AH, 0

 MOV CX, AX

 INC BX

 MOV AH, [BX]

 CMP AH, "-"

 JE M1 ;ЧИСЛО ОТРИЦАТЕЛЬНОЕ

 LEA DI, H ;ЧИСЛО ПОЛОЖИТЕЛЬНОЕ

 JMP FOR2

M1: INC BX

 DEC CX

 LEA DI, L

;ВХОДИТ ЛИ ЧИСЛО В ЗАДАННЫЙ ДИАПАЗОН?

FOR2: MOV AH, [BX]

 CMP AH, [DI]

 JA ERROR ;ЧИСЛО ВВЕДЕНО НЕВЕРНО

 JB RETURN ;ЧИСЛО ВВЕДЕНО ПРАВИЛЬНО

 INC BX

 INC DI

 LOOP FOR2

 JMP RETURN

ERROR: MOV BX, DX

 MOV [BX], BYTE PTR "0"

RETURN: POPA ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ

 RET

CONTROL ENDP

;===========ПРОЦЕДУРА CTRL0 - ЭТО НУЛЬ?

CTRL0 PROC

 PUSHA

 MOV SI, 1

 MOV CL, [BX+SI]

 MOV CH, 0

 INC SI

 MOV AL, [BX+SI]

 CMP AL, "-"

 JE MIN

 JMP CYCLE

MIN: INC SI

 DEC CX

CYCLE: MOV AL, [BX+SI]

 CMP AL, "0"

 JNE FINISH

 INC SI

 LOOP CYCLE

 MOV SI, 0

 MOV AL, "0"

 MOV [BX+SI], AL

FINISH: POPA

 RET

CTRL0 ENDP

;===========ПРОЦЕДУРА COMPARE - СРАВНЕНИЕ ДВУХ ЧИСЕЛ

COMPARE PROC

 PUSHA

 INC SI

 INC DI

 MOV AH, [SI]

 MOV AL, [DI]

 INC SI

 INC DI

 CMP BYTE PTR [SI], "-"

 JE NEGAT1

 JMP POZIT1

NEGAT1: DEC AH

 INC SI

POZIT1: CMP BYTE PTR [DI], "-"

 JE NEGAT2

 JMP POZIT2

NEGAT2: DEC AL

 INC DI

POZIT2: MOV BL, [SI]

 CMP BL, "0"

 JE SM

 JMP DI0

SM: INC SI

 DEC AH

 JMP POZIT2

DI0: MOV BL, [DI]

 CMP BL, "0"

 JE SM1

 JMP SRAV1

SM1: INC DI

 DEC AL

 JMP DI0

SRAV1: CMP AH, AL

 JA ABOVE

 JB BELOW

 JMP EQUAL

ABOVE: LEA SI, SX

 MOV [SI], BYTE PTR 1

 JMP NEAR PTR END1

BELOW: LEA SI, SX

 MOV [SI], BYTE PTR -1

 JMP NEAR PTR END1

EQUAL: MOV CL, AL

 MOV CH, 0

FOR3: MOV AH, [SI]

 CMP AH, [DI]

 JA ABOVE

 JB BELOW

 INC SI

 INC DI

 LOOP FOR3

 JMP ABOVE

END1: POPA

 RET

COMPARE ENDP

 END BEGIN

Информация о файле
Название файла Выполнение арифметических операций над числами с фиксированной запятой от пользователя z3rg
Дата добавления 11.1.2012, 18:08
Дата обновления 11.1.2012, 18:08
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 16 килобайт (Примерное время скачивания)
Просмотров 614
Скачиваний 104
Оценить файл