Жанр: Учеба

Ассемблер и программирование для IBM PC

сторінка №34

тр/память) совместно с битами mod определяют
способ адресации, как показано на рис.25.2.

__________________________________________________________________________

r/m mod=00 mod=01 mod=10 mod=1.1 mod=11
w=0 w=1
000 BX+SI BX+SI+disp BX+SI+disp AL AX
001 BX+DI BX+DI+disp BX+DI+disp CL CX
010 BP+SI BP+SI+disp BP+SI+disp DL DX
011 BP+DI BP+DI+disp BP+DI+disp BL BX
100 SI SI+disp SI+disp AH SP
101 DI DI+disp DI+disp CH BP
110 Direct BP+disp BP+disp DH SI
111 BX BX+disp BX+disp BH DI
__________________________________________________________________________

Рис.25.2. Биты r/m

ДВУХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________

Рассмотрим пример сложения содержимого регистров BХ и АХ:

ADD BX,AX 0000 0011 11 011 000
dw mod reg r/m

d 1 означает, что биты reg и w описывают операнд 1 (BХ), а биты
mod, r/m и w - Операнд 2 (АХ);
w 1 определяет размер регистров в одно слово,
mod 11 указывает, что операнд 2 является регистром;
reg 011 указывает, что операнд 1 является регистром BХ;
r/m 000 указывает, что операнд 2 является регистром AX.

Рассмотрим пример умножения регистра AL на регистр BL:

MUL BL 11110110 11 100 011
w mod reg r/m

Команда MUL предполагает, что регистр AL содержит множимое. Размер
регистра равен одному байту (w = 0), mod указывает на регистровую
операцию, г/m = 011 указывает на регистр BL. В данном случае reg = 100 не
имеет смысла.

ТРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________

Следующая команда MOV генерирует три байте машинного кода:

MOV mem,AX 10100001 dddddddd dddddddd

Для команды пересылки из регистра АХ или AL необходимо знать, сколько
байтов участвует в операции: один или два. В данном примере w = 1 означает
слово, следовательно, предполагается 16-битовый регистр АХ. Использование
во втором операнде регистра AL приведет к значению бита w = 0. Байты 2 и 3
содержат относительный адрес памяти. Команды, использующие регистры АХ или
AL, часто генерируют более эффективный (короткий) машинный код.

ЧЕТЫРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________

Рассмотрим пример умножения регистра AL на значение в памяти.
Процессор предполагает, что множимое находится в регистре AL для
однобайтового умножения и в регистре АХ для Двухбайтового умножения:

MUL mem_byte 11110110 00 100 110
w mod reg r/m

Для данной команды reg всегда имеет значение 100, mod = 00 указывает на
операцию с памятью, a r/m=110 - на прямой способ адресации. Машинная
команда также содержит два следующих байта, определяющих относительный
адрес памяти.
Рассмотрим еще один пример, иллюстрирующий команду LEA, которая
всегда специфицирует двухбайтовый адрес:

LEA DX,mem 10001101 00 010 110
LEA mod rеg r/m

Reg =010 означает регистр DX. Mod =00 и r/m=110 определяют прямой
способ адресации памяти. В следующих двух байтах содержится относительный
адрес.

КОМАНДЫ В АЛФАВИТНОМ ПОРЯДКЕ
________________________________________________________________

В данном разделе представлен набор команд Ассемблера в алфавитном
порядке. Некоторые команды, например сдвиг и циклический сдвиг, для
краткости сгруппированы. Ряд специальных команд для процессоров 80186,
80286 и 80386 выходят за рамки данной книги и поэтому в данной главе также
отсутствуют. При пояснении команд и способов адресации используются
следующие сокращения:

addr адрес памяти;
addr-high первый байт адреса (старший);
addr-low левый (младший) байт. адреса;
data непосредственный операнд (8 бит при w=0 и 16 бит при w= 1);
data-high правый (старший) байт непосредственного операнда;
data-low левый (младший) байт непосредственного операнда;
disp смещение (относительный адрес);
rеg ссылка на регистр.

AAA: Коррекция ASCII-формата для сложения
-------------------------------------------
О п е р а ц и я: Корректирует сумму двух ASCII-байтов в регистре AL.
Если правые четыре бита регистра AL имеют значение больше 9 или флаг AF
установлен в 1, то команда AAA прибавляет к регистру АН единицу и
устанавливает флаги AF и CF. Команда всегда очищает четыре левых бита в
регистре AL.

Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF, PF, SF и
ZF не определены).

О б ъ е к т н ы й к о д: 00110111 (без операндов).

