Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 16.03.2018
Сообщений: 40
TASM

Просмотр содержимого каталогов, перемещение каталогов

28.05.2018, 14:10. Показов 1321. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И снова я,но может кто-нибудь, последний раз выручить меня с ассемблером ?
Осталось сделать последнее задание. На форуме уже видела вопросы по поводу такого задания, но коды там не рабочие.
Нужно написать программу для просмотра содержимого каталогов и и перемещения каталогов.
Нашла код для тасма:
Assembler
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
CODESG SEGMENT PARA 'CODE'
  ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
  ORG 100H
BEGIN:  JMP MAIN
  A     DB '1 - Создать каталог',10,13,'2 - Удалить каталог',10,13,'3 - Изменить каталог',10,13,'$'
 NUMB  DB,?
 
  dname db "d:\my_diг",0
  PATH     DB   "d:\new",0
 
MAIN  PROC  NEAR
 
  MOV AH,03H
  MOV BH,AL
  INT 10H
 
  MOV AH,09
  LEA DX,A
 ; MOV AX, OFFSET A
  INT 21H
  MOV AH,01
  INT 21H
  MOV BH,AL
  
    cmp ax,1;сравниваем ах с 1
    je inc_a;если =
    cmp ax,2;сравниваем ах с 2
    je dec_a;если =     
    cmp ax,3;сравниваем ах с 3
    je three_a;если =   
          ;во всех остальных случаях        
    jmp done  ;уходим из проверок
 
 
    inc_a:
        mov ah,39h
        mov dx,offset dname
        int 21h
        jmp done ; теперь прыгаем на завершение
        
     dec_a:             ; сюда попадаем если ax=2
            mov ah,3ah
        mov dx,offset dname
        int 21h
        jmp done ; теперь прыгаем на завершение
 
    three_a:
        MOV  AH,3BH        ;номер функции
            LEA  DX,PATH       ;DS:DX должны указывать на путь
        INT  21H           ;устанавливаем текущий каталог
        
 
done:              ; все сделали. в ax лежит результат 
 
  MOV AH,02H
  INT 10H
 
    mov ah,01      ; ждем
    int 21h    ; нажатия клавиши
  
 
  RET
MAIN  ENDP
CODESG  ENDS
  END BEGIN
Но он не рабочий, проверяла. Выкидывает с программы или после выбора меню - просто выводит снова. Помогите, пожалуйста, исправить ошибки
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2018, 14:10
Ответы с готовыми решениями:

Перемещение содержимого из каталогов (tasm)
Добрый день. Задание следующее: создать программу для перемещения и просмотра содержимого каталогов на диске Код для просмотра и...

Создание программы для перемещения и просмотра содержимого каталогов на диске
Здравствуйте, ребята, не могли бы вы помочь в выполнении задания? Задание такое: создать программу для просмотра и перемещения каталогов...

Программа для перемещения и просмотра содержимого каталогов на диске
Добрый день. Задание следующее: создать программу для перемещения и просмотра содержимого каталогов на диске. Как просматривать файлы я...

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
29.05.2018, 17:16
Тут достаточно большой код может получиться.
Попробуйте разделить цель на несколько задач (меню, просмотр, перемещение).

Меню - самое простое.
Просмотр - чуть сложнее, но не очень - есть множество примеров
Вывести имена и подкаталоги первого уровня для каталога, заданного в проге
Заменить расширения всех файлов в текущей директории на расширение “.cul”
И очередное последнее задание Месяц создания первого файла

Это всё наиболее простое.

Уже перемещение нужно будет делать рекурсивно. Это не сложно, но нужно аккуратно. И займёт больше времени на набор и отладку.

Добавлено через 9 часов 8 минут
Так можно начать - это всего лишь меню и каркас программы.
Там где-то ошибка в вызове процедур из меню, но это легко найти.

Дальше нужно наращивать процедуры. Делать вывод каталога. Сначала по фиксированному адресу, а затем - по вводимому пользователем.
Именно вывод содержимого каталога много раз приводилось, и в FAQ присутствует.

И уже следующий этап - перенос. Тут придётся подумать.

В общем - исправьте ошибку в вызове и сделайте показ каталога. Я помогу с переносом
Assembler
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
.model small
 
.stack 100h
 
.data
        VideoPage       db      ?       ;активная видеостраница
        Columns         db      ?       ;количество сиволов в строке экрана
        Rows            db      ?       ;количество строк на экране
 
        CrLf            db      0Dh, 0Ah, '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
        asMenu          db      '1. Show dir', 0Dh, 0Ah
                        db      '2. Move dir', 0Dh, 0Ah
                        db      'Press Esc key to exit', 0Dh, 0Ah, '$'
        ;коды клавиш
        kbEsc           equ     01Bh
        ;список команд меню. Последняя команда - выход из программы
        CmdCount        equ     3
        cmdShowDir      equ     0
        cmdMoveDir      equ     1
        cmdExit         equ     2
        ;таблица указателей на процедуры выполнения пунктов меню
        ItemProc        label   word
                        dw      offset  ShowDir
                        dw      offset  MoveDir
        ;коды клавиш, соответствующие командам
        HotKeys         db      '1',            '2',            kbEsc
        HotCmd          dw      cmdShowDir,     cmdMoveDir,     cmdExit
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;перед установкой курсора на центр экрана понадобится уточнить
        ; - номер видеостраницы
        ; - количество колонок на экране
        ; - количество строк на экране
        ;часть данных получаем через видеосервис BIOS
        mov     ah,     0Fh     ;уточнить параметры видеорежима
        int     10h             ;
        mov     [VideoPage],bh  ;номер текущей видеостраницы
        mov     [Columns],ah    ;число текстовых колонок на экране
        ;часть данных получаем из области данных Video BIOS
        push    es
        mov     ax,     0040h   ;сегмент данных Video BIOS
        mov     es,     ax
 
        mov     al,     es:[0084h];количество строк на экране
        mov     [Rows], al
        pop     es
 
        ;программный цикл
        @@MenuLoop:
                call    ShowMenuItems
        @@GetCmd:
                call    GetCmd
                cmp     ax,     cmdExit
                ja      @@GetCmd
                je      @@Break
                lea     bx,     [ItemProc]
                add     bx,     ax
                call    [bx]
        jmp     @@MenuLoop
@@Break:
 
 
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
ShowMenuItems   proc
        ;очистка экрана
        mov     ah,     06h     ;функция SCROLL UP
        mov     bh,     07h     ;атрибут для заполнения
        mov     cx,     0000h   ;верхний левый угол окна
        mov     dx,     24*256+79
        int     10h
        ;курсор в левый верхний угол экрана
        mov     ah,     02h
        mov     bh,     0       ;видеостраница
        mov     dl,     0       ;столбец (от 0)
        mov     dh,     0       ;строка (от 0)
        int     10h
        ;вывод пунктов меню
        mov     ah,     09h
        lea     dx,     [asMenu]
        int     21h
 
        ret
ShowMenuItems   endp
 
GetCmd  proc
@@gcGetChar:
        mov     ah,     00h
        int     16h
 
        lea     si,     [HotKeys]
        lea     di,     [HotCmd]
        mov     cx,     CmdCount
        @@gcFor:
                cmp     al,     [si]
                jne     @@gcNext
                mov     ax,     [di]
                jmp     @@gcExit
        @@gcNext:
                inc     si
                add     di,     2
        loop    @@gcFor
        jmp     @@gcGetChar
@@gcExit:
        ret
GetCmd  endp
 
ShowDir proc
        ret
ShowDir endp
 
MoveDir proc
        ret
MoveDir endp
 
end     main
Добавлено через 8 часов 55 минут
-------------------------------------------------------------------------------------------
Меню сделать просто - я показал код в вашей теме.
Так выглядит "скелет" вашей программы из темы показать и/или перенести каталог
Assembler
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
.model small
 
.stack 100h
 
.data
        VideoPage       db      ?       ;активная видеостраница
        Columns         db      ?       ;количество сиволов в строке экрана
        Rows            db      ?       ;количество строк на экране
 
        CrLf            db      0Dh, 0Ah, '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
        asMenu          db      '1. Show dir', 0Dh, 0Ah
                        db      '2. Move dir', 0Dh, 0Ah
                        db      'Press Esc key to exit', 0Dh, 0Ah, '$'
        asShowDir       db      'Show dir', 0Dh, 0Ah, '$'
        asMoveDir       db      'Move dir', 0Dh, 0Ah, '$'
        ;коды клавиш
        kbEsc           equ     01Bh
        ;список команд меню. Последняя команда - выход из программы
        CmdCount        equ     3
        cmdShowDir      equ     0
        cmdMoveDir      equ     1
        cmdExit         equ     2
        ;таблица указателей на процедуры выполнения пунктов меню
        ItemProc        label   word
                        dw      offset  ShowDir
                        dw      offset  MoveDir
        ;коды клавиш, соответствующие командам
        HotKeys         db      '1',            '2',            kbEsc
        HotCmd          dw      cmdShowDir,     cmdMoveDir,     cmdExit
 
        ;маски атрибутов файлов
        faReadOnly      equ     01h
        faHidden        equ     02h
        faSystem        equ     04h
        faVolumId       equ     08h
        faDirectory     equ     10h
        faArchive       equ     20h
        ;описатель файла в стандартный вывод
        StdOut          equ     1
        ;каталог и маска для поиска
        WildCard        db      'd:\System\*.*', 0
        ;атрибуты файлов
        faAnyFile       dw      faReadOnly or faHidden or faSystem or faDirectory or faArchive
        ;новая область DTA для хранения результатов поиска
        NewDTA          label   byte
                        db      15h dup(?)
        dtaAttr         db      ?
        dtaTime         dw      ?
        dtaDate         dw      ?
        dtaFileSize     dd      ?
        dtaFileName     db      0Dh dup(?)
        dtaReserved     db      (80h-2Ch) dup(?)
        ;строка для вывода нумерации позиции имени файла или каталога
        Count           db      '000 ', '$'
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;перед установкой курсора на центр экрана понадобится уточнить
        ; - номер видеостраницы
        ; - количество колонок на экране
        ; - количество строк на экране
        ;часть данных получаем через видеосервис BIOS
        mov     ah,     0Fh     ;уточнить параметры видеорежима
        int     10h             ;
        mov     [VideoPage],bh  ;номер текущей видеостраницы
        mov     [Columns],ah    ;число текстовых колонок на экране
        ;часть данных получаем из области данных Video BIOS
        push    es
        mov     ax,     0040h   ;сегмент данных Video BIOS
        mov     es,     ax
 
        mov     al,     es:[0084h];количество строк на экране
        mov     [Rows], al
        pop     es
 
        ;программный цикл
        @@MenuLoop:
                call    ShowMenuItems
        @@GetCmd:
                call    GetCmd
                cmp     ax,     cmdExit
                ja      @@GetCmd
                je      @@Break
                lea     bx,     [ItemProc]
                add     bx,     ax
                add     bx,     ax
                call    [bx]
        jmp     @@MenuLoop
@@Break:
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
ShowMenuItems   proc
        ;очистка экрана
        mov     ax,     0600h           ;функция SCROLL UP
        mov     bh,     07h             ;атрибут для заполнения
        mov     cx,     0000h           ;верхний левый угол окна
        mov     dx,     24*256+79
        int     10h
        ;курсор в левый верхний угол экрана
        mov     ah,     02h
        mov     bh,     [VideoPage]     ;видеостраница
        mov     dl,     0               ;столбец (от 0)
        mov     dh,     0               ;строка (от 0)
        int     10h
        ;вывод пунктов меню
        mov     ah,     09h
        lea     dx,     [asMenu]
        int     21h
 
        ret
ShowMenuItems   endp
 
GetCmd  proc
@@gcGetChar:
        mov     ah,     00h
        int     16h
 
        lea     si,     [HotKeys]
        lea     di,     [HotCmd]
        mov     cx,     CmdCount
        @@gcFor:
                cmp     al,     [si]
                jne     @@gcNext
                mov     ax,     [di]
                jmp     @@gcExit
        @@gcNext:
                inc     si
                add     di,     2
        loop    @@gcFor
        jmp     @@gcGetChar
@@gcExit:
        ret
GetCmd  endp
 
ShowDir proc
        push    ax
        push    es
 
        mov     ax,     ds
        mov     es,     ax
 
        mov     ah,     09h
        lea     dx,     [asShowDir]
        int     21h
 
        ;Настройка DTA
        mov     ah,     1Ah
        lea     dx,     [NewDTA]
        int     21h
        ;Вызов FindFirst
        mov     ah,     4eh
        mov     al,     1               ;special flag for use by APPEND
        mov     cx,     [faAnyFile]     ;file attribute mask
        lea     dx,     [WildCard]      ;DS:DX -> ASCIZ file specification
        int     21h
@@Repeat:
        jc      @@FindStop      ;завершение поиска при отрицательном результате
 
        ;увеличение номера позиции на 1 (сложение в ASCII формате)
        lea     si,     [Count+2] ;адрес младшего разряда
        mov     cx,     3       ;количество знаков в числе
        mov     ax,     0
        add     byte ptr [si],  1       ;увеличиваем младший разряд на 1
@@Inc:                          ;цикл коррекции остальных разрядов при переносе
        mov     bl,     [si]
        sub     bl,     '0'
        add     al,     bl
        aaa
        add     al,     '0'
        mov     [si],   al
        mov     al,     ah
        mov     ah,     0
        dec     si
        loop    @@Inc
        ;вывод номера позиции
        mov     ah,     09h
        lea     dx,     [Count]
        int     21h
        ;вычисление длины строки с именем файла
        lea     si,     [dtaFileName]
        mov     cx,     0
@@FileNameLength:
        mov     al,     [si]
        inc     si
        inc     cx
        cmp     al,     0
        jne     @@FileNameLength
        dec     cx
        ;вывод имени файла/каталога
        mov     ah,     40h
        mov     bx,     StdOut
        lea     dx,     [dtaFileName]
        mov     cx,     cx
        int     21h
        ;перевод строки
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        ;FindNext
        mov     ah,     4Fh
        int     21h
        jmp     @@Repeat
@@FindStop:
 
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
        pop     es
        pop     ax
        ret
ShowDir endp
 
MoveDir proc
        push    ax
        mov     ah,     09h
        lea     dx,     [asMoveDir]
        int     21h
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
        pop     ax
        ret
MoveDir endp
 
end     main
Меню реализовано, как взаимодействие данных и кода.
Сам программный цикл:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        ;программный цикл
        @@MenuLoop:
                call    ShowMenuItems
        @@GetCmd:
                call    GetCmd
                cmp     ax,     cmdExit
                ja      @@GetCmd
                je      @@Break
                lea     bx,     [ItemProc]
                add     bx,     ax
                add     bx,     ax
                call    [bx]
        jmp     @@MenuLoop
@@Break:
И теперь сверху вниз.
Показать меню. Это многострочная переменная
Assembler
1
2
3
        asMenu          db      '1. Show dir', 0Dh, 0Ah
                        db      '2. Move dir', 0Dh, 0Ah
                        db      'Press Esc key to exit', 0Dh, 0Ah, '$'
И процедура, которая очищает экран и выводит эту переменную ShowMenuItems
Дальше - получение команды GetCmd. Там ожидание любой клавиши и поиск символа в массиве
Assembler
1
2
3
        ;коды клавиш, соответствующие командам
        HotKeys         db      '1',            '2',            kbEsc
        HotCmd          dw      cmdShowDir,     cmdMoveDir,     cmdExit
Видно, что массиву клавиш соответствует массив команд. Если клавиша найдена, то и в соседнем массиве по такому же индексу берётся команда.

Возвращаемся в командный цикл. Вызов процедуры, соответствующей команде. Это косвенный вызов. В таблице
Assembler
1
2
3
4
        ;таблица указателей на процедуры выполнения пунктов меню
        ItemProc        label   word
                        dw      offset  ShowDir
                        dw      offset  MoveDir
двум командам с номерами 0000h и 0001h соответствуют адреса процедур.
Берём смещение таблицы в bx, потом номер команды умножаем на 2 (т.к. между адресом процедуры команды 0 и адресом процедуры команды 1 - 2 байта. И вызываем процедуру
Assembler
1
2
3
4
                lea     bx,     [ItemProc]
                add     bx,     ax
                add     bx,     ax
                call    [bx]
Там ещё где-то проверка, что была команда выйти - по ней выходим.
2
1 / 1 / 0
Регистрация: 16.03.2018
Сообщений: 40
29.05.2018, 17:43  [ТС]
Спасибо огромное за помощь. Я уже пока как-то реализовала меню для двух программ, но почему-то по отдельности вторая работает, а в меню -нет) Сейчас с этим постараюсь разобраться, чтоб было как запасной вариант
И возьмусь тут переделывать. Спасибооо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2018, 17:43
Помогаю со студенческими работами здесь

Вывод иерархии каталогов на экран
Написал основное - но проблема в том что не работает дальнейший поиск(результат 4fh int 21h - нет больше каталогов,хотя они есть).Может кто...

Копирование файлов и каталогов
у МЕНЯ ТАКОЙ ВОПРОС а Можно ли Копирование файлы и каталоги написанной прогой на Ассемблере! Какими функциями выполняется копирование? ...

Перемещение и просмотр содержимого каталогов на диске
Написать на языке ассемблера программу для перемещения и просмотра содержимого каталогов на диске

Просмотр содержимого каталогов
Вообще нужно написать програмку для просмотра содержимого каталога. Имя каталога вводить с клавиатуры. Знаю что там нужно использовать...

Архивирование определённых файлов из разных каталогов с сохранением структуры этих каталогов
Здравствуйте. Суть задачи. Есть определенный каталог (C:\X), в котором в разных подкаталогах лежат различные файлы и папки (количество,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru