ورود

View Full Version : سوال: چرا این بوت لودر بوت نمیشه



tanzadeh7
یک شنبه 02 شهریور 1393, 10:22 صبح
سلام من یک بوت لودر در اسمبلی نوشتم و میخوام یک کرنلی که تو سی نوشته شده رو به حافظه لود کنه ولی این بوت لودر در Qemu بوت نمیشه
اینم سورس بوت لودر


Bits 16
jmp Main
;in = -. out= -

convert_sector:
push bx
push ax
mov bx, ax
mov dx, 0
div WORD [sectorspertrack]
add dl, 01h
mov cl, dl
mov ax, bx
mov dx, 0
div WORD [sectorspertrack]
mov dx, 0
div WORD [sides]
mov dh, dl
mov ch, al
pop ax
pop bx
mov dl, BYTE [bootdrive]
ret

sectorspertrack dw 18
sides dw 0

reset_floppy:
mov ah, 0
mov dl, BYTE[bootdrive]
int 13h
jmp load_root

print:
lodsb
cmp al, 0
je Done
mov ah, 0eh
int 10h
jmp print

Done:
ret

Main:
cli
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti

mov ax, 07C0h
mov ds, ax
mov es, ax

mov [bootdrive], dl


mov bx, buffer
mov cl,2
mov ch,0
mov dh,1
mov ah,2
mov al,14
pusha

load_root:
int 13h
jnc loaded_root
call reset_floppy
jmp load_root

loaded_root:
popa
mov di, buffer
mov cx, 224
mov ax, 0
search_loop:
push cx
pop dx
mov si, filename
mov cx, 11
rep cmpsb
je found_file
add ax, 32
mov di, buffer
add di, ax
push dx
pop cx
loop search_loop
int 18h


found_file:
mov ax, WORD [di+15]
mov WORD [FirstSector], ax

mov bx, buffer
call convert_sector
mov ah, 2
mov al, 9
pusha
load_fat:
int 13h
jnc loaded_fat
call reset_floppy
jmp load_fat

loaded_fat:
mov ah, 2
mov al, 1
push ax

load_file_sector:
mov ax, WORD [FirstSector]
mov ax, 31
call convert_sector
mov ax, 2000h
mov es, ax
mov bx, WORD [pointer]

pop ax
push ax

int 13h
jnc calculate_next_sector
call reset_floppy
jmp load_file_sector

calculate_next_sector:
mov ax, [FirstSector]
mov dx, 0
mov bx, 6
mul bx
mov bx, 4
div bx
mov si, buffer
mov si, ax
mov ax, WORD [si]

or dx, dx
jz even

odd:
shr ax, 4
jmp short next_sectors_caculate

even:
and ax, 0FFFh

next_sectors_caculate:
mov WORD [FirstSector], ax
cmp ax, 0FF8h
jae end
add WORD [pointer], 512
jmp load_file_sector

end:
pop ax
mov dl, BYTE [bootdrive]
jmp 2000h:0000h


cli
hlt

bootdrive db 0
msg db "Hello world!", 0
filename db "KERNEL BIN"
FirstSector dw 0
pointer dw 0


times 510-($-$$) db 0

dw 0xAA55

buffer: ;byte 513




از این دستورت برای کامپایل بوت لودر و اجرای اون روی Qemu استفاده میکنم

nasm -f bin boot.asm -o boot.bin


dd status=noxfer conv=notrunc if=boot.bin of=TanzadehOS.flp


mkdir tmp-loop && mount -o loop -t vfat Tanzadeh-droid.flp tmp-loop && cp Kernel.bin tmp-loop/


umount tmp-loop/CODE]

[CODE]qemu -fda TanzadehOS.flp

prpe26
یک شنبه 02 شهریور 1393, 13:51 عصر
از چه سیستم عاملی استفاده میکنید؟
اگر از اوبونتو استفاده میکنید، qemu-system رو با qemu جایگزین کنید، شاید کار بده.

tanzadeh7
یک شنبه 02 شهریور 1393, 23:40 عصر
از چه سیستم عاملی استفاده میکنید؟
اگر از اوبونتو استفاده میکنید، qemu-system رو با qemu جایگزین کنید، شاید کار بده.

نه مشکل حل نشد

tanzadeh7
سه شنبه 04 شهریور 1393, 11:08 صبح
خودم این مشکل رو حل کردم

کد درست این مشه


Bits 16
org 0xc700


jmp Main
;in = -. out= -

convert_sector:
push bx
push ax
mov bx, ax
mov dx, 0
div WORD [sectorspertrack]
add dl, 01h
mov cl, dl
mov ax, bx
mov dx, 0
div WORD [sectorspertrack]
mov dx, 0
div WORD [sides]
mov dh, dl
mov ch, al
pop ax
pop bx
mov dl, BYTE [bootdrive]
ret

sectorspertrack dw 18
sides dw 0

reset_floppy:
mov ah, 0
mov dl, BYTE[bootdrive]
int 13h
jmp load_root

print:
lodsb
cmp al, 0
je Done
mov ah, 0eh
int 10h
jmp print

Done:
ret

Main:
cli
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti

mov ax, 07C0h
mov ds, ax
mov es, ax

mov [bootdrive], dl


mov bx, buffer
mov cl,2
mov ch,0
mov dh,1
mov ah,2
mov al,14
pusha

load_root:
int 13h
jnc loaded_root
call reset_floppy
jmp load_root

loaded_root:
popa
mov di, buffer
mov cx, 224
mov ax, 0
search_loop:
push cx
pop dx
mov si, filename
mov cx, 11
rep cmpsb
je found_file
add ax, 32
mov di, buffer
add di, ax
push dx
pop cx
loop search_loop
int 18h


found_file:
mov ax, WORD [di+15]
mov WORD [FirstSector], ax

mov bx, buffer
call convert_sector
mov ah, 2
mov al, 9
pusha
load_fat:
int 13h
jnc loaded_fat
call reset_floppy
jmp load_fat

loaded_fat:
mov ah, 2
mov al, 1
push ax

load_file_sector:
mov ax, WORD [FirstSector]
mov ax, 31
call convert_sector
mov ax, 2000h
mov es, ax
mov bx, WORD [pointer]

pop ax
push ax

int 13h
jnc calculate_next_sector
call reset_floppy
jmp load_file_sector

calculate_next_sector:
mov ax, [FirstSector]
mov dx, 0
mov bx, 6
mul bx
mov bx, 4
div bx
mov si, buffer
mov si, ax
mov ax, WORD [si]

or dx, dx
jz even

odd:
shr ax, 4
jmp short next_sectors_caculate

even:
and ax, 0FFFh

next_sectors_caculate:
mov WORD [FirstSector], ax
cmp ax, 0FF8h
jae end
add WORD [pointer], 512
jmp load_file_sector

end:
pop ax
mov dl, BYTE [bootdrive]
jmp 2000h:0000h


cli
hlt

bootdrive db 0
msg db "Hello world!", 0
filename db "KERNEL BIN"
FirstSector dw 0
pointer dw 0


times 510-($-$$) db 0

dw 0xAA55

buffer: ;byte 513