[ASM] Zapis danych

0

Poczytałem trochę o zapisie danych. Na podstawie tego napisałem kod, ale nie wiem co wpisać w niektórych miejscach. Kod:

mov ah, 0Bh
mov al, 01h
mov ch,     ;tutaj powinien być numer cylindra
mov cl,     ;a tu numer sektora
mov dh,     ;no a tu numer glowicy
mov dl, 80h
int 13h

Więc jakie numery trzeba podać żeby wszystko działało?

0

na prawdę chcesz zapisywać coś na twardym dysku za pomocą bezpośredniego dostępu do sektorów? wiesz ze jeżeli masz tam jakiś system operacyjny to jest to operacja niebezpieczna dla danych?

jeżeli jednak jesteś tego pewny to
http://www.ctyme.com/intr/rb-0626.htm

0

może lepiej używać systemowego zapisu danych, tj funkcje dosu albo calle do api?

0

Panowie chyba nie śledzicie wątków lukasz1235 na forum ;)

Zapewne chodzi o dostęp do dysku w momencie gdy system jest nieodpalony. Sposób, który zaprezentowałeś jest zbyt stary. Najlepiej skorzystać z trybu rozszerzonego przerwania 13h i nie bawić się w obliczanie pozycji sektora względem głowicy i ścieżki. Więcej poczytasz tu http://en.wikipedia.org/wiki/INT_13

0
ADuch napisał(a)

jeżeli jednak jesteś tego pewny to
http://www.ctyme.com/intr/rb-0626.htm

Właśnie tą stronę czytałem.

CyberKid napisał(a)

Sposób, który zaprezentowałeś jest zbyt stary. (...) Więcej poczytasz tu http://en.wikipedia.org/wiki/INT_13

Może i stary, ale mi wystarcza. Jakbym chciał zrobić coś lepszego to skorzystałbym z systemu plików. Na tej stronie nie ma nic więcej niż na stronie podanej przez ADuch.

0

Na podanej przeze mnie stronie jest opisany sposób na zapisanie danych bez obliczania cylindrów i całej reszty, bo zakładam, że o te numery Ci chodzi. To samo jest opisane w serwisie, do którego link podał ADuch http://www.ctyme.com/intr/rb-0710.htm :)

0
CyberKid napisał(a)

http://www.ctyme.com/intr/rb-0710.htm
Za bardzo tego nie łapię :/ Może jakiś przykład?

0

Może tak, adres cylinder, głowica, sektor ( CHS ) jest to adres fizyczny na nośniku jednego sektora ( domyślnie 512 bajtów ) danych. Cyberkid podaje alternatywny sposób adresowania tak zwany LBA, czyli coś jak mapowanie macierzy trójwymiarowej na macierz jednowymiarową ;-) Czyli np jeśli twój dysk ma 2-głowice, na każdej głowicy 80 cylindrów, a na każdym cylindrze 18 sektorów to masz kolejno na dysku
CHS(0,0,1) - LBA(1)
CHS(0,0,2) - LBA(2)
..
CHS(0,0,18) - LBA(18)
CHS(0,1,1) - LBA(19)
itd

Wróćmy jednak do pytania z wątku co podać jako CHS. Jak widzisz jest to dokładny adres małego bloku pamięci fizycznej, co dany blok adresuje zależy tylko i wyłącznie od systemu plików, więc musisz sprecyzować co chcesz osiągnąć

0
ADuch napisał(a)

Cyberkid podaje alternatywny sposób adresowania tak zwany LBA
Wróćmy jednak do pytania z wątku co podać jako CHS. Jak widzisz jest to dokładny adres małego bloku pamięci fizycznej, co dany blok adresuje zależy tylko i wyłącznie od systemu plików, więc musisz sprecyzować co chcesz osiągnąć

Jeszcze popatrzę o LBA. Chodzi mi o to, że nie mam na razie żadnego systemu plików, a tylko chce zapisać w danym miejscu 512b. W sumie już prawie wiem co wpisać. Zabrałem się za kodowanie i mam takie coś:

  mov ah, 0Bh
  mov al, 01h
  mov ch, 1
  mov cl, 2
  mov dh, 1
  mov dl, 80h
  mov bx, zapis
  mov es, bx
  int 13h

;zmienna
zapis:   db 'jakis tekst',0

I takie coś nie działa :-( Co robię źle?

0
  mov ah, 0Bh
  mov al, 01h
  mov ch, 1
  mov cl, 2
  mov dh, 1
  mov dl, 80h
  mov bx, cs
  mov es, bx
  mov bx, zapis
  int 13h

zapis DB 'tekst'
0

Też nie działa :-( Nic nie zapisuje :-(

0

a w jakim środowisku to uruchamiasz?

0

W VMware Server

0

a próbowałeś wcześniej użyć tej funkcji, przed zapisem http://www.ctyme.com/intr/rb-0624.htm ?

0

Niestety, nie działa :-(

Dopisane:
Zająłem się LBA. Nie rozumiem gdzie trzeba wpisać adres LBA :-( Mam taki kod:

mov ah, 43h
mov al, 08h
mov dl, 80h
mov bx, cs
mov si, zapis
mov ds, si
int 13h
;zmienna
zapis db 'jakis tekst'
  1. Jak już mówiłem: Gdzie wpisać adres LBA?
  2. Jeszcze coś innego jest źle, bo po uruchomieniu systemu działa ok 2 sekundy, a potem się restartuje komputer (oczywiście ten wirtualny ;-) )</b>
0

Nie umiecie czy nie chcecie mi pomóc?

0
lukasz1235 napisał(a)

Nie umiecie czy nie chcecie mi pomóc?

lukasz1235 napisał(a)

Gdzie wpisać adres LBA?

http://www.ctyme.com/intr/rb-0710.htm napisał(a)

DS:SI -> disk address packet (see #00272)

#00272 napisał(a)

Format of disk address packet:

Offset Size Description (Table 00272)
00h BYTE size of packet (10h or 18h)
01h BYTE reserved (0)
02h WORD number of blocks to transfer (max 007Fh for Phoenix EDD)
04h DWORD -> transfer buffer
08h QWORD starting absolute block number
(for non-LBA devices, compute as
(Cylinder*NumHeads + SelectedHead) * SectorPerTrack +
SelectedSector - 1
10h QWORD (EDD-3.0, optional) 64-bit flat address of transfer buffer;
used if DWORD at 04h is FFFFh:FFFFh

Żadna filozofia ;)

0
CyberKid napisał(a)

Żadna filozofia ;)
Może dla ciebie, bo dla mnie trochę niezrozumiałe. Proszę o gotowca. Nie to, że idę na łatwiznę, bo naprawdę tego nie rozumiem :-(

1 użytkowników online, w tym zalogowanych: 0, gości: 1