OSDev

для всех
Текущее время: 28 апр 2024, 08:58

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Загрузчик!
СообщениеДобавлено: 24 авг 2013, 23:04 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Здравствуйте уважаемые форумчане! Вообщем у меня возникла такая проблем-ка с сервисом дискового ввода/вывода... Проблема в том что bochs постоянно ругается на то что я читаю значение out of range, ну как я понимаю bochs говорит о том что я превысил рамки допустимого значения, но! отлаживая этот загрузчик через дебаггер все происходит нормально, и вроде бы я не выхожу за пределы, ну а bochs это не нравится =( может я туплю и написал че не так?
Код:
org 0

jmp start
nop

; BIOS Parameter Block
BS_OEMName              db      'CHSgavno'              ; 8 áàéò
BPB_BytsPerSec  dw      512                             ; êîë-âî áàéò â ñåêòîðå
BPB_SecsPerClus db      1                               ; êîë-âî ñåêòîðîâ â êëàñòåðå
BPB_RsvdSecCnt  dw      1                               ; êîë-âî ñåêòîðîâ â Reserved region
BPB_NumFATs             db      2                       ; êîë-âî òàáëèö FAT íà äèñêå
BPB_RootEntCnt  dw      224                             ;
BPB_TotSec16    dw      2880                            ; îáùåå êîë-âî ñåêòîðîâ íà äèñêå
BPB_Media               db      0xF0           
BPB_FATSz16             dw      9                       ; êîë-âî ñåêòîðîâ îäíîé FAT
BPB_SecPerTrk   dw      18                              ; ñåêòîðîâ íà äîðîæêå
BPB_NumHeads    dw      2
BPB_HiddSec             dd      0                       ; êîë-âî ñêðûòûõ ñåêòîðîâ
BPB_TotSec32    dd      0                       
BS_DrvNum               db      0
BS_Reserved1    db      0
BS_BootSig              db      0x29
BS_VolID                dd      948E33AAh
BS_VolLab               db      'NO NAME    '   ; èìÿ äèñêà
BS_FileSysType  db      'FAT12   '


ReadSecs:
push es bx ax di
.loop:
call LBACHS
mov ch, [Track]
mov cl, [Sector]
mov dh, [Head]
xor dl, dl
mov ax, 0201h
int 13h
jc .loop
pop di ax bx es
cmp di, 00h
jz .Ex
dec di
inc ax
add bx, 200h
push es bx ax di
jmp ReadSecs.loop
.Ex:
ret


LBACHS:
push dx ax
xor dx, dx
div [BPB_SecPerTrk]
mov [Tmp], al
inc dl
mov [Sector], dl
xor dx, dx
xor ax, ax
mov al, [Tmp]
div [BPB_NumHeads]
mov [Head], dl
xor dx, dx
xor ax, ax
mov al, [Tmp]
div [BPB_NumHeads]
mov [Track], al
pop ax dx
ret

Print:
pusha
mov ah, 0eh
@@:
lodsb
test al, al
jz @f
int 10h
jmp @b
@@:
popa
ret

start:
cli
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0FFFEh
sti
mov bx, 200h
mov di, 0eh
mov ax, 13h
call ReadSecs
xor ah, ah
int 16h
Track db 0
Head db 0
Sector db 0
Tmp db 0
db 510-($-$$) dup(0)
db 0x55, 0xAA


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 24 авг 2013, 23:54 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Не знаю, правильно ли работает преобразователь LBACHS, но ты для начала попробуй задать функции int 13h непосредственные значения в регистры прямо перед вызовом.


Последний раз редактировалось Himik 25 авг 2013, 00:06, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:01 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Himik писал(а):
Не знаю, правильно ли работает преобразователь LBACHS, но ты для начала попробуй задать функции int 13h непосредственные значения в регистры прямо перед вызовом.

Эммм, вот формулы которые я использую:
S = N mod SPT + 1
T = N / SPT
H = T mod Heads
C = T / Heads
Как не странно, но если прямо в регистры задавать, то все нормально... В чем же проблема :?: Попробую поэксперементировать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:07 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Задав все непосредственные значения, начинай по одному их убирать, тогда найдёшь какой параметр неправильный.
Я использовал такой преобразователь LBA в CHS, он на треть короче. На входе ax, на выходе регистры для прямой передачи в int 13. CH Cylinder, CL Sector, DH Head.
Код:
   mov   cx,[BPB_SecPerTrk] ;N / Smax
   xor   dx,dx
   div   cx
   push   dx ;Sector

   mov   cx,[BPB_NumHeads] ; / Hmax
   xor   dx,dx
   div   cx

   pop   cx ;Sector
   inc   cl
   mov   ch,al ;Cylinder
   mov   dh,dl ;Head


Я бы посоветовал переделать твою функцию так
Код:
ReadSecs:
.loop:
push es bx ax di
call LBACHS
mov ch, [Track]
mov cl, [Sector]
mov dh, [Head]
xor dl, dl
mov ax, 0201h
int 13h
pop di ax bx es
jc .loop
cmp di, 00h
jz .Ex
dec di
inc ax
add bx, 200h
push es bx ax di
jmp ReadSecs.loop
.Ex:
ret

переместив push и pop внутрь цикла, иначе повторение будет происходить с испорченными регистрами.


Последний раз редактировалось Himik 25 авг 2013, 00:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:22 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Himik писал(а):
Задав все непосредственные значения, начинай по одному их убирать, тогда найдёшь какой параметр неправильный.

Да там задница целая :shock: Как-будто в памяти по адресам переменных не те числа которые вычисляются! По этой формуле головка не будет равна 80, щас поубирал все одно за другим, так оказывается что читается головка 80h... Но и сектор читается странным образом, вообщем, объясню по порядку...
1. начало Root 19 сектор по LBA(Его я заношу в ax до вызова ReadSecs)
2. Размер Root каталога 14 секторов, то есть до 19+14=33 сектора Root, далее данные
Так вот, в счетчик(di) я заношу значение 14, в ax(Типа LBA сектор) я заношу значение 19, то есть что бы он по порядку прочел 14 секторов от 19-го, в итоге, даже после всех гребаных формул читается 19+14=33 сектор, а максимум у флопика 18 сектор, кароч, хрен знает что за... Попробую переписать формулы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:30 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Himik писал(а):
Задав все непосредственные значения, начинай по одному их убирать, тогда найдёшь какой параметр неправильный.
Я использовал такой преобразователь LBA в CHS, он на треть короче. На входе ax, на выходе регистры для прямой передачи в int 13. CH Cylinder, CL Sector, DH Head.
Код:
   mov   cx,[BPB_SecPerTrk] ;N / Smax
   xor   dx,dx
   div   cx
   push   dx ;Sector

   mov   cx,[BPB_NumHeads] ; / Hmax
   xor   dx,dx
   div   cx

   pop   cx ;Sector
   inc   cl
   mov   ch,al ;Cylinder
   mov   dh,dl ;Head

Спасибо, щас попробую!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Так у тебя org с нулём, и база сегментов задана нулём, а программа же работает не на нуле, ты что забыл? Там таблица прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:38 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Himik писал(а):
Так у тебя org с нулём, а программа же работает не на нуле, ты что забыл?

Да забыл блин :D Вертанул org 07C00h теперь просто зависает без ошибок :mrgreen: Даже с твоей формулой, попробую че-нить подвигать что ли :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:42 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Эммм, так вот, теперь после смены смещения, просто виснет, ща сделаю что-то типо дебага, после каждого действия буду отсылать сообщение, де-нить да встанет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузчик!
СообщениеДобавлено: 25 авг 2013, 00:44 

Зарегистрирован: 24 авг 2013, 22:58
Сообщения: 33
Кажется это Divide overflow... Но черт возьми как? Там ведь маленькие значения!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 59 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB