Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
1

Инвертирование информации на дискете

26.05.2012, 19:58. Показов 1202. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Объясните, пожалуйста, каким образом решить следующую задачу: "Инвертировать информацию на дискете, т.е. инвертировать биты".
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2012, 19:58
Ответы с готовыми решениями:

Подсчитать количество кластеров на дискете
Здравствуйте, подскажите как подсчитать количество кластеров на дискете? Но основная задача как...

Каков реальный размер первичного загрузчика в дискете?
Читаю кулакова. структура MBR такова: jmp_boot - 3 bytes OEM_name - 8 bytes ... BPB_ToSec32 -...

Вывод на экран сообщение о размере свободного пространства на дискете
вот код запускаю вроде все работает , но ввод с клавиатуры не происходит, в чем причина? Вот как...

Что надо записать в СX, чтобы получить нужный сектор и дорожку на дискете.
Хочу получить с 19 сектора 15 секторов. Пишу: mov ax,20Fh mov bx,100h mov ch,1;дорожка mov...

15
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
26.05.2012, 20:07 2
Not...
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 20:08 3
На всей дискете или только в определенном файле на дискете?
0
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
26.05.2012, 20:09  [ТС] 4
Хм, хотелось бы поподробнее.

Добавлено через 35 секунд
Цитата Сообщение от AFP Посмотреть сообщение
На всей дискете или только в определенном файле на дискете?
На всей.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 20:12 5
Цитата Сообщение от Бродяга Посмотреть сообщение
На всей.
А как тогда посмотреть результат, если boot и fat будут инвертированы?
Или только содержимое всех файлов?
0
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
26.05.2012, 20:15  [ТС] 6
AFP, извините, неточно выразился =) Информация на всех файлах должна быть инвертирована.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 20:24 7
ДОС функции найти первый, совпадающий с шаблоном файл, открыть файл, создать и открыть временный файл, прочитать первый файл, инвертировать содержимое, записать во временный файл, удалить файл, закрыть временный файл, переименовать временный файл, найти следующий файл и так по кругу, пока не будет найден последний файл. Как-то так. Возможны нюансы.

Наверное, все же будет лучше без временных файлов. А то они тоже будут найдены и их содержимое инвертируется на правильное содержание.
1
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
26.05.2012, 20:36  [ТС] 8
AFP, благодарю. А нюансы... что можете о них конкретнее сказать?

Добавлено через 4 минуты
[QUOTE=AFP;3085251]ДОС функции найти первый, совпадающий с шаблоном файл, открыть файл, создать и открыть временный файл, прочитать первый файл, инвертировать содержимое

И еще один вопрос: как проходит процесс инвертирования, то есть какие используются команды для этого, например, в TASM'е?
Можете привести небольшой пример кода, чтобы было нагляднее, или указать источник, где можно узнать об этом? Спасибо.

Добавлено через 1 минуту
Цитата Сообщение от AFP Посмотреть сообщение
Наверное, все же будет лучше без временных файлов. А то они тоже будут найдены и их содержимое инвертируется на правильное содержание.
То есть сразу же изменять открытый файл?
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 20:37 9
Нюансы могут возникнуть только уже при написании или отладке программы. Не всегда получается так как задумывалось в начале.

Вам уже подсказали. Команда NOT.
0
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
26.05.2012, 20:42  [ТС] 10
AFP, спасибо)
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 20:43 11
Цитата Сообщение от Бродяга
То есть сразу же изменять открытый файл?
Да, применяя функцию изменение указателя чтения/записи.
0
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 6
29.05.2012, 10:40  [ТС] 12
Всем привет! Недавно с помощью этого форума понял как написать решение вот этой задачи: "Инвертировать информацию на дискете" (инвертируются только те сектора, которые не относятся к FAT и загрузочному сектору), но возникла проблема: сбилденный экзешник работает очень долго и при этом после завершения компьютер не реагирует на дискету. Привожу код- что наваял. (писал на Турбо ассемблере) Гляньте, пожалуйста, кому не сложно: в чем ошибка?

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
ssg segment para stack 'stack'      ;  Заголовок определения стека 
dw 512 dup(?)                       ;  Задание глубины стека
;DB 400h DUP(?)
ssg ends                            ;  Конец сегмента стека
 
;-----------------------------------
 
datasg segment para 'data'          ;  Заголовок определения данных
 
SectorDataBuffer DB 512 DUP (?)     ;  Буфер для сектора
;   Адрес сектора при считывании
Cylinder DB ?                       ;  Номер цилиндра
Head DB ?                           ;  Номер головки
Sector DB ?                         ;  Номер сектора
;   Предельные значения координат
MaxCylinder DB 79                   ;  Максимальный номер цилиндра       
MaxHead DB 1                        ;  Максимальный номер головки
MaxSector DB 18                     ;  Максимальный номер сектора
 
ends                                ;  Конец сегмента
 
;-----------------------------------
 
codesg segment para 'code'          ;  Заголовок сегмента кода
begin proc far                      ;  Начало программы, основная процедура
 
;   Заголовок для exe-программы
assume cs:codesg,ds:datasg,ss:ssg    
push    ds                              
sub ax,ax                              
push    ax                                
mov ax,datasg                         
mov ds,ax                            
 
;   Основное тело
call    Clearscr                    ;  Вызов процедуры очистки экрана
call    ReadBootSector              ;  Вызов процедуры чтения загрузочного сектора
 
mov ax,0B800h
mov es,ax
 
;   Цикл по секторам
Repeat:                                     
call    ReadInvertSector            ;  Вызов процедуры чтения/инвертирования сектора
 
mov al,[Sector]
cmp al,[MaxSector]              ;  Если номер сектора максимален,
jae IncHead                     ;  переходим по метке, 
inc [Sector]                    ;  если нет - увеличиваем номер сектора
jmp Repeat                      ;  и продолжаем инвертировать, переходя по метке 
 
IncHead:
mov al,[Head]
cmp al,[MaxHead]                ;  Если номер головки максимален,
jae IncCylinder                 ;  переходим по метке,
inc [Head]                      ;  если нет - увеличиваем номер головки, 
mov [Sector],1                  ;  номер сектора - 1
jmp Repeat                      ;  и продолжаем инвертировать, переходя по метке
 
IncCylinder:                  
mov al,[Cylinder]
cmp al,[MaxCylinder]            ;  Если номер цилиндра максимален,
jae EndProc                     ;  заканчиваем, переходя по метке,  
inc [Cylinder]                  ;  если нет - увеличиваем номер цилиндра, 
mov [Head],0                    ;  устанавливаем головку на 0,
mov [Sector],1                  ;  сектор - на 1
jmp Repeat                      ;  и продолжаем инвертировать, переходя по метке
 
;   Выход из цикла по секторам  
EndProc:                              
mov ax,3
int 10h
mov ah,4Ch
int 21h                    
 
ret
begin endp                          ;  Конец основной процедуры
 
;-----------------------------------
 
;   Вспомогательные процедуры
 
;   Очистка экрана
Clearscr proc near
 
mov ax,0600h                    ;  Прокрутка
mov bh,07Н                      ;  Цвет экрана/фон символа (черно/белый)
mov cx,0000                     ;  Левый верхний угол
mov dx,184FH                    ;  Правый нижний угол
int 10h                         ;  Передача управления в БИОС
    
ret
Clearscr endp
 
;-----------------------------------
 
;   Чтение загрузочного сектора
ReadBootSector proc near
 
mov [Cylinder],0
mov [Head],0
mov [Sector],1
;   Определить и запомнить параметры дискеты
mov     al,[SectorDataBuffer+18h]
mov     [MaxSector],AL
mov     al,[SectorDataBuffer+1Ah]
dec     al
mov     [MaxHead],al
int 13h
 
ret
ReadBootSector endp
 
;-----------------------------------
 
;   Чтение и инвертирование текущего сектора
ReadInvertSector proc near
 
;pushad
push    es
mov     ax,ds
mov     es,ax
mov     si,3                        ;  Счетчик повторений
Repeat2:
mov     bx,offset SectorDataBuffer
mov     ah,2                        ;  Прочесть сектор
mov     al,1                        ;  Прочесть 1 сектор
mov     ch,[Cylinder]               ;  Устанавливаем номер текущего цилиндра,
mov     cl,[Sector]                 ;  сектора,
mov     dh,[Head]                   ;  головки.
mov     dl,0                        ;  Читаем диск "А"
int     13h
jnc     EndProcer
;   Ошибка считывания, повторить считывание сектора
mov     ah,0                       
mov     dl,0                        ;  Диска "А"
int     13h
dec     si                          ;  Уменьшить счетчик на 1
jnz     Repeat2
;   Нормальное завершение процедуры
EndProcer:  
not SectorDataBuffer            ;  Инвертирование сектора 
;   Перезапись сектора
mov     ah,03h                      
mov     al,1                        
mov     ch,[Cylinder]
mov     cl,[Sector]
mov     dh,[Head]
mov     dl,0
lea bx,SectorDataBuffer                         
int     13h
 
pop     es
;popad
 
ret
ReadInvertSector endp
 
;-----------------------------------
 
codesg ends
end begin                           ;  Конец программы
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
29.05.2012, 14:35 13
В коде детально не разбирался, но есть вопрос.
Две копии FAT и корневой каталог учитывали?
Инвертировать надо не сектор, а каждый байт сектора. Прочитать каждый байт сектора, инвертировать их и записать уже инвертированый сектор обратно.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
29.05.2012, 15:39 14
Цитата Сообщение от AFP Посмотреть сообщение
А как тогда посмотреть результат, если boot и fat будут инвертированы?
А можно прогу написать, которая будет показывать содержимое.
Бродяга наверное вирус пишет.

Добавлено через 2 минуты
Цитата Сообщение от Бродяга Посмотреть сообщение
Гляньте, пожалуйста, кому не сложно: в чем ошибка?
А ты что, не знаешь, что кроме FAT есть ещё элементы каталога, без которых не куды.
0
156 / 53 / 4
Регистрация: 28.05.2012
Сообщений: 120
29.05.2012, 18:17 15
Не заметил, что обсуждение ушло на вторую страницу.
Вот ссылка, для работы на секторном уровне. http://www.cyberguru.ru/progra... age31.html
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
31.05.2012, 19:58 16
Работает в окне ДОС и в чистом ДОСе.
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
;TASM, COM-файл
.model tiny
.code
.386
org 100h
start:
    mov ah,32h  ;дать инфу о диске
    mov dl,1    ;дисковод
    lea bx,buf  ;куда записать инфу
push ds
    int 21h
 
    mov dx,[bx+0Bh] ;начальный сектор данных диска
pop ds
    mov [Begin],dx  ;стартовый сектор для чтения/записи
    mov ax,80*2*18  ;дорожки*стороны*секторов=всего секторов на диске
    sub ax,dx   ;отнять системную область
    mov [G_sek],ax  ;итого секторов для операций
 
;Посчитать число секторов для одной операции*
    mov cx,512  ;байт в секторе
    mov ax,0FA00h   ;размер буфера для чтения/записи*
    xor dx,dx
    div cx
    mov [Sek],ax    ;сохранить число
 
    mov dx,[Begin]  ;стартовый сектор
Read:
    mov al,0    ;дисковод
    mov cx,[Sek]    ;секторов для чтения
    lea bx,buf  ;адрес буфера
    int 25h     ;читать
    pop ax      ;убрать мусор из стека
 
push cx dx      ;сохранить стартовый сектор и число секторов
    mov si,bx   ;установить регистры для строковых операций
    mov di,si
    mov ax,512  ;байт в секторе*число прочитаных секторов=
    mul cx
    mov cx,ax   ;=счетчик циклов
m1:
    lodsb       ;читать символ в AL
    not al      ;инвертировать
    stosb       ;записать обратно
    loop m1     ;повторить
pop dx cx       ;вернуть параметры
 
    mov al,0
    int 26h     ;записать на диск
    pop ax
 
    cmp word ptr [G_sek],0  ;проверить флаг конца операций
    jz short exit
 
    add dx,cx   ;DX-на следующий сектор
    sub [G_sek],cx  ;уменьшить остаток не обработанных секторов
    cmp [G_sek],cx  ;сравнить остаток с обработанными
    jg short Read   ;если меньше...
    mov ax,[G_sek]  ;берем остаток и
    mov [Sek],ax    ;записать для функций чтения/записи
    mov [G_sek],0   ;установить флаг конца операций
    jmp short Read  ;читать остаток секторов
exit:
;
    ret
Begin   dw  ?   ;начальный сектор для чтения/записи
G_sek   dw  ?   ;общее число секторов для чтения/записи
Sek dw  ?   ;число секторов на одну операцию
buf:            ;буфер
    end start
0
31.05.2012, 19:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2012, 19:58
Помогаю со студенческими работами здесь

Как сделать так чтобы файл на жестком диске и на дискете 1.44 мб весил одинаково
Как сделать так чтобы файл на жестком диске и на дискете 1.44 мб весил одинаково.(мы работаем через...

Напишите основные элементы, которые должны быть на дискете для того, чтобы она была системной?
Напишите основные элементы, которые должны быть на дискете для того, чтобы она была системной?

инвертирование
Подскажите как инвертировать шестнадцатеричное число , но не всё , а первые 8-мь разрядов? Например...

Инвертирование
Добрый день, решаю тесты. Подскажите можно ли ввести input n раз, когда n=input() и можно ли эти...

Инвертирование
Добрый день решаю тесты, вроде все сделал, но выдаёт ошибку line = input() n = int(input())...

Инвертирование массива
Описать процедуру Invert(A,N), меняющую порядок следования элементов массива A из N вещественных...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru