asembler,dyskietka i bootsektor

0

Witam
Pisze w asemblerze program ,który zapisuje coś na dyskietke i mam
dwa pytania ,które dla starych wyjadaczy zapewne są błachostką.
1)Jak programowo sprawdzić czy dyskietka jest zabezpieczona przed zapisem?
2)Jak programowo sprawdzić czy w stacji jest dyskietka?
Z góry dzieki.

0

czy dyskietka jest w stacji sprawdza odpowiednia funkcja - na razie nie podam jaka bo jestem poza domem a nie pamietam. a sprawdzic czy jest zabezpieczona to mozna poprzez probe utworzenia pliku - jezeli sie uda to niezabezpieczona (usunac utworzony plik), a jazeli sie nie uda to znaczy ze zabezpieczona...

0

oki znalazłem kod błędu który mowi,że dyskietka jest zabezpieczona przed zapisem.(Tej funkcji ,o dyskietkaktórej piszesz ,sprawdzającej czy jest w stacji ,nie mogę znależć)
Teraz niestety pojawił się problem innego typu

przy pomocy funkcji 02h przerwania 13h wczytuje bootsektor dyskietki do pamieci.
0d 4 do 11 bajtu bootsektora powinna być nazwa systemu jako łańcuch
ASCII.Odczytuje go znak po znaku i wyswietla mi sie coś takiego:
+!MseIHC

co może być zle? Na90% odczytuje prawidłowe bajty

0

sprawdziłeś, czy w ogóle czytasz z dyskietki, i czy próba odczytu nie kończy się błędem? piszesz pod DOS, czy któregoś Windowsa?

0

Na Bank czytam z dyskietki,ponieważ wszytskie inne pozycje boot sektora się zgadzają, a zapisaną pod 36h
nazwę typu fat odcztuje normalnie jako FAT12.

Co do błędów to nie ma przy odczycie żadnego (flaga CF=0).

PS. nadal nie mogę znależć funkcji ,która sprawdza czy w stacji jest dyskietka.

0

I w biosie takiej funkcji nie znajdziesz. Jeśli dyskietki nie ma to funkcje czytające/zapisujące zwracaja błąd... Najlepszym sposobem jest chyba int 21h ah=4eh (findfirst z cpp/pascal)

//albo jeszcze lepiej pobranie info o wolnej przestrzeni... int 21h ah=36h, dl=nr dysku (0 roboczy, 1 - a , 2 - b, 3 -c , ...)- zwraca ax=ffffh gdy blad.

0

zarzuć kodem

0

czytanie sektora

SECTOR_READ_DOS MACRO Buffer ,Sector_Num,ile
XOR AL,AL ;okreťl numer stacji dyskˇw
MOV DX, Sector_Num ;ustaw logiczny numer sektora do
;odczytu
MOV CX, ile ;okreťl liczbŕ sektorˇw do odczytu
;(tu - 1)
MOV BX, OFFSET Buffer ;za│aduj offset bufora operacji
INT 25h ;wywo│aj program odczytu sektorˇw
POPF
ENDM

instrukcja wywołania powyższego makra

SECTOR_READ_DOS boot ,0 ,1


wypisanie nazwy

;--nazwa systemu
mov bx,offset boot
add bx,03h
pisz sys ;macro pisz wypisuje danyc tekst
wypisz 9 ;

wypisz MACRO ile
LOCAL wroc;
mov cx,ile
wroc:
mov dl,[bx]

mov ah,02h
int 21h
inc bx
loop wroc

ENDM

Czy o to chodziło?

0

a nie lepiej użyć przerwania 13h ??

http://www.ctyme.com/intr/rb-0607.htm

0

Na samym początku próbowałem 13 ,efekt był ten sam.

(w czym 13h jest lepsze od 25h?)

//
No dobra w przypadku 1 dyskietki na 5 nazwa systemu została wyświetlona poprawnie,więc to raczej nie jest wina programu a raczej dyskietek(może zalezy jak były formatowane). Nie będę udawał ,ze wiem dlaczego tak jest.Dzięki za zainteresowanie tematem ,generalnie
juz dowiedziałem się czego potrzebowałem.

0

To ja na koniec tylko odpowiem na to Twoje pytanie dotyczące różnicy 13h i 25h. Tak więc przerwanie 13h to przerwanie BIOSu i używając go prawie bezpośrednio odczytujesz dane z dysku, natomiast 25h to przerwanie DOSa więc pomyślałem, ze to z nim jest coś nie tak.

Acha, do takich zabaw przydałby Ci się jakiś programik potrafiący czytać dowolne sektory z dysku i stacji dyskietek, wtedy byś wiedział co powinien odczytać Twój program. Polecam Norton Diskedit.

0

Podepnę się do wątku:
a może ktoś mi powiedzieć jak odczytać cokolwiek z dyskietki ??? potrzebuje np offset 3600

0

przerwanie 13h

0

ze przerwanie 13h to wiem :)

mam takie cos:

mov AH,02H ; read sector service number
mov AL,01H ; number of sectors to read
mov DL,00H ; drive number 0=a: floppy drive
mov DH, 0 ; set the head
mov CH, 0 ; set the track
mov CL, 1 ; set the sector
mov bx,offset bufor
int 13H ; BIOS Disk services

i nie dziala :(

mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!

takie komendy rowniez nie dzialaja
potrzebuje dobrac sie do FAT12 aby "przekopiowac" plik ale niestety nic nie moge odczytac :(
gdy wpisuje powyzsze linie kodu w trakcie debugowania wychodzi do windowsa

0

A, że tak zapytam, jakiego windowsa używasz?

0

mam XP i 98 a takze DOSa

0

Udało się coś przeczytać, jednak zastanwiam się do którego rejestru mam wpisać poczatkowy sektor od ktorego chce czytać i w jakim formacie 0200 to sektor 2 czy 02h wystarczy ?
Kolejna sprawa czy do bufora typu db moge zaladowac tylko dwa sektory 2x512 ?

pozdrawiam

0
flabra napisał(a)

I w biosie takiej funkcji nie znajdziesz. Jeśli dyskietki nie ma to funkcje czytające/zapisujące zwracaja błąd... Najlepszym sposobem jest chyba int 21h ah=4eh (findfirst z cpp/pascal)

//albo jeszcze lepiej pobranie info o wolnej przestrzeni... int 21h ah=36h, dl=nr dysku (0 roboczy, 1 - a , 2 - b, 3 -c , ...)- zwraca ax=ffffh gdy blad.

0
Zenon napisał(a)

ze przerwanie 13h to wiem :)

mam takie cos:

mov AH,02H ; read sector service number
mov AL,01H ; number of sectors to read
mov DL,00H ; drive number 0=a: floppy drive
mov DH, 0 ; set the head
mov CH, 0 ; set the track
mov CL, 1 ; set the sector
mov bx,offset bufor
int 13H ; BIOS Disk services

i nie dziala :(

mov bx, 0
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!

takie komendy rowniez nie dzialaja

Takie coś mi działa:

mov ah,02h               ;When ah=, int13 reads a disk sector
mov al,4			 	 ;Al is how many sectors to read
mov ch,0			 	 ;The track to read from
mov cl,2			 	 ;Sector Id
mov dh,0			 	 ;Head
mov dl,0			 	 ;Drive (0 is floppy)
mov bx,0x1000	 ;Es and Bx put together are where to load the program too (see jmp 0x1000:0x00)
mov es,bx
mov bx,0x100
int 13h					;Int 13 is all functions for disks

jmp 0x1000:0x100

KOd pochodzi stąd:http://www.free2code.net/plugins/articles/read.php?id=36

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