Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Зачем тебе флоппи в 2012 году? Я вот недавно дискету еле еле достал.

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 16:56 16-04-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все очень просто - работа с дискетой и пр динозаврами давно изучена, и хорошо описана всеми, кому было не лень. А вот работа с лба48 например, фиг описана, да и то только на ангельском.

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 17:03 16-04-2012
doktorpilulkin

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ой. а что это вы тут делаете?

Всего записей: 2341 | Зарегистр. 30-08-2010 | Отправлено: 17:09 16-04-2012 | Исправлено: doktorpilulkin, 17:12 16-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
почему у меня же практическая потребность была. широко использую это дело и ЭТО ПРИ ПОЛНОМ НАЛИЧИИ ОТСУТСВИЯ работающего флоповода на компьютере.  
под виндой у меня виртуальный драйвер, под биосом - промапленные образы флоповодов грубом. никаких заморочек с буквами дисков ... ну вообще удобно
у меня предположительно конфликт материнка-видео карта флоповод не работает
http://s019.radikal.ru/i608/1204/46/8dda4f1bb289.gif
какая то фигня с отражением флоповода А на В. а за счет прямого чтения через биос различаются отражение и реально-виртуальный флоповоды
 
http://s2.ipicture.ru/uploads/20120416/ShB6ygUA.gif
http://s2.ipicture.ru/uploads/20120416/uAMGTTAp.png

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:12 16-04-2012 | Исправлено: bomzzz, 10:52 22-04-2012
Maksim_Avrorov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго утра. Я написал(переписал) программу, но в ней не могу кое-чего уловить.
Код:
code segment
         assume cs:code, ds:code
         mov bx, 101001001b
         mov cx, 16
         lp1:    mov dl, '0'
            shl bx, 1
            jnc lp2
            add dl, 1
         lp2:    mov ah, 2
            int 21h
            loop lp1
            mov ax, 4c00h
            int 21h
code ends
end
Как написано программа выводит значение BX в двоичном представлении. По сути я не могу понять только как команда сложения(add dl, 1) делает единицу.

Всего записей: 14 | Зарегистр. 07-04-2012 | Отправлено: 09:02 20-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
тут использован такой алгоритм. команда shl смещает все биты влево, крайний левый бит вылазит в флаг CF (флаг переноса) команда jnc проверяет установлен он (вылезла единица) или нет (вылез) ноль.
 
Добавлено:

Цитата:
CSEG segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org  100h
Start:
    xor    ax, ax
    in    al, 92h
    or    al, 02h
    out    92h, al
    in    al, 92h
    mov    bx, ax
 
    mov    cx, 15
print:  
    mov    ah, 2
    xor    dx, dx
    bt    bx, cx
    adc    dl, 30h
    int    21h
    sub    cx, 1
    jnc    print
 
    mov    dl, 'b'
    int    21h
 
    mov    ah, 0
    int    16h
 
    ret
CSEG ends
end Start

 
вот еще один алгоритм, построен на команде BT и ADC, первая выдвигает указанный бит в флаг переноса, вторая складывает флаг переноса с числом. а проверяется тут кажется открыт ли вентиль A20
 
Добавлено:
http://ziplib.com/emu8086/
юзай эммулятор сразу все понятно станет, правда как биты крутятся он как раз не очень показывает

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 09:11 20-04-2012
Maksim_Avrorov

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо. Сейчас на эмуляторе попробую.

Всего записей: 14 | Зарегистр. 07-04-2012 | Отправлено: 13:32 20-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
никто с XMS менеджерами никогда ниче не делал? чета у меня медленно обмен идет относительно с другими программами. может какой секрет есть

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 10:53 22-04-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz, медленно в каком смысле? Сама пересылка данных, или что то другое?
 
Добавлено:
Секрет там один - для быстрой пересылки используется "нереальный режим" или LOADALL в самом XMM, это работает только в реальном режиме естественно. После перехода в защищенный режим, это уже не работает, и менеджер переходит к переключениям в/из реальный и обратно. Чем крупнее блок данных для пересылки, тем быстрее оно работает. Поэтому не стоит пересылать данные 1 кб страницами...

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 14:54 22-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LOADALL на пентиуме не работает.
 
 
пересылаю по 32 кбайта.  
 
суть в следующем:
 
копирующая через XMS утилита копирует 1 гиговый файл за 47-48 секнуд (без поддержки больших файлов), копирующая без XMS памяти утилита копирует за 42-43 секунды 1 гиг. вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.
 
то есть получается мое использование XMS памяти кривое, хотя где там можно что то принципиально изменить в упор не понятно
 
Добавлено:
PS дос команды copy и xcopy такой файл будут копировать минут 5-10

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 15:18 22-04-2012
wedl



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго всем утра, делаю шифратор/дешифратор(методом перестановки байтов).
Все скомпилировал. Но появилась проблема с чтением файла.  
 
 
.model    small
.stack    100h    ;256 байт под стек
.data
;--------------------------------------------------------------------------
;Макрос: ввод строки в буффер
entbuff     macro     string
    mov    ah,0Ah
    lea    dx,string
    int    21h
endm
;--------------------------------------------------------------------------
;Макрос: вывод строки на экран
dispstr     macro     string
    mov    ah,9h
    lea    dx,string
    int    21h
endm
;--------------------------------------------------------------------------
;        Сообщения выдаваемые на экран
;--------------------------------------------------------------------------
msg1        db    'Vvedite imia ishodnogo faila   $'    ; ввод имени исходного файла
msg2        db    'Vvedite imia faila dlia sohranenia $'          ; ввод имени нового файла
msg3        db    'Vvedite posledovatelnost perestanovok '
         num label byte
        db '  zifr (bez simvolov razdelitelei): $'    ; Ввод ключа
msg4        db    'Kodirovanie zaversheno$'    ; кодирование завершено
;сообщения об ошибках
OUTERR        db    'Oshibka pri otkritii faila$'        ; ошибка при открытии файла
REAERR        db    'Oshibka pri chtenii iz faila$'        ; ошибка при чтении из файла
CREAERR        db    'Oshibka sozdania faila$'        ; ошибка при создании файла
CLOERR        db    'Oshibka pri zakritii faila$'        ; ошибка при закрытии файла
WRERR        DB    'Oshibka pri zapisi v vail$'        ; ошибка при записи в файл
NUERR        db    'Oshibka pri vvode kluchevoi posledovatelnosti$' ; ошибка при вводе ключевой последовательности  
 
;--------------------------------------------------------------------------
;     Список параметров для ввода имени входного файла
;--------------------------------------------------------------------------
inputfilepar    label    byte            
maxlenin    db    100            ; максимальная длина
actlenin    db    100            ; фактическая длина
inputf        db    100 dup (0)        ; область для хранения имени
;--------------------------------------------------------------------------
;     Список параметров для ввода имени выходного файла
;--------------------------------------------------------------------------
outputfilepar    label    byte            
maxlenout    db    100            ; максимальная длина
actlenout    db    100            ; фактическая длина
outputf        db    100 dup (0)        ; область для хранения имени
;--------------------------------------------------------------------------
;         Список параметров для ввода значения ключа
;--------------------------------------------------------------------------
bloc equ 8                ; константа размера блока кодирования
key_choose    label    byte            
nkeylen        db    bloc +1            ; максимальная длина
ankeylen    db    bloc +1            ; фактическая длина
nkey        db    bloc +1 dup (0)        ; область для хранения значения
;--------------------------------------------------------------------------
 
nbuf        db    bloc +1 dup (0)        ; область для хранения значения
;--------------------------------------------------------------------------
 
 
;               Дескрипторы фаилов
;--------------------------------------------------------------------------
handle1        dw    ?            ; дескриптор исходного файла
handle2        dw    ?            ; дескриптор нового файла
;--------------------------------------------------------------------------
;               Прочие данные
;--------------------------------------------------------------------------
ERRID        db      0            ; флаг ошибки
temp1        db    bloc +1 dup ('0')        ; для хранения блока данных
 
 
;--------------------------------------------------------------------------
;        Начало основного тела программы
;--------------------------------------------------------------------------
.code
start:
    mov    ax,@data    ; инициализация
    mov    ds,ax        ; сегментных  
    mov    es,ax        ; регистров
    
 
    call    ENTERING    ; вызов процедуры ввода с клавиатуры
GO:    
    call    OPENF        ; вызов процедуры открытия файла
    cmp    ERRID,0        
    jnz    ProgEX
    call    KEY_NUMBER        ; ввод ключа
    cmp    ERRID,0
    jnz    ProgEX
    call    CREATEF        ; создание нового файла
    cmp    ERRID,0
    jnz    ProgEX
    call    KRYPT    ; запись нового файла
    cmp    ERRID,0    
    jnz    ProgEX
    call    CLOSEF        ; закрытие файлов
    cmp    ERRID,0
    jnz    ProgEX
    dispstr msg4        ; вывод конечного сообщения
ProgEX:
    mov    ah,8h        ; ожидание нажатия клавиши
    int    21h
    mov    ax,4C00h    ; завершение программы
    int    21h
 
;--------------------------------------------------------------------------
;        процедура ввода параметров  
;--------------------------------------------------------------------------
ENTERING proc
 
    dispstr msg1        ; вывод сообщения об имени исходного файла    
    entbuff inputfilepar    ; ввод имени
    call    CH_STR
    mov    bl,actlenin
    mov    bh,00
    mov    inputf[bx],0    ; установка символа конца имени файла
    mov al,bloc
    add al,30h
    mov [num],al    
    dispstr    msg3        ; запрос на ввод числа изменения
    entbuff    key_choose    ; запоминаем ключ в символьном виде
 
    call    CH_STR
    dispstr msg2        ; запрос на ввод имени выходного фаила        
    entbuff    outputfilepar    ; ввод имени
    call    CH_STR
    mov    bl,actlenout
    mov    bh,00    
    mov    outputf[bx],0    ; установка символа конца имени файла
    ret
ENTERING endp
 
;--------------------------------------------------------------------------
;             процедура открытия файла
;--------------------------------------------------------------------------
 
OPENF    proc    
 
    mov    ah,3Dh
    mov    al,00
    lea    dx,inputf
    int    21h        ; открытие файла
    jc    OPER        ; переход в случае ошибки
    mov    handle1,ax    ; запоминание дескриптора файла
    jmp    OPEN
OPER:    
    dispstr    OUTERR        ; вывод сообщения об ошибке
    mov    ERRID,01    ; запись факта ошибки
OPEN:
    ret
OPENF    endp
 
;--------------------------------------------------------------------------
;         процедура перехода на следующую строку  
;--------------------------------------------------------------------------
 
CH_STR    proc    
    mov     ah, 02h
    mov     dl, 0Ah
    int     21h        ; переход на следующую строку
    mov     ah, 02h
    mov     dl, 0Dh
    int     21h        ; возврат каретки
    ret
CH_STR    endp
 
;--------------------------------------------------------------------------
;         процедура перевода сканкода ключа в числ0
;--------------------------------------------------------------------------
 
KEY_NUMBER    proc
    xor    cx,cx        ; зануление счетчика         
    mov    cl,ankeylen    ; загружаем длину строки    
    xor    ax,ax        ; обнуляем регистры ax и dx
    lea    si,nkey        ; загружаем адрес начала символов значения
    lea     di,nkey
Trans:
    lodsb            ; загружаем символ в al  
    sub    al,49        ; перводим в число    
    jc    KEYERR    
    cmp    al,7        ; дальность пермещения не может быть больше чем (рзмер блока - 1)  
    ja    KEYERR
    stosb                    ; загружаем переведенные числа опять в ту же стороку
    loop    Trans        
    jmp    KEYEX    
KEYERR:
    call    CH_STR        ; перевод строки
    dispstr NUERR        ; сообщение об ошибке
    mov    ERRID,01        ; запись факта ошибки
    jmp    KEYEX
KEYEX:
    ret
KEY_NUMBER    endp
 
 
;--------------------------------------------------------------------------
;             процедура создания файла  
;--------------------------------------------------------------------------
 
CREATEF    proc    
                
    lea    si,inputf    ; сравниваем имена входного и выходного файлов
    lea    di,outputf
    xor    cx,cx
    mov    cl,80
    cld
    repe    cmpsb        ; посимвольная проверка имен фаилов
    jz    CКER        ; если одинаковые - ошибка
CR:
    mov    ah,5Bh        
    mov    cx,00
    lea    dx,outputf
    int    21h        ; создаем новый файл
    jc    CКER        ; переход, если произошла ошибка создания или фаил с таким именем существует
    mov    handle2,ax    ; сохраняем дескриптор файла
    jmp    CREATE
CКER:    
    dispstr CREAERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
CREATE:
    ret
CREATEF    endp
 
;--------------------------------------------------------------------------
;             процедура закрытия файла
;--------------------------------------------------------------------------
CLOSEF    proc    
    mov    ah,3Eh
    mov    bx,handle1    ; загружаем дескриптор  
    int    21h        ; закрываем файл
    mov    bx,handle2    ; загружаем дескриптор  
    int    21h        ; закрываем файл
    jc    CLOUTERR
    jmp    CLOSE1
CLOUTERR:
    dispstr CLOERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки    
CLOSE1:
    ret
CLOSEF    endp
 
 
;--------------------------------------------------------------------------
;     процедура кодирования
;--------------------------------------------------------------------------
 
KRYPT    proc
begwrite:
    mov    ah,3Fh        
    mov    bx,handle1    ; Файловый номер
    mov    cx,bloc    ; считываем bloc байт в память
    lea    dx,temp1
    int    21h        ; считываем значения в память, начиная со смещения temp1
    jc    KRYPTERR
    cmp    ax,0        ; проверяем сколько байт считано
    je    endwr        ; если  0, то файл закончился
    push     ax
 
    cmp    ax,bloc        ; проверяем сколько байт считано
    jb    ewr        ; если  <bloc, то не кодируем
 
    mov     cx, bloc
    lea    di,temp1    ; загружаем в di адрес начала блока данных
    lea    si,nkey        ; загружаем адрес начала ключа
    lea    bx,nbuf
    
changing:
    mov    al,[di]        ; заносим в al текущийц байт данных
    mov    ah,[si]        ; помещаем текущее значение ключа
    push     bx
    push      ax
    mov     al,ah
    xor     ah,ah
    add     bx,ax
    pop     ax
    mov     [bx],al        ;помещаем текучий байта в байт из буфера с номером взятым из  ключа
    pop     bx
    inc     di
    inc     si
                                        ;курсач гори в аду
    loop    changing
 
    
    mov    ah,40h
    mov    bx,handle2    ; загружаем дескриптор нового файла
    pop     cx        ; записываем число обработанных байтов в счетчик    
    lea    dx,nbuf
    int    21h        ; переписываем в новый файл
    jc    WRIERR
    jmp    begwrite
 
ewr:
    mov    ah,40h
    mov    bx,handle2    ; загружаем дескриптор нового файла
    pop    cx        ; записываем число обработанных байтов в счетчик    
    lea    dx,temp1
    int    21h        ; переписываем в новый файл
    jc    WRIERR
    jmp    begwrite
 
KRYPTERR:
    dispstr REAERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
    jmp endwr
WRIERR:
    dispstr WRERR        ; сообщение об ошибке
    mov    ERRID,01    ; запись факта ошибки
endwr:
    ret    
KRYPT    endp
 
 
end start
 
С уважением Лев.

Всего записей: 11 | Зарегистр. 26-08-2008 | Отправлено: 15:24 22-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
то есть чтоб под досом при копировании большую нагрузку на винт не делать из за буфера в 32 кбайта, сделал буфер в 10 мб xms памяти, сначала 10 мб файла копируется туда а потом оттуда а получается медленнее

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 15:27 22-04-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz

Цитата:
вторая утилита на копировании 1 гигового файлы в рам диск (который создан в этой самой XMS памяти) тратит 20 секунд а из рамдиска на диск 22-23 секунды.

а если сложить числа?

Всего записей: 11564 | Зарегистр. 03-08-2008 | Отправлено: 16:05 22-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну я об етам и гавару, что если я сам использую память - получается 48 секунд, а если использую память рам диска 42 (20+22)
 
Добавлено:
а с расширеным флагом - большие размеры до 4 гиг вообще гавно получается, файл 3.3 гига копируется 5 минут
 
Добавлено:
а под использую память рам диска надо понимать, что вызывает 13 прерывание, его рамдиск перехватывает, совершенно не оптимальным как у меня (исходник есть) образом перемещает блоки и делает это быстрее. буфера менял .. ниче в голову не лезет

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:07 22-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну пачиму такая ж может получаться    
 
по всякому код менял, выравнивал границу, выделял память, делал смещение по всякому. без памяти 42 сек, с памятью 47, в тоже время сначала на рамдиск потом из рамдиска 42 сек. куда эти пять секунд деются

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:03 22-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
немного не в этом причина была, удалось причину не найти а только выделить.
каким то чудесным образом самым неоптимальным образом практически с ошибками написал код - один любой байт меняешь начинает копировать на 5 сек медленнее. причем ниче не помогает, nop-ы вставляешь все равно. только так или никак

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 02:09 24-04-2012
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
   mov     dh, [es:484h]
Зачем квадратные скобки, и без них работает ведь?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 19:29 24-04-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
адрес значит

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:31 24-04-2012
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
Но без них работает?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 19:32 24-04-2012
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно так, можно и не так, а можно и этак
нотация такая...
а есть такие случаи, в кот. только со скобками...
аналог
 
a = b * c + d
a = b * (c + d)

Всего записей: 24121 | Зарегистр. 06-12-2002 | Отправлено: 19:34 24-04-2012 | Исправлено: akaGM, 19:37 24-04-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru