Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 611
от 09.08.2003, 23:20

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 3883
Отправлено ответов: 11447
Активность: 294.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

dimka
Статус: Доверительный
Общий рейтинг: 144.44
[Подробней >>]
Andrew Vext
Статус: Профессиональный
Общий рейтинг: 105.03
[Подробней >>]
Евгений Иванов
Статус: Опытный
Общий рейтинг: 144.88
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
 
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 111.53
[Подробней >>]
Gibbel
Статус: Профессиональный
Общий рейтинг: 107.51
URL: Savage Metal Club - жизнь в стиле рок-н-ролл
Телефон: +7 901 710 3146
[Подробней >>]
Hangatyr
Статус: Опытный
Общий рейтинг: 113.94
[Подробней >>]
 
masquer
Статус: Профессиональный
Общий рейтинг: 135.34
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 151.57
URL: Программирование
[Подробней >>]
Tigran K. Kalaidjian
Статус: Профессиональный
Общий рейтинг: 125.63
URL: Методы оптимизации работы ПК
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 119.49
[Подробней >>]
ASMодей
Статус: Профессиональный
Общий рейтинг: 113.26
[Подробней >>]
Broken Sword
Статус: Профессиональный
Общий рейтинг: 121.2
URL: мой сайт
[Подробней >>]
 
Eugene
Статус: Профессиональный
Общий рейтинг: 106.76
URL: мощный файловый архив
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 118.29
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 3848. Доброй ночи Эксперты Если кто знает почему через DPMI запись в LFB ( режим VESA 118h) приводит к в... (ответов: 3)
Вопрос № 3849. Здравствуйте, уважаемые эксперты. У меня возник следующий вопрос и я прошу у Вас помощи. В общем, ка... (ответов: 1)
Вопрос № 3850. Здравствуйте, уважаемые эксперты! У меня появилясь проблема следующего рода: моя прога запускается и... (ответов: 7)
Вопрос № 3851. см. прикол: telnet www.boston.ru отвечать не обязательно... (ответов: 2)
Вопрос № 3852. При чтении технической литературы о работе и строении BIOS я прочитал, что на начальном этапе инициа... (ответов: 7)
Вопрос № 3853. Доброго всем времени суток! Уже вторую неделю напролет разбираю защищенный режим процессора. Пытаюс... (ответов: 7)

Вопросов: 6, ответов: 27


 Вопрос № 3848

Доброй ночи Эксперты
Если кто знает почему через DPMI запись в LFB ( режим VESA 118h) приводит к выводу на экран,а в чистом PM у меня ничего не получается (как был черный экран, так и остался). Видиокарта выдает значение адреса буфера далеко за пределами физической памяти (D6000000h), но Зубкова с DPMI это не волнует и все катит. Не мог бы кто-нибудь объяснить в чем разница для видиокарты между DPMI и 'чистым' PM и как все-таки вывести через этот буфер.
Вопрос 2. Не сталкивался ли кто с защищенныйми *.PDF файлами. На днях скачал книги по AGP размером более 3 мег а всего 12 страниц текста без картинок ( только оглавление). не занет ли кто как прсмотреть неотображаемую ,по моему мнению, книгу.
Alexej.



Вопрос отправлен: 05.08.2003, 00:34
Отправитель: Alexej

[Следующий вопрос >>] [Список вопросов]

Отвечает dimka

Доброе время суток, Alexej!
1) Используй книгу Том Свана!!!!(крутая)
2) Попробуй вызвать ctrl+n, и перескочить дальше. Если не получилось, значит книгу переводил в ПДФ формат полудурок.

Ответ отправлен: 05.08.2003, 10:40
Отправитель: dimka


Отвечает Andrew Vext

Здравствуйте, Alexej!
DPMI автоматически выполняет отображение страниц видеопамяти на логическое адресное пространство, а в чистом PM вам это надо делать вручную.


Ответ отправлен: 05.08.2003, 11:25
Отправитель: Andrew Vext


Отвечает Евгений Иванов

Доброе время суток, Alexej!
2. Для PDF это тот самый размер. Не большой и не маленький!


Ответ отправлен: 05.08.2003, 05:30
Отправитель: Евгений Иванов


 Вопрос № 3849

Здравствуйте, уважаемые эксперты. У меня возник следующий вопрос и я прошу у Вас помощи. В общем, как работает контроллер прерываний (некоторых новых чипсетов, наверное) в реальном режиме процессора, т.е. проблема в следующем: при установке обработчика мыши на IRQ4 и движении мыши в регистр запросов IRR не поступает запрос на прерывание (я наблюдал содержимое IRR при сброшенном флаге прерываний). Далее, на IRQ0 (таймер) устанавливался и сбрасывался наверное с частотой таймера (частота 18 Гц вполне воспринимается визуально) при запрещенных прерываниях (?). Причем, не помогает даже стандартная процедура инициализации контроллеров прерываний. Если в системе (MS DOS) установить драйвер мыши (mouse.sys или mouse.com,
mmouse.sys или mmouse.com), то все нормально и запрос от прикладного обработчика поступает в IRR. Т.о., объясните, пожалуйста, как работает контроллер прерываний и как сделать так, чтобы запрос на прерывание
поступал в контроллер. Заренее благодарен за ответы.



Вопрос отправлен: 05.08.2003, 07:10
Отправитель: Valentin

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, Valentin!
Во первых, проверь порт 21h.
И правильно действую с 20h.
{
Send 20h here to signal end-of-interrupt (EOI).
1xxx xxxx Rotate Mode
x1xx xxxx Set Interrupt Level
xx1x xxxx End of Interrupt Mode
xxx1 1xxx Reserved - must be set to 0
xxxx x111 Interrupt level (when bit 6=1)
Bits 7-5: These bits define the rotate mode, end of interrupt
mode, or a combination of the two.
000 Reserved
001 Nonspecific End of Interrupt Command
010 No operation
011 Specific End of Interrupt Command
(bits 2-0 select interrupt to end).
100 Reserved
101 Rotate on nonspecific End of Interrupt Comman
110 Set prioriry Command
(bits 2-0 select interrupt to act on).
111 Rotate on specific end of interrupt command
}
Пришли исходник, а так не понятно, чего там у тебя...
Читай мою статью на моём сайте:
"Как найти у мыши третью кнопку".


Ответ отправлен: 05.08.2003, 18:00
Отправитель: Евгений Иванов


 Вопрос № 3850

Здравствуйте, уважаемые эксперты!
У меня появилясь проблема следующего рода:
моя прога запускается из секции Run реестра (пусть у неё будет путь c:program filesproga). Но когда она запускается и я при помощи GetCurrentDirectory пытаюсь узнать путь к ней, то получаю что угодно, кроме вышеуказанного пути :( (причём это и в 9х, и в 2000).
И ещё вопрос - как с помощью АПИ-функций записать в реестр REG_DWORD или REG_BINARY (строки - легко пишутся).



Вопрос отправлен: 05.08.2003, 11:42
Отправитель: Ренат

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Приветствую Вас, Ренат!
Используй так:
call CreateFullPathExe
or eax,eax
jnz @@n1
mov al,isError_NeedMoreMemory
@@ErrCall0:
jmp @@ErrorCall
@@n1:
mov [hmemFullPathExe],eax
mov [LenFullPathExe],ecx
;... working
;----------------------------------------------------------
; Создаёт строку "путь (каталог),где запустилась программа"
; OUT=> EAX=адрес строчки; 0-ошибка
; ECX-длина строчки без нуля
proc CreateFullPathExe
USES esi,edi,ebx
Call GlobalAlloc,GPTR,MAX_PATH
or eax,eax
jz @@exit
xchg esi,eax
Call GetModuleFileName,[hInst],esi,MAX_PATH
or eax,eax
jz @@exit
xchg ebx,eax
@@m0:
dec ebx
mov al,[esi+ebx]
cmp al,''
jz @@m1
or ebx,ebx
jnz @@m0
xchg eax,ebx
jmp @@exit
@@m1:
inc ebx
mov [byte esi+ebx],0
mov [LenFullPathExe],ebx
mov eax,ebx
inc eax
Call GlobalReAlloc,esi,eax,GMEM_MOVEABLE
mov ecx,ebx
@@exit:
ret
endp
;========
По поводу реестра - не использую, но надо вот так:
Там адрес данных надо передать lpData.
;---
The RegSetValueEx function stores data in the value field of an open registry key. It can also set additional value and type information for the specified key.
LONG RegSetValueEx(
HKEY hKey, // handle of key to set value for
LPCTSTR lpValueName, // address of value to set
DWORD Reserved, // reserved
DWORD dwType, // flag for value type
CONST BYTE * lpData, // address of value data
DWORD cbData // size of value data
);


Ответ отправлен: 05.08.2003, 17:58
Отправитель: Евгений Иванов


Отвечает Dark_Lord

Здравствуйте, Ренат!
Получить полный путь к программе можно функцией GetModuleFileName

Ответ отправлен: 06.08.2003, 18:27
Отправитель: Dark_Lord


Отвечает Gibbel

Приветствую Вас, Ренат!
1. Вообще-то этот вопрос в группу WinAPI.
2. GetCurrentDirectory() выдает текущую директорию, а не ту, из которой была запущенна программа. Используй для этих целей GetModuleFileName().
3. Тип задается в параметре dwType функции RegSetValueEx() (функция RegSetValue() позволяет писать только строки!!!). Не забудь также задать требуемую длину в параметре cbData.

Ответ отправлен: 05.08.2003, 12:47
Отправитель: Gibbel


Отвечает Hangatyr

Добрый день, Ренат!
1. А чего еще можно ожидать? Используй GetModuleFileName или GetCommandLine.
2. И в чем проблема? Точно также, как и строку:
push eax
lea eax, [esp]
invoke RegCreateKey, HKEY_LOCAL_MACHINE, ADDR subkey, eax pop eax
invoke RegSetValueEx, eax, ADDR value_name, 0, REG_DWORD, ADDR value, 4

Ответ отправлен: 05.08.2003, 12:32
Отправитель: Hangatyr


Отвечает masquer

Доброе время суток, Ренат!
Все правильно. Почитай, что возвращает GetCurrentDirectory. GetCommandLine используй.

Ответ отправлен: 05.08.2003, 12:08
Отправитель: masquer


Отвечает dimka

Доброе время суток, Ренат!
Если у тебя Делфи, то там,в хелпе, есть фаил ,по-мойму,msis
там полное описание АПИ функций(думаю разберёшься).

Ответ отправлен: 05.08.2003, 12:25
Отправитель: dimka


Отвечает Bob Johnson

Приветствую Вас, Ренат!
1. Она возвращает именно текущую дерикторию. Чтобы узнать путь, откуда программа была запущена, надо вызвать GetModuleHandle с нулем в качестве hmodule и потом из полученной строки (полный путь к твоей программе) самому извлечь каталог (с конца до первого '\').

* EMan1.4: ---===*** Die young - live free ***===---


Ответ отправлен: 08.08.2003, 15:52
Отправитель: Bob Johnson


 Вопрос № 3851

см. прикол:
telnet www.boston.ru
отвечать не обязательно



Вопрос отправлен: 05.08.2003, 18:11
Отправитель: Broken Sword (brokensword@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Tigran K. Kalaidjian

Здравствуйте, Broken Sword!
Не, ну как не стыдно! Врослые люди вроде...
На самых хулиганских ББС я даже такого не видел =)
Видимо псевдографическая анимация не даёт покоя.

Ответ отправлен: 05.08.2003, 19:11
Отправитель: Tigran K. Kalaidjian


Отвечает dimka

Приветствую Вас, Broken Sword!
Нихрена себе!!!

Ответ отправлен: 06.08.2003, 11:38
Отправитель: dimka


 Вопрос № 3852

При чтении технической литературы о работе и строении BIOS я прочитал, что на начальном этапе инициализации работы со стеком не происходит, посклольку еще не добавлена его поддержка на ранних этапах. Но при дизассемблировании соответствующего bin-файла (файл прошивки BIOS моей материнки) я увидел в самом начале кода инструкцию push.
Вскоре я просмотрел весь листинг дизассемблирования и увидел там еще много инстукций работы со стеком.
Обьясните пожалуйста сложившуюся ситуацию.


Приложение:


Вопрос отправлен: 05.08.2003, 19:24
Отправитель: Vilka

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Приветствую Вас, Vilka!
То, что его поддержка может быть выключена это чушь, стек всегда есть и всегда в сегменте указанном в ss и регистре sp(esp)

Ответ отправлен: 06.08.2003, 18:29
Отправитель: Dark_Lord


Отвечает Евгений Иванов

Добрый день, Vilka!
Тот код, который ты привёл, дизассемблирован не с того места.
Это также могут быть данные.
Но насчёт стека в биосе:
очень даже используется, идёт во-первых, проверка всех регистров, потом
проверяется работа всех узлов, в том числе и стек.
А чего его поддерживать.
Память минимум 1 Мб есть. Так что ставь ss:sp куда-нибудь и работай!
Да без стека не будет и прерывания обслуживаться.
Так что на начальном этапе POST идёт CLI.
Потом настраивается ss:sp и впёрёд!


Ответ отправлен: 06.08.2003, 17:43
Отправитель: Евгений Иванов


Отвечает Tigran K. Kalaidjian

Добрый день, Vilka!
Информация для размышления - как Ваш дизассемблер отличает код от данных, т.е. не мог ли он "дизассемблировать" данные?
Представьте также следующий вариант - есть такая вот программа:
====================
.model tiny
.code
org 100h
main:
a:
cli
jmp a
end main
====================
В HEX-редакторе она выглядит так:
FA EB FD
Дизассемблируем её(возможна потеря отступов):
00000000: FA cli
00000001: EBFD (1) jmp 00000000
Пока что всё правильно.
А теперь попробуем вставить байт данных в самое начало программы, сохранив наш код(при этом мы просто "перепрыгнем" через этот байт):
====================
.model tiny
.code
org 100h
main:
jmp a
OUR_BYTE db 1
a:
cli
jmp a
end main
====================
В HEX-редакторе читаем:
EB 02 90 01 FA EB FD
Дизассемблер покажет следующее:
00000000: EB02 (1) jmp 00000004
00000002: 90 nop
00000003: 01FA add dx,di
00000005: EBFD (2) jmp 00000004
Ну что, похоже на исходный вариант программы? Нет? А теперь представьте, что у Вас в результате такого сдвига случайно попалась команда 0E. Дизассемблер показал, что это push cs, а это может быть, например, кусок команды B0 0E (т.е. mov al, 0eh). Такое "разделение" может быть вызвано, упомянутым мной, сдвигом кода из-за данных.
Подумайте. Если возникнут вопросы - пишите на kalaidjian@pochtamt.ru

Ответ отправлен: 05.08.2003, 22:41
Отправитель: Tigran K. Kalaidjian


Отвечает _vt

Доброе время суток, Vilka!
Во-первых, я первый раз слышу о таком факте, но допустим... Во-вторых, если вы дизассемблировали прошивку, еще не факт, что всё что получилось и есть код биоса, вполне могут быть и просто данными (0Е - код команды push cs, может просто число 14 обозначать...)
В-третьих, даже если в начале листинга есть команды управления стеком, еще не факт, что они выполняются раньше того, как "добавлена поддержка"... По-моему, биос выполняется с адресов 0F00h:0FFFFh (или что-то наподобие)...

---===*** E-Man 1.4: I really need in 1.5... Help me!!!***===---


Ответ отправлен: 06.08.2003, 11:22
Отправитель: _vt


Отвечает dimka

Доброе время суток, Vilka!
Круто, сам не знаю, что это за фигня.

Ответ отправлен: 06.08.2003, 11:34
Отправитель: dimka


Отвечает ASMодей

Добрый день, Vilka!
Вообще-то код, который ты привел в приложении не очень-то похож на начало BIOS. Зачем в начале BIOS инструкция для сравнения вещественных чисел?
Скорее всего ты действительно перепутал код с данными или пропустил какой нибудь переход.

Ответ отправлен: 06.08.2003, 12:25
Отправитель: ASMодей


Отвечает Bob Johnson

Доброе время суток, Vilka!
"Поддержка стека" - это всего лишь установка регистра (e)SP на какой-либо адрес в памяти. Т.е. можно сделать mov esp, 10000h и после этого использовать push. Но, кстати, в самом начале биоса нет никаого push! Видимо ты не туда посмотрел...

* EMan1.4: ---===*** Die young - live free ***===---


Ответ отправлен: 08.08.2003, 15:52
Отправитель: Bob Johnson


 Вопрос № 3853

Доброго всем времени суток!
Уже вторую неделю напролет разбираю защищенный режим процессора. Пытаюсь писать проги (пока правда в большей степени только пытаюсь). И вопросы, как разумеется, появляются сами собой. В общем моя программа загружается с загрузочной дискеты,т.е. использовать ДОСовские функции,WinApi и тому подобного мне не приходится (ОС отсутствует!). "BIOS,один только BIOS - это же так романтично(Простите за отступление)". Но только переключаюсь в защищенный режим и прерывания программ BIOSа становятся нам не доступны. Как мне в такой устрашающей ситуации работать с дисками (я знаю что через порты, но как?), выводить изображения(например,заставка моей проги), текст. А! Самое главное забыл: как запутить СОМ-файл. Слышал, что надо передать управление со смещением 100h в селекторе, где загрузился *.СОМ, но.. И снова возникают вопросы. Объясните мне неучу, пожалуйста, как мне это организовать, а то нас в школе такому не учат, а при слове ASSEMBLER учителей начинает колотить.
Плизззззз,если у кого есть исходники, статьи скиньте на ящик ic_box_mail@mail.ru в век не забуду.



Вопрос отправлен: 05.08.2003, 23:18
Отправитель: Greys (ic_box_mail@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Здравствуйте, Greys!
Используй DPMI.
Знаешь dos4gw.exe.
Или можно PMODE.


Ответ отправлен: 06.08.2003, 17:49
Отправитель: Евгений Иванов


Отвечает Broken Sword

Приветствую Вас, Greys!
Ищи статью из журнала VLAD "Работа с HDD через порты" (если не найдешь кину). Вывод изображений - через LFB.

Ответ отправлен: 07.08.2003, 20:02
Отправитель: Broken Sword


Отвечает Tigran K. Kalaidjian

Здравствуйте, Greys!
Вот мой совет - если хотите работать с загрузочным сектором, то изучите работу BOOT-вирусов. Тут Вы и узнаете все возможности, недостатки и приёмы такого программирования =)
Также изучите статью:
http://www.wasm.ru/article.php?article=unusualboot
> и прерывания программ BIOSа становятся нам не доступны.
Это почему еще? Int10h и в защищенном режиме работает.
> Как мне в такой устрашающей ситуации работать с дисками
Используйте ф-ции прерывания БИОС int13h
Вот список параметров, если Вы хотите работать с дисководом:
AH - функция (0 - сброс, 2 - чтение сектора, 3 - запись сектора);
AL - число секторов (для чтения или записи);
BX - буфер памяти для ввода-вывода данных (в паре ES:BX);
CH - номер дорожки;
CL - номер начального сектора;
DH - номер головки (для дискет - 0 или 1);
DL - номер дисковода (0=А, 1=B).
Для жесткого диска практически аналогично (подробнее читайте в справочнике Ральфа Брауна)
Если хотите программировать через порты, то скачайте документацию http://kalaidjian.narod.ru/idedisk.rar
И изучайте.
> выводить изображения(например,заставка моей проги)
1. С помощью INT 10h (подробнее читайте в справочнике Ральфа Брауна)
2. Писать напрямую в видеобуфер (подробнее читайте у Р.Журдена или С.Зубкова)
3. Программировать микросхему Motorola 6845 (на которой основывается практически любая видеосистема) (подробнее читайте у Р.Журдена)
> текст.
1. int 10h
2. Вывод напрямую в видеобуфер по адресу B800:xxxx
>нас в школе такому не учат, а при слове ASSEMBLER >учителей начинает колотить.
У нас в школе тоже начинает колотить, но в проекте применить таки позволили...
Кстати, в некоторых израильских школах изучается асм, и ученики даже защищают проекты на нем. Я был удивлен.
> у кого есть исходники, статьи
Что Вам нужно, если конкретнее? Пишите на kalaidjian@pochtamt.ru

Ответ отправлен: 06.08.2003, 13:57
Отправитель: Tigran K. Kalaidjian


Отвечает Eugene

Здравствуйте, Greys!
Есть хорошая книга Зубкова. Там довольно неплохо описано то, что тебе нужно. Выслал тебе пример из той книги.

Ответ отправлен: 06.08.2003, 10:09
Отправитель: Eugene


Отвечает dimka

Доброе время суток, Greys
Посмотрю, что у меня есть.
...
Могу скинуть что-то по HDD, могу Зубкова...


Ответ отправлен: 06.08.2003, 11:17
Отправитель: dimka


Отвечает ASMодей

Приветствую Вас, Greys!
После переключения в защищенный режим, всю работу по управлению устройствами компьютера тебе придется делать самому, программируя соответствующие контроллеры. У всех устройств компьютера есть собственные контроллеры: у дисковода, у видеоадаптера, у клавиатуры, даже у памяти. Вот их и нужно прораммировать через порты ввода-вывода.
А прежде чем запускать *.COM-файл, его нужно прочитать в память. А для этого нужно обращаться к диску напрямую и напрямую поработать с FAT.

Ответ отправлен: 06.08.2003, 12:10
Отправитель: ASMодей


Отвечает Ayl

Добрый день, Greys!
С дисками - через порты. Видеорежим нужно устанавливать также с помощью программирования портов, а вот вывод изображения - прямым обращением к памяти. Причем в защищенном режиме ты сам можешь управлять отображением видеопамяти в адресное пространство.
Насчет COM-файлов. А как он у тебя собирается работать? Или это твой собственный COM? Если нет, то для работы ему нужен ДОС. Т.е. ты выделяешь память для процесса, устанавливаешь режим работы V86 для этой области, выполняешь загрузку ДОСа и уж после этого выполняешь COM-файл.

Ответ отправлен: 06.08.2003, 12:49
Отправитель: Ayl



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (37)
C / C++ (26)
Perl (3)
Builder / Delphi (18)
Pascal (24)
Basic / VBA (11)
Java / JavaScript (10)
PHP (8)
Криптография (9)
WinAPI (15)
Пользователю
Windows 95/98/Me (46)
Windows NT/2000/XP (52)
"Железо" (43)
Поиск информации (26)
Администратору
Windows NT/2000/XP (25)
Linux / Unix (12)
Юристу
Гражданское право (10)
Семейное право (6)
Трудовое право (7)
КоАП (5)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное