powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / asm и низкоуровневое чтение сектора hdd
12 сообщений из 12, страница 1 из 1
asm и низкоуровневое чтение сектора hdd
    #37625156
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Прошу помощи в нелёгком освоении asm.
Пытаюсь освоить работу с оборудованием через порты из asm.
Вот написал почти 1 в 1 со статьи, но не работает (на выходе получаю в памяти вместо первого сектора кучу FFFFh)

Что я делаю не так как надо? буду очень благодарен за любые подсказки и ссылочки.

Итак, сам код:
Код: plaintext
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.
.model tiny
.586p
.code
org 100h
start:
 push 0E00h ; lba 16..27 пол байта параметров 0Eh
 push 0000h ; lba 0..15
 push 01f0h ; передаём базовый порт hdd
 call read_sector
ret

read_sector proc
 push ax ; сохраняем используемые регистры
 push dx
 push bp
 push bx
 push cx
 push di
  mov ax, sp ; устанавливаем базу на смещение данных в стэке
  add ax, 14d
  mov bp, ax
  mov bx, ss:[bp] ; теперь bx указывает на базовый порт hdd
  mov dx, bx ; направляем dx на порт состояния hdd (у нас 03F6h)
  add dx, 0206h
  mov al, 2h ; запрещаем прерывания данному устройству
  out dx, al
  push bx ; базовый адрес портов hdd 
  call wait_bsy ; ждём освобождение канала
  mov dx, bx ; записываем в dx 01F6h
  add dx, 6h 
  mov al, ss:[bp+5] ; вытягиваем из стэка с байтом LBA[24-27] и пол байтом параметров 1110b
  or al, 0E0h ; для уверенности что используется система LBA адресации
  out dx, al ; выбираем устройство
  push bx
  call wait_bsy ; ждём освобождение канала
  push bx
  call wait_dsdy ; ждём готовность устройства принять команду 
  mov dx, bx ; читать будем только 1 сектор сообщаем об этом через порт 01F2h
  add dx, 2d
  mov al, 1h
  out dx, al
  inc dx ;              LBA[0-7] пишем в 01F3h
  mov al, ss:[bp+2]
  out dx, al
  inc dx ;              LBA[8-15] пишем в 01F4h
  mov al, ss:[bp+3]
  out dx, al
  inc dx ;              LBA[16-23] пишем в 01F5h
  mov al, ss:[bp+4]
  out dx, al
  mov dx, bx ; записываем в dx 01F7h и отправляем в этот порт команду 20h (чтение сектора)
  add dx, 7d
  mov al, 20h
  out dx, al
  mov dx, bx ; отправляем в стэк номер альтернативного регистора состояния - 7 (функция добавит автоматом)
  add dx, 01FFh
  push dx
  call wait_bsy ; ждём пока канал занят
  push bx
  call wait_hdd_data ; ждём готовность информации
  cld
  lea di, sect_buff ; направляем ds:di на буффер для чтения сектора
  mov cx, 100h
  mov dx, bx
  rep insw
  mov dx, bx
  add dx, 01FFh ; разрешаем прерывания
  mov al, 0h
  out dx, al
 pop di ;         восстанавливаем использованые регистры
 pop cx
 pop bx
 pop bp
 pop dx
 pop ax
 ret 6d
read_sector endp

wait_bsy proc ;   процедура ожидания освобождения канала
 push ax
 push dx
 push bp
  mov ax, sp ; читаем порт 1f7h пока 7-ой бит равен 1
  add ax, 8d
  mov bp, ax
  mov dx, ss:[bp]
  add dx, 7h
  @waiting:
   in al, dx
   test al, 80h
   jnz @waiting
 pop bp
 pop dx
 pop ax
 ret 2d
wait_bsy endp

wait_dsdy proc ; процедура ожидания готовности к приёму команд
 push ax
 push dx
 push bp
  mov ax, sp ; читаем порт 1f7h пока 6-ой бит равен 0
  add ax, 8d
  mov bp, ax
  mov dx, ss:[bp]
  add dx, 7h
  @waiting:
   in al, dx
   test al, 40h
   jz @waiting
 pop bp
 pop dx
 pop ax
 ret 2d
wait_dsdy endp

wait_hdd_data proc ; процедура ожидания готовности информации
 push ax
 push dx
 push bp
  mov ax, sp ; читаем порт 1f7h пока 3-ой бит равен 0
  add ax, 8d
  mov bp, ax
  mov dx, ss:[bp]
  add dx, 7h
  @waiting:
   in al, dx
   test al, 08h
   jz @waiting
  mov dx, ss:[bp]
  add dx, 1h
  in al, dx
 pop bp
 pop dx
 pop ax
 ret 2d
wait_hdd_data endp

 sect_buff db 200h dup (?) ; буффер для чтения сектора
end start
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #37625160
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Кстати, может ли как-то на результат повлиять то, что я сижу с ноута? (хотя сам я думаю что нет)
Может ли как-то повлиять то, что винчестер на 300GB, то есть может адрес должен быть 32-битным? но когда как с ними работать...

Заранее благодарен
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #37625218
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я неправильно вопрос задал? )) Хоть что-то подскажите пожалуйста... какие-нить предложения... А то не могу понять ошибку.
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #37625230
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Програмёр,
это не будет работать в современных операционках. Надо из дос
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #37625248
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?,

дак в том то и дело, что запускаю то я в досе... винда мне вообще не позволила бы записать что либо в порт)

но за ответ спасибо
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #37625721
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, кажется понемногу проясняется...
На одном умном сайте прочитал, что обслуживание sata устройств (каковым и является мой hdd) немного отличается от устройств IDE(ATA). Там вроде как всё просходит по тому же принципу, только базовый порт имеет другой номер, а все остальные располагаются относительно него по тем же "смещениям". так вот... также там написано как сканировать шину PCI на расположение устройств (то есть нахождение базовых портов устройств)... Жалко всё на английском... я его плохо знаю.

Вот ссылочка PCI bus info and code from a programmer's perspective.

Вообщем буду разбираться, переводить... но если у кого есть ссылочки на русском, или какие-нить идеи/подсказки, буду очень благодарен...
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096326
NeoMatrixRoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр, Добрый день. Меня интересует вы решили эту проблему? Сейчас передо мной стоит такая же.
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096354
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoMatrixRoomПрограмёр, Добрый день. Меня интересует вы решили эту проблему? Сейчас передо мной стоит такая же.
Добрый. По ссылке выше есть хорошая документация по получению данных об устройствах. Когда разбирался, смог выйти на нужное устройство, считать все данные об устройстве, но вот с чтением данных из устройства у меня всё же были какие-то проблемы (то ли мне hdd говорил всегда что он занят, толи ... не помню уже). Вообщем из-за недостатка времени (хватало на поесть, поспать и поработать) забросил. Но в принципе за 2-3 полноценных дня тему раскурить можно полностью (тем более если не на асме) ;)
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096360
NeoMatrixRoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не на асме. Можно на словах, что делать :) Можно на С. Но времени в обрез осталось, 12 часов :)
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096439
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoMatrixRoomНе на асме. Можно на словах, что делать :) Можно на С. Но времени в обрез осталось, 12 часов :)
Если время так ограничено, могу предположить, что есть какое-то явное задание. Просто разобраться в теме за такое время будет сложно (я в инете документацию неделю искал, пока нашёл нормальное описание PCI интерфейса, структуру описания функций устройств и т.д.). Могу предложить посмотреть в сторону bios функций. Он прерывания предлагает для работы с устройствами и всё такое. просто для меня это был чисто спортивный интерес :). Просто сейчас мало что подсказать смогу, дело то было год назад... я уже последовательность действий забыл.
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096483
NeoMatrixRoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр,

Да задание вывести информацию о SATA диске. Использовать нужно порты.
...
Рейтинг: 0 / 0
asm и низкоуровневое чтение сектора hdd
    #38096546
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoMatrixRoomПрограмёр,

Да задание вывести информацию о SATA диске. Использовать нужно порты.
ссылка вышеBUS EQU 0
DEV EQU 7
FN EQU 3
VEN_ID EQU 0 ; vendor ID=PCI regs 0,1
PCI_INDEX EQU 0CF8h
PCI_DATA EQU 0CFCh
.386
mov ax, 8000h ; set bit 31 (after shift)
or al, BUS ; add in bus number
shl eax, 16
mov ax, DEV
shl ax, 11 ; slide device # up to bits 15:11
mov al, FN
or ah, al ; add function into bits 10:8
mov al, VEN_ID
cli
mov dx, PCI_INDEX
out dx, eax ; send our request out
mov dx, PCI_DATA
in eax, dx ; read back 32bit value.
sti


Remember that PCI registers are 8 bit values. The above read from PCI_DATA reads a 32bit value, or 4 PCI registers. In the above example, after the read, EAX = device ID, AX = vendor ID.
Per the PCI specification, the vendor ID is always registers 0 and 1, and the device ID is registers 2 and 3.
Thus, AL=register 0, AH=register 1, EAL=register 2, EAH=register 3.

Так можно получить инфу о любом устройстве. осталось только отыскать устройство с нужной функцией (то есть sata hdd... как я понимаю это делается по id устройства... не помню уже. я свой хард по производителю искал :) ). Тут пример для получения первых четырёх байт структуры (id производителя и id устройства... там ещё есть куча всего. Надо искать инфу). больше подсказать не могу к сожалению...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / asm и низкоуровневое чтение сектора hdd
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]