61. типы данных интеловских процессоров
61. ТИПЫ ДАННЫХ ИНТЕЛОВСКИХ ПРОЦЕССОРОВ
Основными типами данных в компьютерах интеловской архитектуры являются: байт, слово, двойное слово, квадрослово и 128-разрядное слово (рис. 2.2).
Каждый из представленных на рис. 2.2 типов данных может начинаться с любого адреса: это означает, что слово не обязано начинаться с чётного адреса; двойное слово – с адреса, кратного 4 и т.д. Таким образом достигается максимальная гибкость структур данных и эффективность использования памяти.
На базе основных типов данных строятся все остальные типы, распознаваемые командами процессора.
Целочисленные данные
Четыре формата данных (байт, слово, двойное слово, учетверенное слово) с фиксированной точкой могут быть как со знаком, так и без знака. Под знак отводится старший бит формата данных. Представление таких данных и выполнение операций в арифметико-логическом устройстве (ALU) производится в дополнительном коде.
Байт
Слово
Двойное слово
Квадро-
слово
байт
Адрес N
0
младший байт
Адрес N
0
7
старший байт
Адрес N+1
15
31
15
0
младшее слово
старшее слово
Адрес N+2
Адрес N
Адрес N+1
Адрес N+3
Адрес N+8
Адрес N
Адрес N+7
Адрес N+15
Адрес N+2
Адрес N
Адрес N+1
Адрес N+3
63
31
0
младшее двойное слово
старшее двойное слово
127
63
0
младшее квадро слово
старшее квадро слово
128-разрядное слово
7
Рис. 2.2. Основные типы данных
Данные в формате с плавающей точкой х87
Формат включает три поля: Знак (S), Порядок и Мантисса (рис. 2.3). Поле мантиссы содержит значащие биты числа, а поле порядка содержит степень 2 и определяет масштабирующий множитель для мантиссы. Форматы данных поддерживаются блоком обработки чисел с плавающей точкой (FPU).
Рис. 2.3. Форматы данных с плавающей точкой
Двоично-десятичные данные (BCD)
На рис. 2.4 приведены форматы двоично-десятичных данных.
Рис. 2.4. Форматы двоично-десятичных данных
Данные типа строка
Строка представляет собой непрерывную последовательность бит, байт, слов или двойных слов (рис. 2.5). Строка бит может быть длиной до 1 Гбита, а длина остальных строк может составлять от 1 байта до 4 Гбайтов. Поддерживается АLU.
Рис. 2.5. Данные типа строка
Символьные данные
Поддерживаются строки символов в коде ASCII и арифметические операции (сложение, умножение) над ними (рис. 2.6). Поддержка осуществляется блоком АLU.
| 7 + N 0 | | 7 + 1 0 | 7 0 0 | |
| Символ N | … | Символ 1 | Символ 0 | ASCII |
| ASCII | | ASCII | ASCII | |
Рис. 2.6. Символьные данные
Данные типа указатель
Указатель содержит величину, которая определяет адрес фрагмента данных. Поддерживается два типа указателей, приведенных на рис. 2.7.
4 | 7 +5 | + 4 | + 3 | + 2 | + 1 | 0 | 0 | | |
| | | | | | | | Длинный указатель (дальний) | |
| | | | | | | | | |
| селектор 16 р. | смещение 32 р. | | | |||||
| | 3 | 1 + 3 | + 2 | + 1 | 0 | 0 | | |
| | | | | | | | Короткий указатель (ближний) | |
| | | | | | | | | |
| | | смещение 32 р. | | |
Рис. 2.7. Данные типа указатель
Данные ММХ-технологии
Целочисленные данные могут быть как со знаком, так и без знака (рис. 2.8).
Данные
Данные 1
Данные 0
Данные 3
Данные 2
Данные 1
Данные 0
64-разрядное слово
Упакованные 2 двойных слова
Упакованные 4 слова
Упакованные 8 байт
47
31
15
0
63
Рис. 2.8. Данные ММХ-технологии
Данные SSE-расширения
На рис. 2.9 приведен 128-разрядный формат упакованных данных с плавающей точкой одинарной точности.
Рис. 2.9. Данные SSE-расширения
Данные расширения SSE2
На рис. 2.10 приведен 128-разрядный формат упакованных данных с плавающей точкой с двойной точностью.
Рис. 2.10. Данные SSE2 расширения с плавающей запятой
На рис. 2.11 показаны 4 формата упакованных в 128 бит целочисленных данных, которые могут быть как со знаком, так и без знака.
127
Данные
Данные 1
Данные 0
Данные 3
Данные 2
Данные 1
Данные 0
128-разрядное слово
Упакованные 2 64-разрядных слова
Упакованные 4 двойных слова
Упакованные 8 слов
Упакованные 16 байт
95
63
31
0
Рис. 2.11. Целочисленные данные SSE2 расширения
Данные в IA-64
В IA-64 непосредственно поддерживается 6 типов данных, в том числе три формата, используемых ранее (одинарная точность, двойная точность, расширенная точность), 82-разрядный формат данных с плавающей точкой (рис. 2.12) и 64-разрядные целые – со знаком и без знака.
-
81
63 0
S
Порядок 17 р.
Мантисса
Рис. 2.12. Формат данных с плавающей точкой 82-разрядный
62. СТРУКТУРА И ФОРМАТЫ КОМАНД ЭВМ
Команда представляет собой код, определяющий операцию и данные, участвующие в операции.
По характеру выполняемых операций различают следующие основные группы команд:
а) команды арифметических операций над числами с фиксированной и плавающей точками;
б) команды десятичной арифметики;
в) команды логических операций и сдвигов;
г) команды передачи кодов;
д) команды операций ввода/вывода;
е) команды передачи управления;
ж) команды векторной обработки;
з) команды задания режима работы машины и др.
Команда в общем случае состоит из операционной и адресной частей (рис. 2.14, а).
В свою очередь, эти части, что особенно характерно для адресной части, могут состоять из нескольких полей.
Операционная часть содержит код операции (КОП), который задает вид операции (сложение, умножение и др.). Адресная часть содержит информацию об адресах операндов и результате операции.
Структура команды определяется составом, назначением и расположением полей в команде.
Форматом команды называют ее структуру с разметкой номеров разрядов (бит), определяющих границы отдельных полей команды, или с указанием числа бит в определенных полях.
Важной и сложной проблемой при проектировании ЭВМ является выбор структуры и форматов команды, т.е. ее длины, назначения и размерности отдельных ее полей. Естественно стремление разместить в команде в возможно более полной форме информацию о предписываемой командой операции. Однако в условиях, когда в современных ЭВМ значительно возросло число выполняемых различных операций и соответственно команд (в системе команд х86 более 500 команд) и значительно увеличилась емкость адресуемой основной памяти (4 Гбайт, 6 Гбайт), это приводит к недопустимо большой длине формата команды.
Действительно, число двоичных разрядов, отводимых под код операции, должно быть таким, чтобы можно было представить все выполняемые машинные операции. Если ЭВМ выполняет М различных операций, то число разрядов в коде операции
nкоп і log2 М; например, при М = 500 nкоп = 9.
Если основная память содержит S адресуемых ячеек (байт), то для явного представления только одного адреса необходимо в команде иметь адресное поле для одного операнда с числом разрядов
nА і log2 S; например, при S = 4 Гбайт nА = 32.
Отмечавшиеся ранее, характерные для процесса развития ЭВМ расширение системы (наборы) команд и увеличение емкости основной памяти, а особенно создание микроЭВМ с коротким словом, потребовали разработки методов сокращения длины команды. При решении этой проблемы существенно видоизменилась структура команды, получили развитие различные способы адресации информации.
Проследим изменения классических структур команд.
Чтобы команда содержала в явном виде всю необходимую информацию о задаваемой операции, она должна, как это показано на рис. 2.14, б, содержать следующую информацию:
А1, А2 – адреса операндов, А3 – адрес результата, А4 – адрес следующей команды (принудительная адресация команд).
Такая структура приводит к большой длине команды (например, при М = 500, S = 4 Гб длина команды – 137 бит) и неприемлема для прямой адресации операндов основной памяти. В компьютерах с RISC-архитектурой четырехадресные команды используются для адресации операндов, хранящихся в регистровой памяти процессора.
Можно установить, что после выполнения данной команды, расположенной по адресу К (и занимающей L ячеек), выполняется команда из (К + L)-й ячейки. Такой порядок выборки команды называется естественным. Он нарушается только специальными командами передачи управления. В таком случае отпадает необходимость указывать в команде в явном виде адрес следующей команды.
В трехадресной команде (рис. 2.14, в) первый и второй адреса указывают ячейки памяти, в которых расположены операнды, а третий определяет ячейку, в которую помещается результат операции.
Можно условиться, что результат операции всегда помещается на место одного из операндов, например первого. Получим двухадресную команду (рис. 2.14, г), т.е. для результата используется подразумеваемый адрес.
В одноадресной команде (рис. 2.14, д) подразумеваемые адреса имеют уже и результат операции, и один из операндов. Один из операндов указывается адресом в команде, в качестве второго используется содержимое регистра процессора, называемого в этом случае регистром результата, или аккумулятором. Результат операции записывается в тот же регистр.
Наконец, в некоторых случаях возможно использование безадресных команд (рис. 2.14, е), когда подразумеваются адреса обоих операндов и результата операции, например при работе со стековой памятью.
в
Операционная часть
Адресная часть
Код
операции
а
КОП
б
А1
А1
А2
А3
А4
КОП
А1
А2
А3
КОП
КОП
г
д
е
КОП
А2
А1
Рис. 2.14. Структуры команд:
а – обобщенная; б – четырехадресная; в – трехадресная;
г – двухадресная; д – одноадресная; е – безадресная
СПОСОБЫ АДРЕСАЦИИ ИНФОРМАЦИИ В ЭВМ
Следует различать понятия адресный код в команде АR и исполнительный (физический адрес) адрес АИ.
Адресный код — это информация об адресе операнда, содержащаяся в команде.
Исполнительный адрес — это номер ячейки памяти, к которой производится фактическое обращение.
Таким образом, способ адресации можно определить как способ формирования исполнительного адреса операнда АИ.по адресному коду команды АК.
В системах команд современных ЭВМ часто предусматривается возможность использования нескольких способов адресации операндов для одной и той же операции. Для указания способа адресации в некоторых системах команд выделяется специальное поле в команде — поле «метод» (указатель адресации УА), рис.2.3, а.
В этом случае любая операция может выполняться с любым способом адресации, что значительно упрощает программирование.
Классификация способов адресации по наличию адресной инф-ции в команде.
явная адресация
неявная адресация.
При явной адресации операнда в команде есть поле адреса этого операнда, в котором задается адресный код АК. Большинство методов адресации являются явными.
При неявной адресации адресное поле в команде отсутствует, адрес операнда подразумевается кодом операции.
Классификация способов адресации по кратности обращения в память.
Широко используются следующие методы адресации операнда с различной кратностью обращения (r) в память:
1. Непосредственная (r = 0)
2. Прямая (r = 1)
3. Косвенная (r і 2)
Непосредственная адресация операнда.
Обращение к регистровой памяти (РП) или ОП не производится (R = 0). Таким образом уменьшается время выполнения операции, сокращается объем памяти.
Прямая адресация операндов.
При этом способе (рис.2.5) адресации обращение за операндом в РП или ОП производится по адресному коду в поле команды, т.е. исполнительный адрес операнда совпадает с адресным кодом команды (АИСП. = АК). Обеспечивая простоту программирования, этот метод имеет существенные недостатки, так как для адресации к ячейкам памяти большой емкости требуется «длинное» адресное поле в команде.
Косвенная адресация операндов.
Адресный код команды указывает адрес ячейки памяти, в которой находится не сам операнд, а лишь адрес операнда, называемый указателем операнда. Адресация к операнду через цепочку указателей (косвенных адресов) называется косвенной.
Адрес указателя - остается неизменным, а косвенный адрес может изменяться в процессе выполнения программы. Это обеспечив переадресацию данных, т.е. упрощает обработку массивов и списковых структур данных, упрощает передачу параметров подпрограммам, но не обеспеч перемещаемость программ в памяти. (рис. 2.6 а)
64. ПРИНЦИПЫ ОРГАНИЗАЦИИ СИСТЕМЫ ПРЕРЫВАНИЯ ПРОГРАММ
Для оценки эффективности систем прерывания могут быть использованы следующие характеристики.1. Общее число запросов прерывания (входов в систему прерывания).
2. Время реакции — время между появлением запроса прерывания и моментом прерывания текущей программы.
Для одного и того же запроса задержки в исполнении прерывающей программы зависят от того, сколько программ со старшим приоритетом ждут обслуживания, поэтому время реакции определяют для запроса с наивысшим приоритетом (tP).
Время реакции зависит от того, в какой момент допустимо прерывание. Большей частью прерывание допускается после окончания текущей команды. В этом случае время реакции определяется в основном длительностью выполнения команды
Это время реакции может оказаться недопустимо большим для ЭВМ, предназначенных для работы в реальном масштабе времени. В таких машинах часто допускается прерывание после любого такта выполнения команды (микрокоманды). Однако при этом возрастает количество информации, подлежащей запоминанию и восстановлению при переключении программ, так как в этом случае необходимо сохранять также и состояние счетчика тактов, регистра кода операции и некоторых других узлов. Такая организация прерывания возможна только в машинах с быстродействующей сверхоперативной памятью.
Рис.3.15. Упрощенная временная диаграмма процесса прерывания
Имеются ситуации, в которых желательно немедленное прерывание. Если аппаратура контроля обнаружила ошибку, то целесообразно сразу же прервать операцию, пока ошибка не оказала влияние на следующие такты работы программы.
3. Затраты времени на переключение программ (издержки прерывания) равны суммарному расходу времени на запоминание и восстановление состояния программы
tизд= t3 + tв.
4. Глубина прерывания – максимальное число программ, которые могут прерывать друг друга. Если после перехода к прерывающей программе и вплоть до ее окончания прием запросов прекращается, то говорят, что система имеет глубину прерывания, равную 1. Глубина равна n, если допускается последовательное прерывание до n программ. Глубина прерывания обычно совпадает с числом уровней приоритета в системе прерыванияСистема с большим значением глубины прерывания обеспечивает более быструю реакцию на срочные запросы.Если запрос окажется не обслуженным к моменту прихода нового запроса от того же источника, то возникает так называемое насыщение системы прерывания.В этом случае предыдущий запрос от данного источника будет машинально утерян, что недопустимо.
Регистровые структуры центрального процессора IA-32.
80386 имеет 32 программно-доступных регистра.
Подразделить их можно на следующие категории:
регистры общего назначения;
регистры сегментации;
регистр флагов;
регистры управления;
регистры системного адреса;
регистр тестов;
регистр отладки.
Эти регистры являются также набором регистров процессоров Intel 8086 и Intel 80286, поэтому все 16-и разрядные регистры процессоров более ранних выпусков "покрываются" 32-х разрядными регистрами 80386-го процессора.
Регистры базовой архитектуры микропроцессора включают:
A)регистры общего адреса и данных Б)указатель команд В)регистр флагов.
Данные регистры при включении новой задачи загружаются новым содержимым. Базовая архитектура содержит 6 прямо доступных сегмента, каждый размером до 4 Гбайт. Сегменты указываются значениями селектора, помещенными в регистр сегмента.
Другой тип регистров – это регистры управления, системного адреса, отладки и тестов. Они используются для отладки операционных систем.
Регистры отладки и тестовые регистры
Регистры отладки. Шесть доступных для программиста регистров отладки обеспечивают поддержку (на кристалле) отладки. Регистр отладки CRO-3 классифицирует четыре линейных останова. Другой из них DR6 используется для установки точек останова и регистра статуса отладки DR7, а также отображает текущее состояние точек останова.
Регистры общего назначения (РОН)
Микропроцессор Intel 80386 имеет 8-м 32-х разрядных регистров общего назначения. Они поддерживают 16, 32-х разрядные адресные операнды, 1, 8, 16, 32, 64 операнды данных и битовые поля от 1 до 32 битов. Они называются: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Младшие 16 разрядов каждого регистра могут использоваться по отдельности, они называются: AX, BX, CX, DX, SI, DI, BP, SP. Также могут индивидуально использоваться младший (0-7) и старший (8-15) байты РОН AX, BX, CX, DX, соответственно их называют: AL, BL, CL, DL и AH, BH, CH, DH.
Указатель команд (IP)
Регистр указателя команд представляет собой 32-х разрядный регистр, который называют EIP. Он содержит смещение следующей команды, которую нужно выполнить. Смещение всегда определяется относительно сегмента кода. Его младшие 16 бит называются IP и используются при шестнадцатиразрядной адресации.
Регистр флагов
Регистр флагов является 32-х разрядным и называется EFLAGS. Определенные биты EFLAGS управляют некоторыми операциями и подчеркивают статус 80386. Младшие 16-ть разрядов EFLAGS представляют собой регистр FLAGS, который может использоваться при выполнении операций с 8086. Неопределенные биты являются зарезервированными, т. е. в настоящий момент они не имеют значения, однако могут быть использованы для специальных целей в последующих версиях микропроцессора. Все флаги младшего байта регистра устанавливаются арифметическими или логическими операциями процессора.
Сегментные регистры
Шесть 16-ти разрядных сегментных регистров содержат базовые адреса сегментов, определяющие сегменты памяти текущей адресации. В защищенном режиме, каждый сегмент может иметь размеры от одного байта до целого линейного и физического пространства машины до 4Гб в режиме реальной адресации, максимальный размер сегмента ограничен на 64Кб. Шесть сегментов, адресуемых в любой данный момент, определяются содержимым регистров CS, SS, DS, ES, FS и GS. Значение в CS указывает на текущий сегмент кода, содержимое SS указывает текущий сегмент стека, а значения в DS, ES, FS, GS на сегменты данных.
Регистры дескриптора сегмента
Регистры дескриптора сегмента невидимы для программиста. В 80386, регистр дескриптора невидимый для программиста соотнесен с каждым видимым регистром селектора. Каждый из них содержит 32-х битовый базовый адрес сегмента, его границу (предел) и другие необходимые признаки сегмента. Когда адрес сегмента загружается в сегментный регистр, ассоциативный (соотнесенный) регистр дескриптора автоматически модифицируется в соответствии с новой информацией. В защищенном режиме базовый адрес, граница, все признаки модифицируются содержимым регистра дескриптора сегмента, индексированного селектором. Каждый раз, когда происходит ссылка на ячейку памяти, регистр дескриптора сегмента, автоматически вовлекается ссылкой на ячейку памяти. 32-х битовый базовый адрес сегмента становится компонентом вычисления линейного адреса, 32-х битовое значение границы используется для операций контроля границы, а признаки проверяются на соответствие типу ссылки на ячейку памяти, которая запрашивается.
Управляющие регистры
Три управл. регистра по 32 бита: CR0, CR2 и CR3. Наряду с регистрами системного адреса поддерживают состояние машины и воздействуют на все задачи в системе.
Регистры системного адреса
Четыре специальных регистра существуют для обращения к таблицам или сегментам, поддерживаемыми 80286/80386 моделью защиты. Данные таблицы или сегменты следующие: GDT (таблица глобального дескриптора), IDT (таблица дескриптора прерывания), LDT (таблица локального дескриптора), TSS (сегмент состояния задачи). Адреса данных таблиц и сегментов помещены в память специальных регистров: регистров системного адреса и регистров системного сегмента. Называются данные регистры соответственно GDTR, IDTR, LDTR, TR.Регистровые структуры центрального процессора х86-64, IA-64.
Регистры IA-64
В состав регистровых файлов IA-64 входят: 128 регистров общего назначения GPR (64-разрядных); 128 регистров с плавающей запятой FR (82-разрядных); 128 прикладных регистров (в основном 64-разрядных) AR; 64 одноразрядных регистров предикатов PR; 8 регистров переходов BR(64-разрядных);не менее 4-х регистров идентификатора процесса CPUID; счетчик команд IP; регистр маркера текущего окна CFM стека регистров и др.
Регистры CPUID являются 64-разрядными. В CPUID-регистрах 0 и 1 лежит информация о производителе, в регистре 2 находится серийный номер процессора, а в регистре 3 задается тип процессора (семейство, модель, версия архитектуры и т.п.) и число CPUID-регистров. Разряды регистра 4 указывают на поддержку конкретных особенностей IA-64, т.е. тех, которые реализованы в данном процессоре.
Прикладные регистры AR0-AR127 - специализированные (в основном 64-разрядные) регистры, применяемые в IA-64 и IA-32. AR0-7 называются регистрами ядра; запись в них привилегированна, но они доступны на чтение в любом приложении и используются для передачи приложению сообщений от операционной системы.
Среди других прикладных регистров укажем на AR16 (RSC) - регистр конфигурации стека регистров, используемый для управления работой "машиной" стека регистров IA-64 (RSE); AR17 (BSP), в котором находится адрес в памяти, где сохраняется положение GR32 в текущем окне стека; AR40 (FPSR) - регистр состояния для команд с плавающей запятой IA-64; AR44 (ITC) - интервальный таймер; AR64 (PFS) - регистр предыдущего состояния функции, куда автоматически копируются некоторые другие регистры при вызове подпрограмм; AR65 (LC), используемый для организации циклов со счетчиком, и, наконец, 6-разрядный регистр эпилога AR66 (EC). Ряд AR-регистров является фактически регистрами IA-32 (дескриптор сегмента кодов, дескриптор сегмента стека)
64-разрядные регистры GR0-127 применяются не только для целочисленных операций IA-64; GR8-31 в режиме IA-32 используются также под целочисленные регистры и регистры селекторов и дескрипторов сегментов IA-32.
GR0-31 называются статическими регистрами (GR0 всегда содержит 0), а GR32-127 - стекируемыми регистрами. Статические регистры "видны" всем программам. Стекируемые регистры становятся доступными в программной единице через окно стека регистров, включающее локальные и выходные регистры, число которых задается командой alloc.
82-разрядные регистры с плавающей запятой FR0-127 также подразделяются на статические (FR0-31, причем всегда FR0=0.0, FR1=1.0) и вращаемые (FR32-127). FR8-31 в режиме IA-32 содержат числа с плавающей запятой и мультимедийные регистры.
Вращение регистров является в некотором роде частным случаем переименования регистров, применяемого во многих современных суперскалярных процессоров с внеочередным спекулятивным выполнением команд. В отличие от них, вращение регистров в IA-64 управляется программно.
64-разрядные регистры переходов BR0-7 применяются для указания адреса перехода в соответствующих командах перехода (если адрес перехода не кодируется в команде явно). Регистры предикатов PR0-63 являются одноразрядными; в них помещаются результаты команд сравнения. Обычно эти команды устанавливают сразу два регистра PR в зависимости от условия - соответственно истинность условия и его отрицания. Такая избыточность обеспечивает дополнительную гибкость.
Регистры х86-64
В процессорах x86-64 архитектуры (Hammer, Athlon 64, Opteron) существующие в х86 регистры общего назначения (GPR) расширены с 32 до 64 бит (см. рис. 3.7) и к ним добавлены еще 8 новых 64-разрядных регистров (R8 – 15). Также 8 новых регистров (XMM8 – 15) добавлено в блок SSE, что обесп
ечивает поддержку SSE-2.
В блоке FPU используются существующие в х87 регистры данных (80-разрядные).
Регистр указателя команд (EIP) также расширен до 64 разрядов.
Регистровые расширения - это один из самых больших шагов в развитии архитектуры, пару десятков лет просуществовавшей на восьми регистрах общего назначения. Новый REX-префикс делает доступными 8 новых регистров общего назначения (R8 - R15) и 8 новых регистров SSE (XMM8 - XMM15), а также расширения всех РОН до 64 бит.
Без префикса REX размер операнда по умолчанию для большинства команд - 32 бит. Это даёт доступ к регистрам EAX, EBX, ECX, EDX, EDI, ESI, EBP и ESP. Исключение составляют две группы команд, которые будут рассмотрены ниже. Чтобы получить доступ к полному 64-битному операнду (RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP) и новым регистрам R8 - R15, команда должна содержать префикс REX.
Также префикс REX обеспечивает новую способность регистров, делая доступным младший значащий байт, слово или двойное слово любого регистра общего назначения для операций (см. рис. 2). При этом команда операции над байтами не может одновременно использовать старший байт наследованных 16-разрядных регистров (ah, bh, ch, dh) и новый байтовый регистр. Эта возможность предоставляет компилятору единообразный набор 1-, 2-, 4- и 8-байтовых регистров для более удобного и эффективного распределения данных в регистрах.
Для кодирования префикса REX использованы коды 40h - 4Fh2. Эти коды трактуются в 32-битном режиме как однобайтные инструкции INC (40h - 47h) и DEC (48h - 4Fh) над 32-разрядными регистрами EAX - ESP.
страница 1страница 2страница 3
скачать
Другие похожие работы: