Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
1

Скопировать уцелевшие сектора диска

30.11.2016, 12:50. Просмотров 364. Ответов 7
Метки нет (Все метки)

хочу скопировать уцелевшие сектора.
примерный план действий
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
org 100h
 
loopa:
 
mov dl,[numSrc]
mov si,[pa]
mov ah, 42h; Расширенное чтение
int 13h
 
mov dl,[numDst]
mov si,[pa]
mov ah, 43h; Расширенная запись
int 13h
 
;сравнить с endLBA
endprg: jz endprg
 
;инкремент begLBA
jmp loopa
 
pa:
size db 10h
rez0 db 0
numsec db 1
rez1 db 0
buff dw sec
begLBA dq 0
exBuff dq 0
 
endLBA dq 976773168
numSrc db 0
numDst db 0
 
sec db 512 dup(?)
Как правильно обработать bad block? Если при чтении возникнет bad block нужно ли делать сброс (функцию 0)? Или можно просто приступить к следующему блоку? Вроде бывают какие то зависания в Victoria при встрече с bad block.

в Victoria 3 Nvidia Name/ID 0AD0 class INT BASE D480 ALT D402 - это какое значение для numSrc надо проставить (регистр dl для 42 функции 13 прерывания)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2016, 12:50
Ответы с готовыми решениями:

Сектора диска
Программа запрашивает например дискету или диск, и пользователь вводит сектор ...

Разработать программу замены обозначенного участка заданного сектора диска
Народ, кто знает, как решить эту задачу? Очень прошу, напишите, пожалуйста, код...

dosbox и считка сектора
народ вроде все правильно написал, почему не читает сектор? мб dosbox глючит?...

Форматирование сектора дискеты
Программа должна форматировать дискету не полностью, а только дорожка 9 сектор...

Формат boot-сектора NTFS
Расскажите, пожалуйста, какой формат у загрузочного сектора NTFS. Прочитал...

7
Ethereal
4531 / 1824 / 236
Регистрация: 17.02.2013
Сообщений: 2,718
30.11.2016, 13:35 2
Цитата Сообщение от Archi0 Посмотреть сообщение
Как правильно обработать bad block? Если при чтении возникнет bad block нужно ли делать сброс (функцию 0)?
Обычно, если запрос на чтение сектора вернул ошибку, то повторяют попытку чтения сколько-то раз. Например 3 или 5 или 8 или больше, если такие упорные. Иногда бывает, что сектор все таки прочтется, пусть не с первой попытки, но прочтется. Если все 3 или 5 или 8 попыток были безуспешными, то считают, что сектор убит наглухо и переходят к следующему.

Делать сброс перед очередной попыткой прочитать сбойный сектор не повредит. Есть ли в этом смысл для жестких дисков не знаю, но хуже не будет. При чтении дискет именно так и делали - если не прочлось с первого раза, то сброс и еще попытка. При сбросе происходило позиционирование головки на дорожку заново. Т.е. головка перемещалась на нулевую дорожку и от нее снова шаговый двигатель отщелкивал ее на текущую. При чтении дискет это имело смысл определенно. Вдруг сектор не читается именно из-за неточного позиционирования головки, механизм все равно ведь какой-то люфт имеет, поэтому перепозиционируем головку, вдруг она встанет удачнее и прочтется.
2
R71MT
4331 / 1410 / 300
Регистрация: 29.07.2014
Сообщений: 2,455
Записей в блоге: 5
30.11.2016, 23:00 3
Цитата Сообщение от Archi0 Посмотреть сообщение
это какое значение для numSrc надо проставить (регистр dl для 42 функции 13 прерывания)
В регистре(DL) указывается номер устройства(80-83h).
В поле "numSrc" указывается кол-во блоков для чтения. Поле действительно, если "numsec" установлен в FFh (включить линейную адресацию), а у тебя это поле имеет значение(1).

Чтобы обработать ошибку, нужно после INT-13h проверять AH, куда возвращается код состояния. Портянка с ошибками для AH там большая, где код(0Ah) означает "Обнаружен сбойный сектор!". Почитай описание расширенных функций..

А вообще, я бы читал через виндозный драйвер:
Код
  Открыть диск:  CreateFile с именем [\\.\с:]
Читать секторы:  DeviceIOControl
        Ошибка:  GetLastError
0
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
01.12.2016, 06:07  [ТС] 4
Попробовал в виртуальной машине прочитать один сектор получаю B3h Том используется.
0
R71MT
4331 / 1410 / 300
Регистрация: 29.07.2014
Сообщений: 2,455
Записей в блоге: 5
01.12.2016, 06:32 5
..в реальном режиме надо тестить
0
Jin X
4631 / 1379 / 162
Регистрация: 14.12.2014
Сообщений: 2,627
Записей в блоге: 8
Завершенные тесты: 2
01.12.2016, 16:39 6
Archi0, во-первых, не mov si,[pa], а mov si,pa (если это FASM, для него, кстати, специальный раздел создан на форуме). DS:SI указывает на адрес пакета.
Во-вторых, структура описана неверно. В частности, buff - это не ближний адрес, а дальний, т.к. он должен содержать ещё и сегмент:
Assembler
1
2
buff dw sec
buffseg dw ?
и в самом начале кода:
Assembler
1
mov buffseg,ds
Про numSrc уже сказали...
p.s. Вообще, по-хорошему, надо ещё проверку сделать ah=41h/int 13h (по крайней мере, если есть опасение, что прога может быть запущена на старых системах)

Добавлено через 5 минут
Цитата Сообщение от Archi0 Посмотреть сообщение
Попробовал в виртуальной машине прочитать один сектор получаю B3h Том используется.
Возможно, из-за указанных выше ошибок.
На виртуально машине - под DOS или под Win95?
Попробуй вот ещё:
under Windows95, a volume must be locked (see INT 21/AX=440Dh/CX=084Bh)
in order to perform direct accesses such as INT 13h reads and writes
И ah=45h/int 13h:
--------d-1345-------------------------------
INT 13 - IBM/MS INT 13 Extensions - LOCK/UNLOCK DRIVE
AH = 45h
AL = operation
00h lock media in drive
01h unlock media
02h check lock status
DL = drive number
Return: CF clear if successful
AH = 00h
AL = lock state (00h = unlocked)
CF set on error
AH = error code (see #00234)
Notes: this function is required to be supported for any removable drives
numbered 80h or higher
a device may be locked even if no media is present in the drive
up to 255 locks may be placed on a drive, and the media will not
be physically unlocked until all locks have been removed
SeeAlso: AH=41h"INT 13 Ext",AH=46h,AH=49h,INT 15/AH=52h"INT 13 Extensions"
2
R71MT
4331 / 1410 / 300
Регистрация: 29.07.2014
Сообщений: 2,455
Записей в блоге: 5
02.12.2016, 03:26 7
бивис -= хрень...
читай портами.

Добавлено через 31 минуту
Цитата Сообщение от Jin X Посмотреть сообщение
Во-вторых, структура описана неверно
+1 Маны для кого пишут? ХЗ?! ТС литру читай...
0
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
02.12.2016, 06:46  [ТС] 8
Исправил
1. структуру, добавил dw
2. убрал строку в которой портил значение регистра, которое печатал на экран (по факту печатал B800 AH = B8)
3. Исправил ошибку в самой функции печатающей регистр на экран (вместо B8 печаталось B3)

Функция чтения сектора теперь возвращает 00

Добавлено через 58 минут
вывел первый сектор на экран получил знакомые 55AA в конце этой строки.
0
02.12.2016, 06:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2016, 06:46

Чтение загрузочного сектора под Windows
Требуется считать загрузочный сектор с диска (fdd,hdd,flash,cd) при чтении с...

Поврежденные сектора диска D:\
Привет! У меня ноут Samsung R21. До недавнего времени все было ОК. Но вот...

Битые сектора жесткого диска
Здравствуйте! Ноутбук Lenovo b570e, винт WDC WD3200BPVT-24JJ5T0. Проверил жд...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru