2016-06-26 5 views
-4

My O/S теперь находится в защищенном режиме, поэтому я не могу получить доступ к диску с помощью прерываний. И я не знаю, как переключиться в режим v86. Мне нужно использовать порты для доступ к диску.Ошибка чтения/записи диска с использованием портов в сборке

Я решил попробовать код, который я нашел на forum.osdev.org. В эмуляторе он показывает, что чтение или запись диска успешно завершено. Но когда я проверяю жесткий диск, он пуст или когда я проверяю чтение, Buffer все пусто.

В чем проблема с этим кодом или моим O/S? (Может быть Stack Проблема Причины этого?) КОД:

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

Не ссылайтесь вам код, разместить его рядный, то люди могут помочь. –

+0

Как кто-нибудь может сказать вам, что не так с вашей ОС. Вы ничего нам не показали. –

+0

@SepRoland Опытный O/S Разработчик может что-то догадаться – user2590769

ответ

1

mov si, [buffer] кажется неправильным, так как он перемещает содержимое буфера, вместо адреса буфера.

Должно быть mov si, buffer или lea si, [buffer], я думаю.

+0

Что мне делать? Вы можете исправить код? – user2590769

0

Я НАЙДЕНО ПРОБЛЕМА, Проблема была в rep outsw, поэтому я написал код цикла, который отправляет слова в регистр данных без этой команды. OK Вот код, который я написал в паскале:

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 

Использование:

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

Вы должны опубликовать обновленный код * здесь [в своем ответе] (http://stackoverflow.com/posts/38050286/edit) *. –

+0

@CodyGray ты счастлив сейчас? – user2590769