AAD: Коррекция ASCII-формата для деления
------------------------------------------
О п е р а ц и я: Корректирует ASCII-величины для деления. Команда AAD
используется перед делением неупакованных десятичных чисел в регистре АХ
(удаляет тройки ASCII-кода). Эта команда корректирует делимое в двоичное
значение в регистре AL для последующего двоичного деления. Затем умножает
содержимое регистра АН на 10. прибавляет результат к содержимому регистра
AL и очищает АН. Команда AAD не имеет операндов.

Ф л а г и: Команда воздействует на флаги PF, CF, ZF (флаги AF CF и OF
не определены).

О б ъ е к т н ы й к о д: |11010101|00001010|.

AАМ: Коррекция ASCII-формата для умножения
--------------------------------------------
О п е р а ц и я: Команда AAM используется для коррекции результата
умножения двух неупакованных десятичных чисел. Команда делит содержимое
регистра AL на 10, записывает частное в регистр АН, а остаток в регистр
AL.

Ф л а г и: Команда воздействует на флаги PF, SF и ZF (флаги AF CF и
OF не определены).

О б ъ е к т н ы й к о д: |11010100|00001010| (без операндов).

AAS: Коррекция ASCII-формата для вычитания
--------------------------------------------
О п е р а ц и я: Корректирует разность двух ASCII-байтов в регистре
AL. Если первые четыре бита имеют значение больше 9 или флаг CF установлен
в 1, то команда AAS вычитает 6 из регистра AL и 1 из регистра АН, флаги AF
и CF при этом устанавливаются в 1. Команда всегда очищает левые четыре
бита в регистре AL.

Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF PF SF и ZF
не определены).


О б ъ е к т н ы й к о д: 00111111 (без операндов).

ADC: Сложение с переносом
---------------------------
О п е р а ц и я: Обычно используется при сложении многословных
величин для учета бита переполнения в последующих фазах операции. Если
флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду 1.
Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д (три формата):

Регистр плюс регистр или память:
|000100dw|modregr/m|
Регистр АХ (AL) плюс непосредственное значение:
|0001010w|-- data--|data, если w=1|
Регистр или память плюс непосредственное значение:
y100000sw|mod010r/m|--data--|data, если sw=01|

ADD: Сложение двоичных чисел
------------------------------
О п е р а ц и я: Прибавляет один байт или одно слово в памяти,
регистре или непосредственно к содержимому регистра или прибавляет один
байт или слово в регистре или непосредственно к памяти.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д (три формата):

Регистр плюс регистр или память:
|000000dw|modregr/rm|
Регистр AX (AL) плюс непосредственное значение:
|0000010w|--data--|data, если w=1|
Регистр или память плюс непосредственное значение:
|100000sw|mod000r/m|--data--|data, если BW=01|

AND: Логическое И
-------------------
О п е р а ц и я: Команда выполняет поразрядную конъюнкцию (И) битов
двух операндов. Операнды представляют собой одно- или двухбайтовые
величины в регистре или памяти. Второй операнд может содержать
непосредственные данные. Команда AND проверяет два операнда поразрядно.
Если два проверяемых бита равны 1, то в первом операнде устанавливается
единичное значение бита, в других случаях - нулевое. См. также команды OR,
XOR и TEST.

Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF
не определен).

О б ъ е к т н ы й к о д (три формата):

Регистр И регистр или память:
|001000dw|modregr/m|
Регистр AX (AL) И непосредственное значение:
|0010010w|--data--|data, если w=1|
Регистр или память И непосредственное значение:
|1010000w|modl00r/m|--data--|data, если w=1|

CALL: Вызов процедуры
-----------------------
О п е р а ц и я: Выполняет короткий или длинный вызов процедуры для
связи подпрограмм. Для возврата из процедуры используется команда RET.
Команда CALL уменьшает содержимое SP на 2 и заносит в стек адрес следующей
команды (из IP), а затем устанавливает в регистре IP относительный адрес
процедуры. Впоследствии команда RET использует значение в стеке для
возврата. Существует четыре типа команды CALL для вызова внутри сегмента и
между сегментами. Команда межсегментного вызова сначала уменьшает SP,
заносит в стек адрес из регистра CS, а затем загружает в стек
внутрисегментный указатель.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д (четыре формата):

Прямая адресация в сегменте:
|11101000|disp-low|diep-high|
Косвенная адресация в сегменте:
|11111111|mod010r/m|
Косвенная адресация между сегментами:
|11111111|mod011r/m|
Прямая адресация между сегментами:
|10011010|offset-low|offset-high|seg-low|seg-high|

CBW: Преобразование байта в слово
-----------------------------------
О п е р а ц и я: Расширяет однобайтовое арифметическое значение в
регистре AL до размеров слова. Команда CBW размножает знаковый бит (7) в
регистре AL по всем Битам регистра АН. См также команду CWD.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: 10011000 (без операндов).

CLC: Сброс флага переноса
---------------------------
О п е р а ц и я: Устанавливает значение флага переноса, равное 0, так
что, например, команда ADC не прибавляет единичный бит. Команда CLC не
имеет операндов. См. также команду STD.

Ф л а г и: Команда воздействует на флаг CF (устанавливается в 0).

О б ъ е к т н ы й к о д: 11111000.

CLD: Сброс флага направления
-------------------------------
О п е р а ц и я: Устанавливает значение флага направления, равное 0.
В результате такие строковые операции, как CMPS или MOVS обрабатывают
данные слева направо. См. также команду STD.

Ф л а г и: Команда воздействует на флаг DF (устанавливается в 0).

О б ъ е к т н ы й к о д: 11111100 (без операндов).

CLI: Сброс флага прерывания
-----------------------------
О п е р а ц и я: Запрещает маскируемые внешние прерывания по
процессорной шине INTR посредством установки значения флага прерывания IF
в 0. См. также команду STI.

Ф л а г и: Команда воздействует на флаг IF (устанавливается в 0).

О б ъ е к т н ы й к о д: 11111010 (без операндов).

CMC: Переключение флага переноса
----------------------------------
О п е р а ц и я: Инвертирует флаг CF, т.е. преобразует нулевое
значение флага CF в единичное и наоборот.

Ф л а г и: Команда воздействует на флаг CF (инвертируется).

О б ъ е к т н ы й к о д: 11110101 (без операндов).

CMP: Сравнение
----------------
О п е р а ц и я: Сравнивает содержимое двух полей данных. Фактически
команда CMP вычитает второй операнд из первого, но содержимое полей не
изменяет. Операнды должны иметь одинаковую длину: байт или слово. Команда
CMP может сравнивать содержимое регистра, памяти или непосредственное
значение с содержимым регистра; или содержимое регистра или
непосредственное значение с содержимым памяти. См. также команду CMPS.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д (три формата):

Регистр или память с регистром:
|001110dw|modregr/m|
Непосредственное значение с регистром AX (AL):
|0011110w|--data--|data, если w=1|
Непосредственное значение с регистром или памятью:
|100000sw|mod111r/m|--data--|data, если sw=0|

CMPS/CMPSB/CMPSW: Сравнение строк
-----------------------------------
О п е р а ц и я: Сравнивают строки любой длины. Этим командам обычно
предшествует префикс REPn, например REPE CMPSB. Команда CMPSB сравнивает
память по байтам, а команда CMPSW - по словам. Первый операнд этих команд
адресуется регистровой парой DS:SI, а второй - регистровой парой ES:DI.
Если флаг DF установлен в 0, то сравнение происходит слева направо,
регистры SI и DI при этом увеличиваются после каждого сравнения. Если флаг
DF установлен в 1, то сравнение происходит справа налево, а регистры SI и
DI при этом уменьшаются после каждого сравнения.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д: 1010011w.

CWD: Преобразование слова в двойное слово
-------------------------------------------
О п е р а ц и я: Расширяет арифметическое значение в регистре АХ до
размеров двойного слова в регистровой паре DX:AX, дублируя при этом
знаковый бит (15-й бит в регистре АХ) через регистр DX. Обычно
используется для получения 32-битового делимого. См. также команду CBW.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: 10011001 (без операндов).

DAA: Десятичная коррекция для сложения
----------------------------------------
О п е р а ц и я: Корректирует результат сложения двух BCD (десятичных
упакованных) элементов в регистре AL. Если четыре правых бита имеют
значение больше 9 или флаг AF установлен в 1, то команда DAA прибавляет 6
к регистру AL и устанавливает флаг AF. Если регистр AL содержит значение
больше, чем 9F, или флаг CF установлен в 1, то команда DAA прибавляет 60Н
к регистру AL и устанавливает флаг CF. См. также команду DAS.

Ф л а г и: Команда воздействует на флаги AF. CF, PF, SF и 2F (флаг OF
неопределен).

О б ъ е к т н ы й к о д: 00100111 (без операндов).

DAS: Десятичная коррекция для вычитания
-----------------------------------------
О п е р а ц и я: Корректирует результат вычитания двух BCD
(десятичных упакованных) чисел в регистре AL. Если четыре правых бита
имеют значение больше 9 или флаг AF установлен в 1, то команда DAS
вычитает 60Н из регистра AL и устанавливает флаг CF. См. также команду
DAA.

Ф л а г и: Команда воздействует на флаги AF, CF, PF, SF и ZF.

О б ъ е к т н ы й к о д: 00101111 (без операндов).

DEC: Декремент
----------------
О п е р а ц и я: Вычитает 1 из байта или слова в регистре или в
памяти например DEC СХ. См. также команду INC.

Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д (два формата):

Регистр: |01001reg|
Регистр или память: |1111111w|mod001r/m|

DIV: Деление
--------------
О п е р а ц и я: Выполняет деление беззнакового делимого (16 или 32
бит) на беззнаковый делитель (8 или 16 бит). Левый единичный бит
рассматривается как бит данных, а не как минус для отрицательных чисел.
Для 16-битового деления делимое должно находиться в регистре АХ, а
8-битовый делитель возможен в регистре или в памяти, например DIV BH.
Частное от деления получается в регистре AL, а остаток - в регистре АН.
Для 32-битового деления делимое должно находиться в регистровой паре DX:AX
а 16-битовый делитель возможен в регистре или в памяти, например DIV СХ.
Частное от деления получается в регистре АХ, а остаток - в регистре DX.

См. также команду IDIV.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF SF и ZF (все
не определены).

О б ъ е к т н ы й к о д: |1111011w|mod110r/m|

ESC: Переключение на сопроцессор
----------------------------------
О п е р а ц и я: Обеспечивает использование сопроцессора для
выполнения специальных операций. Для выполнения арифметических операций
над числами с плавающей запятой используются сопроцессоры 8087 или 80287.
Команда ESC передает в сопроцессор инструкцию и операнд для выполнения
необходимой операции.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |11011xxx|modxxxr/m| (x - любое знач.).

HLT: Останов микропроцессора
------------------------------
О п е р а ц и я: Приводит процессор в состояние останова, в котором
происходит ожидание прерывания. При завершении команды HLT регистры CS:IP
указывают на следующую команду. При возникновении прерывания процессор
записывает в стек регистры CS и IP и выполняет подпрограмму обработки
прерывания. При возврате из подпрограммы команда IRET восстанавливает
регистры CS и IP из стека и управление передается на команду, следующую за
командой HLT.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: 11110100 (без операндов).

IDIV: Целое деление знаковых величин
--------------------------------------
О п е р а ц и я: Выполняет деление знакового делимого (16 или 32 бит)
на знаковый делитель (8 или 16 бит). Левый единичный бит рассматривается
как знак минус для отрицательных чисел. Для 16-битового деления делимое
должно находиться в регистре АХ, a 8-битовый делитель возможен в регистре
или в памяти, например IDIV DL. Частное от деления получается в регистре
AL, а остаток - в регистре АН. Для 32-битового деления делимое должно
находиться в регистровой паре DX:AX, а 16-битовый делитель возможен в
регистре или в памяти, например IDIV BX. Частное от деления получается в
регистре АХ, а остаток - в регистре DX. См. команды CBW и CWD для
расширения знакового делимого, а также команду DIV.

Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д: |1111011w|mod111r/m|

IMUL: Целое умножение знаковых величин
----------------------------------------
О п е р а ц и я: Выполняет умножение на знаковый множитель (8 или 16
бит). Левый единичный бит рассматривается как знак минус для отрицательных
чисел. Для 8-битового умножения множимое должно находиться в регистре AL,
а множитель возможен в регистре или в памяти, например IMUL BL.
Произведение получается в регистре АХ. Для 16-битового умножения множимое
должно находиться в регистре АХ, а множитель возможен в регистре или в
памяти, например IMUL BX. Произведение получается в регистровой паре
DX:AX. См. также команду MUL.

Ф л а г и: Команда воздействует на флаги CF и OF (флаги AF PF SF и ZF
не определены).

О б ъ е к т н ы й к о д: |1111011w|mod101r/m|

IN: Ввод байта или слова из порта
-----------------------------------
О п е р а ц и я: Передает из вводного порта один байт в регистр AL
или два байта в регистр АХ). Порт кодируется как фиксированный числовой
операнд (IN АХ,порт#) или как переменная в регистре DX (IN AX,DX).
Процессоры 80186, 80286 и 80386 имеют, кроме того, команду INS (Input
String - ввод строки). См. также команду OUT.

Ф л а г и: Не меняются.


О б ъ е к т н ы й к о д (два формата):

Переменный порт: |1110110w|
Фиксированный порт: |1110010w|--port--|

INC: Инкремент
----------------
О п е р а ц и я: Прибавляет 1 к байту или слову в регистре или в
памяти, например INC СХ. См. также команду DEC.

Ф л а г и: Команда воздействует на флаги AF, OF, PF, SF и ZF.

О б ъ е к т н ы й к о д (два формата):

Регистр: |01000reg|
Регистр или память: |1111111w|mod000r/m|

INT: Прерывание
-----------------
О п е р а ц и я: Прерывает выполнение программы и передает управление
по одному из 256 адресов (векторов прерывания). Команда INT выполняет
следующее: 1) уменьшает значение SP на 2 и заносит в стек флаговый
регистр, сбрасывает флаги IF и TF; 2) уменьшает значение SP на 2 и заносит
регистр CS в стек, старшее слово из вектора прерывания помещает в регистр
CS; 3) уменьшает значение SP на 2 и заносит регистр IP в стек, младшее
слово из вектора прерывания помещает в регистр IP.

Ф л а г и: Команда воздействует на флаги IF и TF.

О б ъ е к т н ы й к о д:
|1100110v|--type--| (если v = 0, то type = 3).

INTO: Прерывание по переполнению
----------------------------------
О п е р а ц и я: Приводит к прерыванию при возникновении переполнения
(флаг OF установлен в 1) и выполняет команду IRET 4. Адрес подпрограммы
обработки прерывания (вектор прерывания) находится по адресу 10Н. См.
также команду INT.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: 11001110 (без операндов).

IRET: Возврат из обработки прерывания
---------------------------------------
О п е р а ц и я: Обеспечивает возврат из подпрограммы обработки
прерывания. Команда IRET выполняет следующее: 1) помещает слово из вершины
стека в регистр IP и увеличивает значение SP на 2; 2) помещает слово из
вершины стека в регистр CS и увеличивает значение SP на 2; 3) помещает
слово из вершины стека во флаговый регистр и увеличивает значение SP. на
2. См. также команду RET.

Ф л а г и: Команда воздействует на все флаги.

О б ъ е к т н ы й к о д: 11001111 (бег операндов).

JA/JNBE: Переход по "выше" или "не ниже или равно"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен нулю (нет
переноса) и флаг ZF равен нулю (не нуль), то команда прибавляет к регистру
IP значение операнда (относительное смещение) и выполняет таким образом
переход.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01110111|--disp--|

JAE/JNB: Переход по "выше или равно" или "не ниже"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен нулю (нет
переноса), то команда прибавляет к регистру IP значение операнда
(относительное смещение) и выполняет таким образом переход.


Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01110011|--disp--|

JB/JNAE: Переход по "ниже" или "не выше или равно"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
Передачи управления по другому адресу. Если флаг CF равен единице (есть
перенос), то команда прибавляет к регистру IP значение операнда
(относительное смещение) и выполняет таким образом переход.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01110010|--disp--|

JBE/JNA: Переход по "ниже или равно" или "не выше"
----------------------------------------------------
О п е р а ц и я: Используется после проверки беззнаковых данных для
передачи управления по другому адресу. Если флаг CF равен единице (есть
перенос) или флаг AF равен единице, то команда прибавляет к регистру IP
значение операнда (относительное смещение) и выполняет таким образом
переход.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01110110|--disp--|

JC: Переход по переносу
-------------------------
О п е р а ц и я: Идентична JB/JNAE.

JCXZ: Переход по "CX равно нулю"
----------------------------------
О п е р а ц и я: Выполняет передачу управления по указанному в
операнде адресу, если значение в регистре CX равно нулю. Команда JCXZ
может быть полезна в начале циклов LOOP.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |11100011|--disp--|

JE/JZ: Переход по "равно" или по "нулю"

О п е р а ц и я: Используется после проверки знаковых или беззнаковых
данных для передачи управления по другому адресу. Если флаг ZF равен
единице (нулевое состояние), то команда прибавляет к регистру IP значение
операнда (относительное смещение) и выполняет таким образом переход.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01110100|--disp--|

JG/JNLE: Переход по "больше" или "не меньше или равно"
--------------------------------------------------------
О п е р а ц и я: Используется после проверки знаковых данных для
передачи управления по другому адресу. Если флаг ZF равен нулю (не нуль) и
флаги SF и OF одинаковы (оба 0 или оба 1), то команда прибавляет к
регистру IP значение операнда (относительное смещение) и выполняет таким
образом переход.

Ф л а г и: Не меняются.

О б ъ е к т н ы й к о д: |01111111|--disp--|

JGE/JNL: Переход по "больше или равно" или "не меньше"
---------------------------------------------

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.