Загрузчик

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
v4567
Сообщения: 6
Зарегистрирован: 07 май 2008, 17:40

Здравствуйте форумчане.
Помогите разобраться написал свой загрузчик но он почемуто не работает. Загрузчик записываю в первый сектор нулевого цилиндра на дискете, загружаюсь с неё. Далее информация с дискеты читается на аппаратном уровне, на уровне биоса, тоесть никакой файловой системы на ней нет, а информацию с неё читаю используя 13 прерывание и 2 функцию биоса, тоесть по секторам, цилиндрам и головкам.
Данная программа читает информацию с шести цилиндров и передаёт управление дальним прыжком в другой сегмент оперативной памяти с нулевым смещением, куда и были считаны данные.
Далее привожу текст программы:

Код: Выделить всё


; zagr.asm - Загрузчик.


cseg segment para 'code'

org 100h

begin proc near

assume cs:cseg, ds:cseg, ss:cseg

org 7c00h
jmp start
start:

cli
push ax
push dx
push cx
push bx
push es
mov ax,cs 
mov ds,ax

;--------------Сброс дисковой системы.--------------------

mov cx,3d
pov:
mov ah,0h
mov dl,0h
int 13h
cmp ah,0h
jz povtor1
loop pov
pop es
pop bx
pop cx
pop dx
pop ax
sti

;--------------Чтение с дискеты.--------------------------

povtor1:
mov ax,1117h
mov es,ax
mov ch,0h
mov ah,2h
mov al,8d
mov cl,2h
mov dh,0h
mov dl,0h
mov bx,0h
int 13h
gdem:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cmp ah,0h
jz pr
jmp gdem
pr:
cmp al,8h
jz pr1
jmp gdem
pr1:
mov ch,0h
pr4:
mov ah,2h
mov al,9d
mov cl,1h
not dh
mov dl,0h
int 13h
gdem1:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cmp ah,0h
jz pr2
jmp gdem1
pr2:
cmp al,9h
jz pr3
jmp gdem1
pr3:
cmp [zil],0h
jz pr6
jmp pr7
pr6:
not [zil]
jmp pr4
pr7:
not [zil]
inc ch
cmp ch,6d
jz pr5
jmp pr4
pr5:
pop es
pop bx
pop cx
pop dx
pop ax
jmp dword ptr [perex]

perex dd 11170000h
zil db 0h

begin endp
cseg ends
end begin

Данный загрузчик не работает, его неработу сужу по следующему:

Написал программу которая загружает свои шрифты в знакогенерато, 256 символов анлийские и русские буквы, потом после загрузки шрифтов она выводит их на экран при нажатии на клавиши. Сделал обработку нажатия только нескольких клавиш без переключения русских и английских букв, выводит только русские буквы.
Получилось так что сама программа вместе со шрифтами занимает 4,7 кбайта. Вначале я написал загрузчик который загружал всё что было на дискете начиная со второго сектора по девятый нулевого цилиндра нулевой головки и всё. С размерами я просчитался т.к. сектор у меня 512 байт, получается 512*8=4,096кбайт программа невлазила полностью но при этом работала, тоесть я использовал перебор начиная с 128 символа по 142 символ, если же я брал при нажатии на какую нибудь клавишу символо в конце таблици например 240 она уже не работала, тоесть таблица загружалась не полностью.
Как прочитал я в одной книге при использовании 13 прерывания функии 2 биос необходимо загружать в регистры следующие данные:
AH функция 02h
AL число считываемых секторов 8
CH номер цилиндра 0
CL номер начального сектора 2
DH головка 0
DL нисковод 0 - флопик
ES BX буфер куда считывать 0000h:7e00h
так вот если в BX записываю 0 тоже всё работает хотя не должно.
А если записываю программу на 1 дорожку дискеты тоесть
AH 02h
AL 9
CH 0
CL 1
DH 1
DL 0
ES:BX 0000h:7e00h
то ничего не работает, так же не работает если считываю несколько цилиндров.
Из выше сказанного я заключи что ошибка гдето в загрузчике, но может я ошибаюсь.

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