OSDev http://osdev.su/ |
|
Загрузчик! http://osdev.su/viewtopic.php?f=6&t=785 |
Страница 1 из 6 |
Автор: | novice [ 24 авг 2013, 23:04 ] |
Заголовок сообщения: | Загрузчик! |
Здравствуйте уважаемые форумчане! Вообщем у меня возникла такая проблем-ка с сервисом дискового ввода/вывода... Проблема в том что 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 |
Автор: | Himik [ 24 авг 2013, 23:54 ] |
Заголовок сообщения: | Re: Загрузчик! |
Не знаю, правильно ли работает преобразователь LBACHS, но ты для начала попробуй задать функции int 13h непосредственные значения в регистры прямо перед вызовом. |
Автор: | novice [ 25 авг 2013, 00:01 ] |
Заголовок сообщения: | Re: Загрузчик! |
Himik писал(а): Не знаю, правильно ли работает преобразователь LBACHS, но ты для начала попробуй задать функции int 13h непосредственные значения в регистры прямо перед вызовом. Эммм, вот формулы которые я использую: S = N mod SPT + 1 T = N / SPT H = T mod Heads C = T / Heads Как не странно, но если прямо в регистры задавать, то все нормально... В чем же проблема Попробую поэксперементировать... |
Автор: | Himik [ 25 авг 2013, 00:07 ] |
Заголовок сообщения: | Re: Загрузчик! |
Задав все непосредственные значения, начинай по одному их убирать, тогда найдёшь какой параметр неправильный. Я использовал такой преобразователь 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 внутрь цикла, иначе повторение будет происходить с испорченными регистрами. |
Автор: | novice [ 25 авг 2013, 00:22 ] |
Заголовок сообщения: | Re: Загрузчик! |
Himik писал(а): Задав все непосредственные значения, начинай по одному их убирать, тогда найдёшь какой параметр неправильный. Да там задница целая Как-будто в памяти по адресам переменных не те числа которые вычисляются! По этой формуле головка не будет равна 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 сектор, кароч, хрен знает что за... Попробую переписать формулы |
Автор: | novice [ 25 авг 2013, 00:30 ] |
Заголовок сообщения: | Re: Загрузчик! |
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 Спасибо, щас попробую! |
Автор: | Himik [ 25 авг 2013, 00:35 ] |
Заголовок сообщения: | Re: Загрузчик! |
Так у тебя org с нулём, и база сегментов задана нулём, а программа же работает не на нуле, ты что забыл? Там таблица прерываний. |
Автор: | novice [ 25 авг 2013, 00:38 ] |
Заголовок сообщения: | Re: Загрузчик! |
Himik писал(а): Так у тебя org с нулём, а программа же работает не на нуле, ты что забыл? Да забыл блин Вертанул org 07C00h теперь просто зависает без ошибок Даже с твоей формулой, попробую че-нить подвигать что ли |
Автор: | novice [ 25 авг 2013, 00:42 ] |
Заголовок сообщения: | Re: Загрузчик! |
Эммм, так вот, теперь после смены смещения, просто виснет, ща сделаю что-то типо дебага, после каждого действия буду отсылать сообщение, де-нить да встанет |
Автор: | novice [ 25 авг 2013, 00:44 ] |
Заголовок сообщения: | Re: Загрузчик! |
Кажется это Divide overflow... Но черт возьми как? Там ведь маленькие значения! |
Страница 1 из 6 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |