2016-06-26 2 views
-4

Mon système d'exploitation est maintenant en mode protégé, donc je ne peux pas accéder au disque en utilisant des interruptions maintenant. Et je ne sais pas comment passer en mode v86. accès au disque.Erreur de lecture/écriture du disque à l'aide de ports dans l'assemblage

J'ai décidé d'essayer le code que j'ai trouvé sur le forum.osdev.org.Dans l'émulateur, il montre disque lire ou écrire avec succès.Mais quand je vérifie le disque dur, il est vide ou quand je teste la lecture, Buffer est tout vide.

Quel est le problème avec ce code ou mon O/S? (Peut-être Stack problème causes?) CODE:

set_up_buffer: 
xor ax,ax 
mov es,ax 
mov di,[buffer] 
mov al,0xCD 
stosb 
mov al,0x19 
     stosb 
     WriteToMbr: 
     mov  dx,1f6h   ;Drive and head port 
     mov  al,0a0h   ;Drive 0, head 0 
     out  dx,al 

     mov  dx,1f2h   ;Sector count port 
     mov  al,1   ;Write one sector 
     out  dx,al 

     mov  dx,1f3h   ;Sector number port 
     mov  al,1   ;Wrote to sector one 
     out  dx,al 

     mov  dx,1f4h   ;Cylinder low port 
     mov  al,0   ;Cylinder 0 
     out  dx,al 

     mov  dx,1f5h   ;Cylinder high port 
     mov  al,0   ;The rest of the cylinder 0 
     out  dx,al 

     mov  dx,1f7h   ;Command port 
     mov  al,30h   ;Write with retry. 
     out  dx,al 
    oogle: 
     in  al,dx 
     test al,8   ;Wait for sector buffer ready. 
     jz  oogle 

     mov  cx,512/2  ;One sector /2 
     mov  si,[buffer] 
     mov  dx,1f0h   ;Data port - data comes in and out of here. 
     rep  outsw   ;Send it. 
     leave 
     ret 
buffer: 
times 512 db 0 
+1

Ne liez pas votre code, afficher en ligne, alors les gens peuvent aider. –

+0

Comment quelqu'un pourrait vous dire ce qui ne va pas avec votre système d'exploitation. Vous ne nous avez rien montré à ce sujet. –

+0

@SepRoland Expérimenté O/S développeur peut deviner quelque chose à ce sujet – user2590769

Répondre

1

mov si, [buffer] semble mal, car il déplace le contenu du tampon, au lieu de l'adresse du tampon. Il devrait être mov si, buffer ou lea si, [buffer], je pense.

+0

Que dois-je faire alors? Pouvez-vous corriger le code? – user2590769

0

JE TROUVE LE PROBLÈME, Le problème était à rep outsw, j'ai donc écrit un code de boucle qui envoie des mots au registre de données sans cette commande. OK Voici le code que j'ai écrit dans pascals:

uses ...; 
var 
RawData:array[0..255] of Word; 
ATA_INDEX:Integer; 
implementation 
//... 
function DiskReadSector(Drive,Head,Cylinder,SecNum:integer):Integer;stdcall; 
var 
xstat:Word; 
i:integer; 
BaseAdress:Word; 
begin 
if ATA_INDEX=0 then 
BaseAdress:=$1f0 else 
BaseAdress:=$170; 
outb(BaseAdress+6,$0a0 or (Drive shl 4) or head); 
outb(BaseAdress+2,1);//Count 
outb(BaseAdress+3,SecNum);// Sector Number 
outb(BaseAdress+4,Cylinder and $00FF);//LOW Cylinder 
outb(BaseAdress+5,Cylinder shr 8);//HIGH Cylinder 
outb(BaseAdress+7,$20);//READ COMMAND $30 for WRITE 
asm //CHECK FOR DATA READY 
mov dx,1f7h 
@still_going: 
in  al,dx 
test al,8   
jz  @still_going   
end; 
for i:=0 to 255 do begin //COPY DATA TO WORD ARRAY 
xstat:=inw(BaseAdress); 
RawData[i]:=xstat; 
end; 
DiskReadSector:=inb(BaseAdress+7);//DEBUG 
end 

Utilisation:

procedure kmain;stdcall;[public,alias:'kmain']; 
begin 
//... 
ATA_INDEX:=0;//Zero for Primary Others for Secondary 
DiskReadSector(0,0,0,1);//Drive 0 for Master 1 for Slave Example: 
//ATA_INDEX=0 and Drive=0 it means Primary Master 
//This Code Will Read Master Boot Record of IDE Primary Master 
//a simple check for boot signature of first sector at primary master: 
if RawData[255]=$AA55 then 
WriteLn('Boot Signature Detected!'); 
end; 
+0

Vous devriez publier le code mis à jour * ici [dans votre réponse] (http://stackoverflow.com/posts/38050286/edit) *. –

+0

@CodyGray vous heureux maintenant? – user2590769