Помогите найти ошыбку в коде
Хотел я бут-сектор написать, на асме, примитивный такой, думал ничего сложного не будет. Пишу я на fasm'е, вот код над которым я ломал голову целую неделю, и переписывал не раз:
start:
cli
mov ax,cs
mov ss,ax
mov sp,start
mov es,ax
sti
mov cl,[BYBOB_Lenght]
mov bx,[BYBOB_Dest]
mov ax,[BYBOB_Sector]
call Load_Block
ret
Load_Block:
;cx - kolvo sectorov
;bx - kuda gruzit
;ax - N 1go sectora
Load_Loop:
cmp cx,0
je Load_End
push cx
push ax
Call Load_Absolut_Sector
pop ax
pop cx
inc ax
dec cx
jmp Load_Loop
Load_End:
ret
Load_Absolut_SectorE:
pop ax
push ax
Load_Absolut_Sector:
;ax - absolutniy N sectora [0..2879]
;es:bx - kuda pisat
mov dx,36
div dl ; ah[0..35] al[0..79]
mov ch,al ; ch - N dorojki
xchg al,ah
xor ah,ah
mov dl,18
div dl ;[0..17][0..1]
mov dh,al
xor dl,dl
inc dh ; dh - N golovki
mov cl,ah
inc cl ; cl - N sectora
mov ax,201h
int 13h
jc Load_Absolut_SectorE
add bx,512
ret
BYBOB_Sector dw 2
BYBOB_Lenght db 12
BYBOB_Dest dw 800h
KERNEL_Sector dw 13
KERNEL_Lenght db 100
KERNEL_Dest dw 2000h
fin:
rb 7dFEh-fin
dw 0AA55h
Реализацыя мне не ужна, я хочю понять что в этом коде не так
В чем вообще симптомы, что что-то не так?
Запусти под Bochs.
В чем вообще симптомы, что что-то не так?
Bochs ошыбку не находит. когда тестил на дискете, то она прочитала 1 сектор и замолчала, когда нада чтоб она хрюкала секунд 5 минимум. Тестил процедуру загрузки в фаре, прога вылетела с ошыбкой, типа ошыбка защиты памяти код ошыбки xxxx:FFFF
Bochs ошыбку не находит.
в каком смысле не находит: он загружает 1 сектор или все, что надо?
В нем есть дебаггер - можешь пройти пошагово..
:D Это что-то новое - тестировать загрузочный сектор в Windows :)
start:
cli
mov ax,cs
mov ss,ax
mov sp,start
mov es,ax
sti
mov cl,[BYBOB_Lenght]
mov bx,[BYBOB_Dest]
mov ax,[BYBOB_Sector]
call Load_Block
ret
Посмотри внимательно на этот отрывок кода. Ничего странного не находишь?
Проблема "зарыта" в команде "ret". Точка входа Start - это же не подпрограмма!!! Куда ты пытаешься вернуть управление?
Вместо ret должно быть:
hlt
jmp $
Проблема "зарыта" в команде "ret".
Это в конце, а до этого должна 5 секунд хрюкать..
2Vermilion:
Поставь вместо
int 13h
выдачу на экран регистров - увидишь, что не так.
Еще нужно учитывать, что сектора, считываемые за раз, должны находиться на одной дорожке.
Тестил в досес я только процедуру загрузки цепочки секторов, она и не пашет правильно.
А вместо рет там и был другой код, просто уже запарился немного с ней... там должен быть jmp far
А не знаете как вывести число (переменную) на экран без функцый доса?
А не знаете как вывести число (переменную) на экран без функцый доса?
Перевести в строку:
static void conv16(char* s, unsigned long addr)
{
int i;
unsigned char c;
for (i=0; i<8; i++){
c=(unsigned char)((addr>>(4*(7-i)))&0xf);
if (c<10) s=c+'0';
else s=c-10+'A';
}
s[8]=0;
}
Затем на экран через BIOS или прямо в видеобуфер.