Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Топ:
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Действия:
· сравнивает байт или слово, адресованные регистрами ES:DI с содержимым регистров AL или AX соответственно; если перед командой не стоит префикс repxx, то завершает работу. В противном случае
· увеличивает или уменьшает на 1 (на 2 для слова) в зависимости от флага направления адрес в регистре DI;
· уменьшает содержимое регистра CX на 1;
· если содержимое регистра CX не равно нулю и выполнилось условие, определяемое префиксом repxx, повторяет действия с первого шага. В противном случае выполняется очередная команда.
Форматы команд.
| Код | Операнд | |
| <метка>: | [rep ]scasb | |
| <метка>: | [rep ]scasw | |
| <метка>: | [rep ]scas | m |
Флаги. Команды воздействуют на флаги A, C, O, P, S, Z.
Замечание 6.1 также справедливо для команды scas.
Использование строковых команд.
page 60,132
;--------------------------------------------------------------------
stacksg segment para stack 'Stack'
dw 32 dup(?)
stacksg ends
;--------------------------------------------------------------------
datasg segment para 'Data'
name1 db 'Assemblers'
name2 db 10 dup(' ')
name3 db 10 dup(' ')
datasg ends
;--------------------------------------------------------------------
codesg segment para 'Code'
begin proc far
assume CS:codesg,DS:datasg,
SS:stacksg,ES:datasg
push DS
sub AX,AX
push AX
mov AX,datasg
mov DS,AX
mov ES,AX
call c10mvsb
call d10mvsw
call e10lods
call f10stos
call h10scas
ret
begin endp
; Использование MOVSB
; ------------------------------
c10mvsb proc near
cld
lea SI,name1
lea DI,name2
mov CX,10;Переслать 10 байтов
rep movsb ; из name1 в name2
ret
c10mvsb endp
; Использование MOVSW
; ------------------------------
d10mvsw proc near
cld
lea SI,name2
lea DI,name3
mov CX,5;Переслать 5 слов
rep movsw ; из name2 в name3
ret
d10mvsw endp
; Использование LODSW
; ------------------------------
e10lods proc near
cld
lea SI,name1;Загрузить 1-е слово
lodsw ; из name1 в AX
ret
e10lods endp
; Использование STOSW
; ------------------------------
f10stos proc near
cld
lea DI,name3
mov CX,5
mov AX,2020h;Заполнить пробелами
rep stosw ; поле name3
ret
f10stos endp
; Использование CMPSB
; ------------------------------
g10cmps proc near
cld
lea SI,name1
lea DI,name2
mov CX,10
repe cmpsb ;Сравнить name1 и name2
jne g20 ;если не равны
mov BH,01
g20: mov CX,10
lea SI,name2
lea DI,name3
repe cmpsb ;Сравнить name2 и name3
je g30 ;если равны
mov BL,02
g30: ret
g10cmps endp
; Использование SCASB
; ------------------------------
h10scas proc near
cld
lea DI,name
mov CX,10
mov AL,'m';Поиск символа ‘m’
repne scasb ; в name1
jne h20 ;если нет
mov BH,03
h20: ret
h10scas endp
codesg ends
end begin
6.3. Задания для самостоятельной работы
1. В сегменте данных представлена строка символов длиной N. Написать программу замены в этой строке первого встретившегося слева и первого встретившегося справа символов ‘*’ на пробел.
2. В сегменте данных представлена строка символов, конец которой отмечен ноль-символом (символом с кодом 0). Написать программу подсчета количества символов ‘*’ в этой строке.
3. В сегменте данных объявлены два подряд идущих поля
pattern db '***---'
disarea db 42 dup(?)
Напишите программу, которая заполнит все поле disarea следующим образом
***---***---***---***---... ***---
Для заполнения разрешается использовать только одну команду movsw с соответствующими подготовительными операциями.
4. Используя определение сегмента данных с базированием по абсолютному адресу видеобуфера, напишите программы
| № | Задание |
| 1 | перемещения содержимого экрана на n строк вверх (нижние освободившиеся строки очищаются); |
| 2 | перемещения содержимого экрана на n строк вниз (верхние освободившиеся строки очищаются); |
| 3 | перемещения содержимого экрана на n колонок вправо (левые освободившиеся колонки очищаются); |
| 4 | перемещения содержимого экрана на n колонок влево (правые освободившиеся колонки очищаются); |
| 5 | перестановки между собой строк с заданными номерами m и n; |
| 6 | замены цвета на экране у всех символов ‘*’, имеющих белый цвет на черном фоне, на желтый цвет на голубом фоне; |
| 7 | уплотнения текста на экране путем удаления в каждой строке слева от текста всех пробелов, имеющих атрибут цвета «белый на черном»; |
| 8 | циклического перемещения содержимого экрана на n строк вверх (нижние освободившиеся строки заполняются вышедшими за границу верхними строками); |
| 9 | циклического перемещения содержимого экрана на n строк вниз (верхние освободившиеся строки заполняются вышедшими за границу нижними строками); |
| 10 | циклического перемещения содержимого экрана на n колонок вправо (левые освободившиеся колонки заполняются вышедшими за границу правыми колонками); |
| 11 | циклического перемещения содержимого экрана на n колонок влево (правые освободившиеся колонки заполняются вышедшими за границу левыми колонками); |
| 12 | очистки прямоугольного фрагмента экрана с заданными координатами левого верхнего угла и длинами сторон с обрамлением фрагмента в рамку;
|
| 13 | копирования прямоугольного фрагмента экрана с заданными координатами левого верхнего угла и длинами сторон в область экрана с координатами левого верхнего угла;
|
| 14 | очистки экрана под ее диагональю (очистку производить пробелами с заданным атрибутом цвета); |
| 15 | очистки экрана над ее диагональю (очистку производить пробелами с заданным атрибутом цвета). |
ПРИЛОЖЕНИЕ A. Директивы
Таблица A. 1 Основные директивы ассемблера
| Директива | Назначение |
| 1 | 2 |
| assume <ср>:<ис>{,<ср>:<ис>} | Связывает сегментный регистр <ср> с сегментом с именем <ис> |
| extrn <ви>:<тп>{,<ви>:<тп>} | Информирует ассемблер о том, что переменные и метки <ви>, имеющие тип <тп>, определены в других модулях |
| group <ис>{,<ис>} | Объединяет однотипные сегменты под одно имя. Общий их объем не должен превышать 64 Кбайт |
| include <иф> | Включает файл с именем <иф> в исходный текст программы |
| <имя> label <тип> | Назначает имени, определенному за данным оператором, новое <имя> и <тип> |
| name <им> | Назначает имя <им> модулю |
Продолжение таблицы A.1
| 1 | 2 |
| org <кв> | Назначает значение константного выражения <кв> адресному счетчику и соответственно изменяет адрес следующего определяемого элемента. В выражении можно использовать символ ‘$’, обозначающий текущее значение адреса |
| page m,n | Предписывает компилятору формировать листинг, имеющий m строк на странице и n символов в каждой строке |
| <ип> proc [ near |far] | Отмечает начало процедуры с именем <ип> |
| <ип> endp | Отмечает конец процедуры с именем <ип> |
| public <ви>{,<ви>} | Информирует ассемблер о том, что имя <ви> должно быть доступно для других модулей |
| <ис> segment <параметры> | Отмечает начало сегмента с параметрами <параметры> (см. разд.3.3) |
| <ис> ends | Отмечает конец сегмента. |
Продолжение таблицы A.1
| 1 | 2 |
| title <текст> | Предписывает компилятору вверху каждой страницы листинга выводить <текст> |
ПРИЛОЖЕНИЕ B. КомаНдЫ
Таблица B. 1 Арифметические операции
| Код | Оп1 | Оп2 | Флаги | Примечание |
| 1 | 2 | 3 | 4 | 5 |
| adc | r r,m | r,m v | A,C,O, P,S,Z | Если флаг C=1, то Оп1:=Оп1+1, иначе - нет. Затем Оп1:=Оп1+Оп2. Операция используется при сложении многословных величин для учета бита переполнения в последующих фазах операции |
| add | r r,m | r,m v | A,C,O, P,S,Z | Оп1:=Оп1+Оп2 |
| cmp | r r,m | r,m v | A,C,O, P,S,Z | Сравнивает содержимое двух полей данных |
| dec | r,m | - | A,O,P,S,Z | Оп1:=Оп1-1 |
| div | r,m | - | A,C,O, P,S,Z | Беззнаковое деление. Если Оп1 - однобайтный, то AL:=AX/Оп1; AH:=AX mod Оп1. Если Оп1 - двухбайтный, то AX:=<DX:AX>/Оп1 и DX:=<DX:AX> mod Оп1 |
| idiv | r,m | - | A,C,O, P,S,Z | Знаковое деление. Выполняется аналогично команде div над знаковыми операндами |
Продолжение таблицы B.1
| 1 | 2 | 3 | 4 | 5 |
| imul | r,m | - | C,O | Знаковое умножение. Если Оп1 - однобайтный, то AX:=AL*Оп1. Если Оп1 - двухбайтный, то <DX:AX>:=AX*Оп1 |
| inc | r,m | - | A,O,P,S,Z | Оп1:=Оп1+1 |
| mul | r,m | - | Беззнаковое умножение. Если Оп1 - однобайтный, то AX:=AL*Оп1. Если Оп1 - двухбайтный, то <DX:AX>:=AX*Оп1 | |
| neg | r,m | - | A,C,O, P,S,Z | Изменяет знак числа на противоположный |
| sbb | r r,m | r,m v | A,C,O, P,S,Z | Если флаг C=1, то Оп1:=Оп1-1, иначе - нет. Затем Оп1:=Оп1-Оп2. Операция используется при сложении многословных величин |
| sub | r r,m | r,m v | A,C,O, P,S,Z | Оп1:=Оп1-Оп2 |
Таблица B. 2. Команды передачи управления
| Код | Переход, если | Примечание |
| 1 | 2 | 3 |
| call | -- | Вызов процедуры |
Продолжение таблицы B.2
| 1 | 2 | 3 |
| ja/jnbe | C=0, Z=0 | Переход по «выше» или «не ниже или равно» |
| jae/jnb | C=0 | Переход по «выше или равно» или «не ниже» |
| jb/jnae | C=1 | Переход по «ниже» или «не выше или равно» |
| jbe/jna | C=1 or A=1 | Переход по «ниже или равно» или «не выше» |
| jc | C=1 | Переход по переносу |
| jcxz | Регистр CX=0 | Переход по CX=0 |
| je/jz | Z=1 | Переход по «равно» или по «нулю» |
| jg/jnle | Z=0 and S=O | Переход по «больше» или «не меньше или равно» |
| jge/jnl | S=O | Переход по «больше или равно» или «не меньше» |
| jl/jnge | S O
| Переход по «меньше» или «не больше или равно» |
| jle/jng | Z=1 and S O
| Переход по «меньше или равно» или «не больше» |
| jmp | -- | Безусловный переход |
| jnc | C=0 | Переход, если нет переноса |
| jne/jnz | Z=0 | Переход по «не равно» или по «не ноль» |
| jno | O=0 | Переход, если нет переполнения |
| jnp/jpo | P=0 | Переход, если нет паритета или паритет нечетный |
| jns | S=0 | Переход, если нет знака |
| jo | O=1 | Переход по переполнению |
Продолжение таблицы B.2
| 1 | 2 | 3 |
| jp/jpe | P=1 | Переход, если есть паритет или паритет четный |
| js | S=1 | Переход, если есть знак |
| loop | CX 0
| CX:=CX-1; Затем, если CX 0, передает управление
|
| loope loopz | CX 0 and Z=1
| CX:=CX-1; Затем, если CX 0 и результат сравнения - ноль (равно), передает управление
|
| loopne loopnz | CX 0 and Z=0
| CX:=CX-1; Затем, если CX 0 и результат сравнения - не ноль (не равно), передает управление
|
Таблица B. 3. Команды загрузки и пересылки
| Код | Оп1 | Оп2 | Примечание |
| 1 | 2 | 3 | 4 |
| lea | r | m | Загружает адрес поля Оп2 в регистр Оп1 |
| lds | r | m | Загружает 4-байтовое значение из памяти Оп2 в регистр DS (2 байта) и в регистр Оп1 (2 байта) |
| les | r | m | Загружает 4-байтовое значение из памяти Оп2 в регистр ES (2 байта) и в регистр Оп1 (2 байта) |
| mov | r r,m | r,m v | Оп1:=Оп2 |
Таблица B. 4. Строковые операции
| Предикаты * | Код | Флаги | Примечание |
| 1 | 2 | 3 | 4 |
| repe, repz, repne, repnz | cmps | A,C,O, P,S,F | Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит побайтно, если в операндах указана ссылка на поле байт, или по словам, если - на массив слов |
| repe, repz, repne, repnz | cmpsb | A,C,O, P,S,F | Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит побайтно. Операндов нет |
| repe, repz, repne, repnz | cmpsw | A,C,O, P,S,F | Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит по словам. Операндов нет |
Продолжение таблицы B.4
| 1 | 2 | 3 | 4 |
| Lods | -- | Загружает из памяти, адресуемой регистровой парой DS:SI, байт в регистр AL, если в операнде имеется ссылка на байтовое поле, или слово в регистр AX, если в операнде имеется ссылка на массив слов | |
| lodsb | -- | Загружает из памяти, адресуемой регистровой парой DS:SI, байт в регистр AL. Операндов нет | |
| lodsw | -- | Загружает из памяти, адресуемой регистровой парой DS:SI, слово в регистр AX. Операндов нет |
Продолжение таблицы B.4
| 1 | 2 | 3 | 4 |
| rep | movs | -- | Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит побайтно, если в операндах указана ссылка на поле байт, или по словам, если в операндах имеется ссылка на массив слов |
| rep | movsb | -- | Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит побайтно. Операндов нет |
| rep | movsw | -- | Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит по словам. Операндов нет |
Продолжение таблицы B.4
| 1 | 2 | 3 | 4 |
| repe, repz, repne, repnz | scas | A,C,O, P,S,Z | Выполняет сравнение байта, адресуемого регистровой парой DS:SI, с содержимым регистра AL, если в операнде имеется ссылка на байтовое поле, или слова с содержимым регистра AX, если в операнде имеется ссылка на массив слов |
| repe, repz, repne, repnz | scasb | A,C,O, P,S,Z | Выполняет сравнение байта, адресуемого регистровой парой DS:SI, с содержимым регистра AL. Операндов нет |
| repe, repz, repne, repnz | scasw | A,C,O, P,S,Z | Выполняет сравнение слова, адресуемого регистровой парой DS:SI, с содержимым регистра AX. Операндов нет |
Продолжение таблицы B.4
| 1 | 2 | 3 | 4 |
| rep | stos | -- | Сохраняет в памяти, адресуемой регистровой парой DS:SI, байт из регистра AL, если в операнде имеется ссылка на байтовое поле, или слово из регистра AX, если в операнде имеется ссылка на массив слов |
| rep | stosb | -- | Сохраняет в памяти, адресуемой регистровой парой DS:SI, байт из регистра AL |
| rep | stosw | -- | Сохраняет в памяти, адресуемой регистровой парой DS:SI, слово из регистра AX |
Таблица B. 5 Операции над флагами.
| Код | Примечание |
| 1 | 2 |
| clc | Сброс флага переноса (C:=0) |
| cld | Сброс флага направления (D:=0) |
| cli | Сброс флага прерывания (I:=0) |
| cmc | Переключение флага переноса (C:=not C) |
| stc | Установка флага переноса (C:=1) |
Продолжение таблицы B.5
| 1 | 2 |
| std | Установка флага направления (D:=1). |
| sti | Установка флага прерывания (I:=1). |
Таблица B. 6 Команды работы со стеком.
| Код | Оп | Примечание |
| pop | r, m | Извлекает из стека слово и помещает в Оп |
| popa | -- | Извлекает из стека восемь слов и помещает в регистры DI, SI, BP, SP, BX, DX, CX, AX |
| popf | -- | Извлекает из стека слово и помещает в регистр флагов |
| push | r, m | Помещает слово из Оп в стек |
| pusha | -- | Помещает в стек восемь слов из регистров AX, CX, DX, BX, SP, BP, SI, DI |
| pushf | -- | Помещает в стек содержимое регистра флагов |
Таблица B. 7 Побитовые логические операции.
| Код | Оп1 | Оп2 | Флаги | Примечание |
| 1 | 2 | 3 | 4 | 5 |
| and | r r, m | r, m v | C, O, P, S, Z | Выполняет поразрядную конъюнкцию двух операндов Оп1:=Оп1 & Оп2 |
| not | r, m | -- | -- | Выполняет поразрядную инверсию Оп1:=ØОп1 |
Продолжение таблицы B.7
| 1 | 2 | 3 | 4 | 5 |
| or | r r, m | r, m v | C, O, P, S, Z | Выполняет поразрядную дизъюнкцию двух операндов Оп1:=Оп1 Ú Оп2 |
| test | r r, m | r, m v | C, O, P, S, Z | Выполняет проверку байта или слова на определенную битовую комбинацию. Действует, как команда and, но не изменяет операнда. |
| xor | r r, m | r, m v | C, O, P, S, Z | Выполняет поразрядное сложение по модулю 2 Оп1:=ØОп1&Оп2 Ú Оп1&ØОп2 |
библиографический список
1. Абель П. Язык Ассемблера для IBM PC и программирования / Пер. с англ. Ю.В. Сальникова. М.: Высш. шк., 1992. 447 с.
2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ. / Предисл. Н.В. Гайского. М.: Финансы и статистика, 1992. 544 с.
3. Каган Б.М. Электронные вычислительные машины и системы: Учеб. пособие для вузов. М.: Энергоатомиздат, 1985. 552 с.
4. Орловский Г.В. Введение в архитектуру микропроцессора 80386. - С.-Пб.: Сенанс-Пресс LTD, 1992. 240 с.
Оглавление
Введение.................................................................................... 3
Работа 1. Системы счисления................................... 4
1.1. Позиционные системы счисления................................ 4
1.2. Двоичная арифметика...................................................... 5
1.3. Прямой, обратный и дополнительный коды................ 5
1.4. Формы представления чисел в ЭВМ.............................. 7
1.5. Задания для самостоятельной работы......................... 8
Работа 2. Адресация памяти..................................... 10
2.1. Адресные структуры........................................................ 10
2.2. Способы адресации......................................................... 10
Подразумеваемый операнд................................................... 11
Непосредственная адресация.............................................. 11
Прямая адресация................................................................. 11
Относительная адресация или базирование...................... 11
Укороченная адресация........................................................ 11
Регистровая адресация........................................................ 11
Автоинкрементная (автодекрементная) адресация........ 11
2.3. Особенности адресации памяти процессором семейства Intel 80x86 (реальный режим) 11
Сегментация памяти........................................................... 11
Регистровая адресация........................................................ 12
Формирование адресного кода............................................ 14
2.4. Задания для самостоятельной работы....................... 15
Работа 3. Форматы команд и структура программы 17
3.1. Кодирование команд...................................................... 17
3.2. Формат команд языка Assembler................................ 17
3.3. Основные директивы компилятора............................. 18
Директива SEGMENT....................................................... 18
Директива GROUP.............................................................. 20
Директива ASSUME........................................................... 20
Директивы определения данных.......................................... 21
Директива EQU................................................................... 22
Директива PROC................................................................. 22
Директивы EXTRN и PUBLIC......................................... 22
Директива END................................................................... 23
3.4. Мнемонические команды............................................. 23
3.5. Структура программы..................................................... 24
Структура и инициализация EXE-программ..................... 24
Структура и инициализация COM-программ.................... 25
3.6. Задания для самостоятельной работы....................... 26
Работа 4. Арифметические операции................. 30
4.1. Форматы и назначение команд.................................... 30
Сложение двоичных чисел (ADD)....................................... 30
Вычитание двоичных чисел (SUB)..................................... 30
Сложение с переносом (ADC)............................................. 30
Вычитание с заемом (SBB)................................................. 30
Умножение (MUL)............................................................... 30
Деление (DIV)........................................................................ 31
Знаковое умножение и знаковое деление (IMUL и IDIV) 31
Инкремент (INC)................................................................. 31
Декремент (DEC)................................................................. 31
Сравнение (CMP).................................................................. 32
4.2. Отображение арифметических значений (пример программы) 32
4.3. Задания для самостоятельной работы....................... 33
Работа 5. Команды передачи управления...... 35
5.1. Команды перехода........................................................... 35
Безусловный переход (JMP)................................................. 35
Условный переход (Jnnn).................................................... 36
5.2. Команды организации цикла........................................ 37
Команда (LOOP).................................................................. 37
Команда проверки регистра CX (JCXZ)........................ 38
5.3. Вызов процедуры.............................................................. 38
Команда вызова процедуры (CALL).................................. 38
Команда возврата из процедуры (RET)............................ 38
5.4. Задания для самостоятельной работы....................... 39
Работа 6. Обработка строковых данных......... 41
6.1. Команды пересылки........................................................ 41
Пересылка байтов (MOVSB)............................................. 41
Пересылка слов (MOVSW).................................................. 41
Пересылка байтов или слов (MOVS)................................. 42
Загрузка байта/слова (LODSB/LODSW)............................. 42
Загрузка байта или слова (LODS)...................................... 43
Запись байта/слова (STOSB/STOSW).................................. 43
Запись байта или слова (STOS).......................................... 43
6.2. Команды сравнения........................................................ 43
Сравнение байтов (CMPSB).............................................. 44
Сравнение слов (CMPSW)................................................... 44
Сравнение байтов или слов (CMPS).................................. 44
Сканирование строки (SCASB/SCASW/SCAS).................... 44
6.3. Задания для самостоятельной работы....................... 47
ПРИЛОЖЕНИЕ A. Директивы.......................................... 49
ПРИЛОЖЕНИЕ B. КомаНдЫ.............................................. 51
библиографический список.................................... 58
Лицензия №0243 от 20.01.99 г.
Подписано в печать 14.05.2000 Формат 60x84 1/16.
Бумага писчая. Печать RISO. 6,5 усл.печ.л.
Тираж 100 Заказ 153
Издательство Казанского математического общества.
420008, Казань, Университетская, 17.
Офсетная лаборатория Нижнекамского химико-технологического института.
423550, Нижнекамск, пр. Строителей, 47
* Предикаты повторения, если они есть, требуют выполнения команды, пока счетчик CX0 и выполняется условие, определенное предикатом. При этом происходит автоматическое увеличение индексных регистров SI и/или DI, если флаг направления D =0, и происходит их уменьшение, если D =1.
|
|
|
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
© cyberpedia.su 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!