Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Kiintolevyn käyttö

remontti-reiska [15.02.2005 20:15:32]

#

Miten voin käyttää Assemblyllä kiintolevyä datan tallentamiseen? Luin keskeytyksistä, mutta haluaisin kuitenkin vielä pientä valaistusta, riskialtistahan tuo on.

Antti Laaksonen [15.02.2005 20:54:03]

#

Oletan nyt, että tarkoitat x86-assemblyä ja ohjelmoit DOSissa. Tiedostoihin voi kirjoittaa ja niistä voi lukea helposti muutamalla keskeytys 21h:n alatoiminnolla. Näillä saa jo paljon aikaan:

Ei tuo kyllä minusta juuri sen vaarallisempaa ole kuin muillakaan kielillä.

remontti-reiska [15.02.2005 21:24:03]

#

Tässä tapauksessa ei ikävä kyllä saisi käyttää DOS:n keskeytyksiä. BiOS:n mielummin.

sqwiik [16.02.2005 20:21:15]

#

Siinä tapauksessa kysymykseen tulee BIOS:n keskeytys 13 (Diskette BIOS services).

INT 13 - Diskette BIOS Services

Krisu [17.02.2005 12:28:46]

#

Kiintolevyä yksinään voi käyttää datan tallentamiseen tuon 13h:n avulla... tiedostojärjestelmätukea BIOS ei tarjoa (=et voi kirjoittaa helposti vaikka tiedostoa "C:\HAKE\TIEDOSTO.TXT"... etkä edes "C:\TIEDOSTO.TXT").

Jos ihan kovalevyä haluat käyttää, niin tuolla int13h:lla homma hoituu.

Tiedostoja pääset käyttämään rakentamalla ajurin tiedostojärjestelmää varten. Suosittelisin FAT16/32 -ajuria, sillä semmosen uskoisin olevan toteutettavissa vielä melko helposti.

Tuota keskeytystä 13h käyttämällä et onnistu kirjoittamaan turvallisesti. Sopivassa rekisterissä oleva väärä arvo saattaa aiheuttaa varsin ikävät vahingot levylle.
Itse suosittelisin diskettien käyttämistä... Ei tarvitse kovalevyä uhrata kokeiluille =)

Btw.. Mihin tarvitset tämmöstä kiintolevyajuria? Kasaatko käyttistä?

remontti-reiska [17.02.2005 15:08:37]

#

Eli minulla on buuttidiski. Miten voisin kirjoittaa vaikka sille dataa sitten? Käyttiskysymykseen en vastaa mitään :).

Krisu [18.02.2005 16:55:14]

#

Tässä pieni esimerkki... kuten yleensä...
1) En ota vastuuta tämän koodin aiheuttamista vahingoista
2) Emulaattori on sopivin paikka ajamiseen =)

; Poista kommentti seuraavista sen edestä, jonka haluat tehdä...
; mov ah, 2 	; Lue
; mov ah, 3 	; Kirjoita
mov al, 1	; Lue/kirjoita yksi sektori (512 tavua)
mov ch, 0 	; Sylinteri
mov cl, 1 	; Sektori
mov dh, 0 	; Lukupää
mov dl, 0 	; Asema (0 = levykeasema)
mov bx, cs 	; Kirjoitettavan/luettavan tiedon sijainti muistissa cs:0x8000
mov es, bx
mov bx, 0x8000
int 13h

Tämä koodi ei sitten ole mitenkään erityisen turvallista...
Enkä ole varma toiminnasta... Tuo CHS osoite tähtää muistaakseni juuri levykkeen FAT -taulukon alkuun, joten osa levykkeellä olevista tiedostoista saattaa menettää toimintansa.
---------------------------------

Levyn lukemiseen kannattaa tehdä myös tuommoinen LBA (Logical base address) -> CHS (Cylinder, Head, Sector) -muunnos.

Levykeasema käyttää CHS osoitetta, joissa on erillisinä sylinteri, lukupää ja sektori. Paljon kätevämpi on kuitenkin yhdistetty osoite (LBA), josta voidaan laskea CHS.

Tutoriaalin tuommoisen toteuttamisesta saat täältä

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta