Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Странности с Int 13h

5.9K
13 декабря 2005 года
assign
60 / / 13.12.2005
Привет!
Пользуясь случаем, поздравляю всех российских программеров,
и всех остальных с Днем Конституции!

А теперь тема:
Я тут от нефиг делать пишу игрушечную ОСьку, просто так из
технического интереса. Так вот: У меня начальный загрузчик
подвешивает машину. Я стал разбираться и после серии тестов
начал очень сильно склоняться к мысли, что висяк происходит
где-то в внутри кода int 13h. Вы можете сказать, что это
бред, но я другого объяснения не нахожу. А может и правда
такое возможно? И какие, интересно, могут быть этому причи
ны? Машина и флоповод исправны. (DOS с дискеты грузится, да
и тестовые программки работаю щие через int 13h, которые я
писал, работают.

Вот полный исходник моего загрузчика:


BITS 16

%define Kernel_Size 1024
%define DEBUG

segment .text

Entry:
org 0x7C00
jmp short StartBoot
nop
OemName db "DEMOS "
SecSize dw 512
ClusSize db 1
ResSec dw 0
FatCnt db 2
RootSize dw 224
TotSec dw 2880
Media db 0xF0
FatSize dw 9
SecPerTrk dw 18
Heads dw 2
Hidden dd 0
TotSec2 dd 0
DrvNo db 0
Reserv db 0
Sign db ')'
SerialNo dd 0
Volume db "SYSTEM "
FatID db "FAT12 "

StartBoot:
; Организуем стек в конце стандартной памяти
cli
mov ax, 0x9FE0
mov ss, ax
mov sp, 0x200
sti
; Грузим ядро
push cs
pop ds
mov si, Msg1
call Print
call Load_Krnl
%ifdef DEBUG
jmp $
%endif

; ************* ДОБРО ПОЖАЛОВАТЬ В DEMOS ! *************

db 0xEA
dw 0
dw 0x8000

Load_Krnl:
; Желательно сбросить контроллер FDD
.L2
xor ax, ax
xor dx, dx
int 0x13
jc .L2
; Читаем и проверяем первый сектор корневого каталога
; Там должна быть запись о файле DEMOS.SYS
.L1
mov si, 19
mov ax, 0x8000
mov es, ax
xor bx, bx
call SecRead
%ifdef DEBUG
mov si, Msg1 ; СЮДА ИЗ SecRead Я УЖЕ НЕ ВОЗВРА-
; ЩАЮСЬ!
call Print
%endif
call SystemDisk ; Проверяем наличие файла ядра
; Читаем файл ядра
mov si, 33
mov cx, Kernel_Size
shr cx, 9
.L2:
call SecRead
inc si
add bx, 512
loop .L2
ret

Print:
cld
mov ah, 0x0E
.L1:
lodsb
or al, al
jz .L99
int 0x10
jmp .L1
.L99:
ret

SecRead:
; На входе:
; si = Абсолютный номер сектора;
; es:bx = Адрес буфера
push ax
push bx
push cx
push dx
push bx
mov ax, si
mov bl, 18
div bl
inc ah
mov cl, ah ; cl = номер сектора
mov dh, al ; dh = номер головки
and dh, 1
mov dl, 0 ; dl = диск
mov ax, si
mov bl, 36
div bl
mov ch, al ; ch = номер цилиндра
mov ax, 0x0201
pop bx
int 0x13
%ifdef DEBUG
; В отладочных целях на экран выводится код ошибки int 13h,
; но до сюда я тоже не дохожу :(
pushf
shr ax, 8
add al, 0x30
mov ah, 0x0E
int 0x10
popf
%endif
pop dx
pop cx
pop bx
pop ax
jnc .L1
mov si, Msg2
jmp Error
.L1:
ret

SystemDisk:
ret

Error:
call Print
err1:
jmp err1

DirItem db "DEMOS ", "SYS", 7
times 14 db 0
dw 33
dd Kernel_Size

Msg1 db 0Dh, 0Ah,"Starting DEMOS...", 0Dh, 0Ah,0
Msg2 db 0Dh, 0Ah, "Bad sector.", 0Dh, 0Ah, 0
Msg3 db 0Dh, 0Ah, "Invalid system disk.", 0Dh, 0Ah, 0

LastByte:

Len equ LastByte - Entry + 2

times (512 - Len) db 0
dw 55AAh
2.2K
13 декабря 2005 года
Brezhnev1980
156 / / 13.08.2005
Разгребайте,народ...
349
17 декабря 2005 года
Phantom-84
656 / / 27.10.2005
assign, могу сказать точно, что в обработчике int 13h глюков нет. Я внимательно не просматривал твой код, но мне кажется, что у тебя не переопределяется таблица параметров дискеты. Если нет явных багов в коде, может проблема именно в этом!

P.S. У меня все работало :)
5.9K
19 декабря 2005 года
assign
60 / / 13.12.2005
Цитата:
Originally posted by Phantom-84
assign, могу сказать точно, что в обработчике int 13h глюков нет. Я внимательно не просматривал твой код, но мне кажется, что у тебя не переопределяется таблица параметров дискеты. Если нет явных багов в коде, может проблема именно в этом!

P.S. У меня все работало :)



Кстати сказать, я писал тестовую com-программу, которая могла загружаться в DOS-е и читала сектор с помощью данной
процедуры SecRead, так вот там всё работало.

И еще: Про таблицу параметров дискеты, если можно, поподробнее...

P.S. Спасибо за сообщение!

1.8K
19 декабря 2005 года
gwg605
76 / / 06.03.2003
Цитата:
Originally posted by assign


А ты уверен что стека в 512 байт тебе хватает?

ЗЫ. А почему такие странные параметры для стека используются?

349
20 декабря 2005 года
Phantom-84
656 / / 27.10.2005
assign, естественно в DOS все работало, потому что DOS переопределяет эту таблицу. Данная таблица имеет длину 11 байт. В ней находится несколько параметров, от которых существенно зависит положительный исход работы с дискетой посредством int 13h. BIOS инициализирует вектор 1Eh как указатель на данную таблицу. Твой загрузчик должен продублировать эту таблицу и изменить в ней байтовые параметры со смещением +4 (номер последнего сектора, т.е. число секторов на дорожке) и +9 (устанавить в 0Fh). Все смещения отсчитываются от нуля! И последнее... Не забудь восстановить родной указатель, когда твой загрузчик закончит работу с дискетой!

P.S. Желаю успехов :) Кто бы мне так помогал!
12K
21 декабря 2005 года
patriotLviv
10 / / 13.10.2005
Я знаю шо то за фіґня я пишу ось і в мене таке було. Це пов'язано з адресою в памяті куди зчитуються дані. Воно не може прочитати в один безперервний простір більше 640кб краще роби так:
переходь в захищений режим, там встанови FLAT память і не змінюючи сегментних регістрів перейди назад в реальний ти отримаєш реальний режим з 4Ґб памяті
5.9K
21 декабря 2005 года
assign
60 / / 13.12.2005
Platphorm-84 оказался прав. Действительно надо было переопределить ТПД. Теперь загрузчик работает.

P.S.

1. Память за пределами 640КБ и не затрагивается вовсе.

2. Если посчитать количество команд CALL и INT в программе,
то станет очевидно, что стека в 512 байт - за глаза и за
уши...
349
24 декабря 2005 года
Phantom-84
656 / / 27.10.2005
Эй, связной, зачем погонялово коверкать! Мы чё не пацаны что ли! Или это наезд на мою хату? Ты чё меня опустить, в натуре, хотел?
349
24 декабря 2005 года
Phantom-84
656 / / 27.10.2005
patriotLviv, вот ты продвинутый пацан, раз у тебя дискетный загрузчик FLAT-модель пользует! Сразу видно, что решил науку на пользу общему котлу направить. Братва будет довольна!
349
24 декабря 2005 года
Phantom-84
656 / / 27.10.2005
:) :) :)
5.9K
26 декабря 2005 года
assign
60 / / 13.12.2005
Цитата:
Originally posted by Phantom-84
Эй, связной, зачем погонялово коверкать! Мы чё не пацаны что ли! Или это наезд на мою хату? Ты чё меня опустить, в натуре, хотел?



Здравствуйте ещё раз. Здесь assign.
Во-первых извиняюсь перед уважаемым Phantom-84, которого я не хотел обидеть - просто допустил описку.
Во-вторых сообщаю следующее: Опять же, из-за своей рассеянности, я поспешил обрадовать коллег тем, что после переопределения ТПД у меня всё заработало. Оказывается я
дубина тиснул на дискету не тот образ :-)))! А дело было в
другом (Я тут сам разобрался): Оказывается не надо было переносить стек. После того как я отавил стек на месте, и вправду всё заработало, даже без переопределения ТПД. Правда я так и не понял, чем же у меня затирался стек. Вроде бы расстояние между ним и местом загрузки ядра достаточное, а push-ей, call-ов и Int-ов в программе не так
много.

349
26 декабря 2005 года
Phantom-84
656 / / 27.10.2005
assign, BIOS - это тебе не DOS :) Там далеко не все обработчики переопределяют стек. А объем используемого стекового пространства все тем же обработчиком int 13h трудно оценить без дисассемблирования большого количества различных вариантов этого обработчика. Я когда-то целую спецификацию написал по окружению дискового загрузчика, так там под стек (и/или данные дискового загрузчика) отводилось вся память ниже 7C00h вплоть до BDA (предполагалось, что вершина стека не достанет эту область :) Конкретно для дискеты 1,44 Мб ниже 7C00h я грузил FAT, а все остальное оставлял под стек. Следовательно начальная вершина стека имела адрес 6A00h. Если отнять 500h на IVT и BDA, получим 6500h. Вот это, я понимаю, залог надежности (не то что 200h :) По поводу таблицы параметров дискеты... Профессионально написанный загрузчик должен переопределять эту таблицу. Я дисассемблировал огромное количество дискетных загрузчиков и все они делали это!
252
27 декабря 2005 года
koderAlex
1.4K / / 07.09.2005
Цитата:
Originally posted by Phantom-84
assign, BIOS - это тебе не DOS :) Там далеко не все обработчики переопределяют стек. А объем используемого стекового пространства все тем же обработчиком int 13h трудно оценить без дисассемблирования большого количества различных вариантов этого обработчика. Я когда-то целую спецификацию написал по окружению дискового загрузчика, так там под стек (и/или данные дискового загрузчика) отводилось вся память ниже 7C00h вплоть до BDA (предполагалось, что вершина стека не достанет эту область :) Конкретно для дискеты 1,44 Мб ниже 7C00h я грузил FAT, а все остальное оставлял под стек. Следовательно начальная вершина стека имела адрес 6A00h. Если отнять 500h на IVT и BDA, получим 6500h. Вот это, я понимаю, залог надежности (не то что 200h :) По поводу таблицы параметров дискеты... Профессионально написанный загрузчик должен переопределять эту таблицу. Я дисассемблировал огромное количество дискетных загрузчиков и все они делали это!



уточнение : загрузчик использующий int 13 должен переопределять таблицу параметров . при работе через порты это необязательно .
int 13 использует эту таблицу для формирования команд .

5.9K
27 декабря 2005 года
assign
60 / / 13.12.2005
Цитата:
Originally posted by Phantom-84
По поводу таблицы параметров дискеты... Профессионально написанный загрузчик должен переопределять эту таблицу. Я дисассемблировал огромное количество дискетных загрузчиков и все они делали это!



Тогда, я ещё раз извиняюсь за свою тупость, но объясните,
ради Большого Билла: зачем нужна оригинальная таблица если её надо переопределять?

349
28 декабря 2005 года
Phantom-84
656 / / 27.10.2005
assign, это традиция :) :) :)

Оригинальная таблица нужна для того, для чего нужна и сама BIOS. Она используется на начальном этапе запуска компьютера. А переопределять ее нужно потому, что в ней могут храниться значения параметров, не соответствующие используемому тобой типу дисков, ведь нигде не сказано, что значения в таблице должны соответствовать типу дисков, используемому во время последнего сеанса работы с дискетой, т.е. при загрузке boot-сектора. Скорее всего в ROM BIOS прошиты образы этой таблицы для всех поддерживаемых типов дискет, а стартовый код выполняет лишь настройку на нужную таблицу.

Но, мне кажется, мы слишком много времени уделили этой таблице... Как я понял, ты пишешь загрузчик для загрузки какой-то программы. Если твоя программа по принципам работы хоть чем-то напоминает ОС, можешь про нее рассказать. И лучше всего это сделать на ветке "Открытая ось с нуля" :) Я там частый гость и в последнее время единственный :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог