Anonymní profil Paulí An – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Paulí An – Programujte.comAnonymní profil Paulí An – Programujte.com

 

Příspěvky odeslané z IP adresy 90.176.121.–

Paulí An
Assembler › LBA32 v čistém assambleru pr…
2. 8. 2009   #113968

Dobrý den,
prosím Vás o pomoc.

Mám stále jeden a ten samej problém. Hledám všude na netu, píšu do různých forech pro assembler a odesílám e-maily programátorům, ale nikde jsem zatím nenašel odpověď.

V assembleru (kompiluji přes Nasm) si vyrábím boot loader (kod v boot sektoru). Chtěl bych z HDD do RAM (a nazpět) načíst velké množství dat (třeba až 500MB). Metoda CHS by pro mě byla moc zdlouhavá (čtení tak po 70sektorech a přecházení do protected či flat mode, atd.) a omezovalo se to na malé velikosti HDD a navíc musím počítat hlavy atd.
Slyšel jsem o metodě LBA32, která je schopna pracovat s diskem až do kapacity 8 bilionů TB a prý nepotřebuje přechod do protected či flat mode pro přístup k 4GB RAM paměti. Jenže, jak tuto metodu použít ?
Na internetu ( http://www.icq.unas.cz/download/zos.htm ) jsem našel kod, ale nepodařilo se mě ho zprovoznit:



;ES:BX - adresa alokované paměti
MOV AH,42H ; funkce pro čtení dat LBA
MOV DL,80H ; disk
MOV SI,OFFSET(LBA) ; ofsetová část struktury
MOV WORD PTR [Adr][2],ES ; segmentová cílová adresa
MOV WORD PTR [Adr][0],BX ; ofsetová cílová adresa
INT 13H ; volání služby BIOSu
NOP ; prázdná instrukce

LBA: ; struktura LBA paketu
VelPack DB 10H ; velikost paketu
Rez DB 00H ; rezervováno
VelBlk DW 0001H ; velikost bloku k přenosu
Adr DD 00000000H ; cílová adresa buferu
Pozice DQ 000000000009D5BFH ; hodnota LBA32
AdrEMS DB 08H DUP(0) ; adresa rozšířené paměti


A jeden maník na foru mi napsal tohle, ale taky jsem nezprovoznil:


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


Tak už si teda fakt nevím rady.

Pro CHS, jsem dokázal ukuchťat toto a funguje to:


; funkce na přečtení 2. sektoru boot zařízení do 0:8000
mov ax,0h
mov es,ax
mov ah,02h ; čtení dat
;mov dl,80 ; zařízení - již je v paměti
mov dh,0h; číslo hlavy
mov cx,1 ; číslo sektoru+cylindru
mov al,1 ; pocet sectoru k nahrani
mov bx,8000h
; adresa = 0:8000
int 13h ; volání služeb biosu


Jak by vypadal podobně zapsaný kod, ale pro LBA32 ?

Děkuji moc za pomoc.
S pozdravem Paulí.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý