org 0h
jmp begin
include 'libs\if.inc'
include 'libs\dos.inc'
msg db 'Winda',0
begin:
print msg
ret
По созданию ОС
Помогите пожалуйста. Написал консоль на FASM, и нужно, чтобы загрузчик запускал его! Как лучше всего его оформить? Помогите нужно срочно! Запускать эту ОСь без разницы с диска или с дискеты. Еще нужно вот одно-как запускать COM программы из программы (В DOS) на FASM? Буду благодарен!
Может кто кинет код загрузчика, передачи управления или bin-арнику или com-у. Очень нужно!
Мир разрушен.
универсальный загрузчик . в адреса с 7e00h грузит с дискеты файл OSLOADER.BIN , а с харда сектора с 1-го по 63-й .
Код:
addr_rootdir EQU 0800h
addr_fat12 EQU 2400h
addr_paket EQU 0800h
free EQU 3600h
virtual at $
org 4000h
fat12inc dw ?
startsector dw ?
end virtual
org 7c00h
jmp short begin ;явно указываем короткий джамп . на всякий случай )
startdrive db 90h
BS_OEMName db '*-v4VIHC' ;8 байт
BPB_Byte_per_Sector dw 512
BPB_Sector_per_Cluster db 1
BPB_Reserved_Sector dw 1
BPB_Num_FAT db 2
BPB_Root_Ent_count dw 224
BPB_Total_Sectors16 dw 2880
BPB_Media_Tipe db 0f0h
BPB_Fat_Size dw 9
BPB_Sector_Per_Trek dw 18
BPB_Num_Heads dw 2
BPB_Hidden_Sectors dd 0
BPB_Total_Sectors32 dd 0
BS_Drive_No db 0
BS_reserve db 0
BS_Extendet_Boot_Rec db 29h
BS_Serial_No dd 3e2911e4h
BS_Disk_Label db 'bootablefdd';одиннадцать байт
BS_File_Sys_ID db 'FAT12 '
begin: ;прерывания отключены. в dl источник загрузки .
mov [startdrive],dl ;сохраняем источник и настраиваем
xor ax,ax
mov ds,ax
mov ss,ax
mov es,ax
mov sp,7c00h
sti
cld
bt dx,7 ;проверяем источник загрузки
jb EDD_MBR ;если hdd , то прыгаем
mov ax,20eh
mov dh,1
mov dl,[startdrive]
mov cx,2
mov bx,addr_rootdir ;загружаем с флопика со 19-го по 32-й сектор в адрес addr_rootdir.
int 13h ;в этих секторах корневая директория
cmp ah,0
jnz error ;корневая директория с 19 сектора . размер структур 20h .
mov ax,209h
mov dh,0
mov cx,2
mov bx,addr_fat12
int 13h ;загружаем с флопика со 2-го по 10-ый сектор по адресу addr_fat12 . эти сектора содержат первую копию FAT12.
cmp ah,0
jnz error
mov si,filename ;в si указатель на имя файла
call find_file_root_dir
mov bx,7e00h ;место для загрузки
mov [startsector],ax;сохраняем номер начального сектора
call readsectorFDD
readFAT12_cicle:
add bx,200h
call readFAT12
mov cx,ax
and cx,0ff8h
cmp cx,0ff8h
je boot_loader_ok
mov cx,ax
jcxz error
call readsectorFDD
jmp readFAT12_cicle
boot_loader_ok:
mov dl,[startdrive]
jmp far 0h:7e00h
EDD_MBR: ;загружаем вторичный загрузчик c помощью edd
mov bx,7e00h ;место для загрузки
mov eax,1
call readsectorHDD
readEDD_cicle:
add bx,200h
inc ax
call readsectorHDD
cmp ax,62
jne readEDD_cicle
jmp boot_loader_ok
error:
mov si,errorstring
call printf
dead_cicle_mbr:
jmp dead_cicle_mbr
find_file_root_dir: ;в si указатель на имя файла
pushf
pushad
mov di,addr_rootdir ;в di указатель на начало корневой директории в памяти
mov cx,512 ;кол-во элементов в корневом каталоге
find_file_root_dir_cicle:
pusha
mov cx,11
repz cmpsb
popa
jz end_find_file_root_dir_cicle
add di,32
loop find_file_root_dir_cicle
jmp error
end_find_file_root_dir_cicle:
mov ax,[di+1ah] ;младшее слово номера первого сектора файла . старшее для fat12 нафиг не нужно )
mov [fat12inc],ax
popad
popf
mov ax,[fat12inc] ;возвращаем значение в ax
ret
readsectorHDD: ;в es:bx адрес памяти (0 сегмент),в eax линейный адрес на диске ,в dl номер диска
pushf
pushad
push es
pop di
mov si,addr_paket ;адрес пакета EDD
mov [si+ 0h],byte 32
mov [si+ 1h],byte 0
mov [si+ 2h],byte 1
mov [si+ 3h],byte 0
mov [si+ 4h],bx
mov [si+ 6h],di
mov [si+ 8h],eax
xor eax,eax
mov ah,42h
int 13h
cmp ah,0
jnz error ;если ошибка ,то ...
popad
popf
ret ;ничего не возвращаем
printf: ;процедура вывода на монитор, в si указатель на строку
pushf
pushad
cicle_print:
lodsb
test al,al
jz end_print
mov ah,0eh
mov bl,7
int 10h ;используем функцию BIOS
jmp cicle_print
end_print:
popad
popf
ret ;конец процедуры вывода
readFAT12: ;функция чтения FAT12 . на входе в ax номер элемента , на выходе в ax номер следующего элемента.
pushf
pushad
mov bx,ax
shl ax,1
add ax,bx
shr ax,1
add ax,addr_fat12
mov di,ax
mov ax,[di]
bt bx,0
jae oddFAT12
shr ax,4
oddFAT12:
and ax,0fffh
mov [fat12inc],ax
popad
popf
mov ax,[fat12inc] ;возвращаем полученное значение в ax
ret
readsectorFDD: ;в es:bx адрес памяти (в пределах 1 мегабайта), в ax линейный адрес на диске от начала области данных,номер диска в [startdrive]
pushf
pushad
push es
push bx
add ax,31
mov bl,36
div bl
mov ch,al
mov al,ah
xor ah,ah
mov bl,18
div bl
mov dh,al
mov cl,ah
inc cl
mov dl,[startdrive]
mov ax,201h ;читаем один сектор
pop bx
int 13h
cmp ah,0
jnz error ;если ошибка ,то ...
pop es
popad
popf
ret ;ничего не возвращаем
filename db 'OSLOADERBIN';название файла - одиннадцать букв без точки . дополняется пробелами .
errorstring db 'error',0ah,0dh,0
times (7dbeh-$) db 90h ;забиваем NOP-ами остаток
org 7c00h+1beh
size_stat1 dq 0
LBA_start1 dq 0
size_stat2 dq 0
LBA_start2 dq 0
size_stat3 dq 0
LBA_start3 dq 0
size_stat4 dq 0
LBA_start4 dq 0
dw 0aa55h
addr_fat12 EQU 2400h
addr_paket EQU 0800h
free EQU 3600h
virtual at $
org 4000h
fat12inc dw ?
startsector dw ?
end virtual
org 7c00h
jmp short begin ;явно указываем короткий джамп . на всякий случай )
startdrive db 90h
BS_OEMName db '*-v4VIHC' ;8 байт
BPB_Byte_per_Sector dw 512
BPB_Sector_per_Cluster db 1
BPB_Reserved_Sector dw 1
BPB_Num_FAT db 2
BPB_Root_Ent_count dw 224
BPB_Total_Sectors16 dw 2880
BPB_Media_Tipe db 0f0h
BPB_Fat_Size dw 9
BPB_Sector_Per_Trek dw 18
BPB_Num_Heads dw 2
BPB_Hidden_Sectors dd 0
BPB_Total_Sectors32 dd 0
BS_Drive_No db 0
BS_reserve db 0
BS_Extendet_Boot_Rec db 29h
BS_Serial_No dd 3e2911e4h
BS_Disk_Label db 'bootablefdd';одиннадцать байт
BS_File_Sys_ID db 'FAT12 '
begin: ;прерывания отключены. в dl источник загрузки .
mov [startdrive],dl ;сохраняем источник и настраиваем
xor ax,ax
mov ds,ax
mov ss,ax
mov es,ax
mov sp,7c00h
sti
cld
bt dx,7 ;проверяем источник загрузки
jb EDD_MBR ;если hdd , то прыгаем
mov ax,20eh
mov dh,1
mov dl,[startdrive]
mov cx,2
mov bx,addr_rootdir ;загружаем с флопика со 19-го по 32-й сектор в адрес addr_rootdir.
int 13h ;в этих секторах корневая директория
cmp ah,0
jnz error ;корневая директория с 19 сектора . размер структур 20h .
mov ax,209h
mov dh,0
mov cx,2
mov bx,addr_fat12
int 13h ;загружаем с флопика со 2-го по 10-ый сектор по адресу addr_fat12 . эти сектора содержат первую копию FAT12.
cmp ah,0
jnz error
mov si,filename ;в si указатель на имя файла
call find_file_root_dir
mov bx,7e00h ;место для загрузки
mov [startsector],ax;сохраняем номер начального сектора
call readsectorFDD
readFAT12_cicle:
add bx,200h
call readFAT12
mov cx,ax
and cx,0ff8h
cmp cx,0ff8h
je boot_loader_ok
mov cx,ax
jcxz error
call readsectorFDD
jmp readFAT12_cicle
boot_loader_ok:
mov dl,[startdrive]
jmp far 0h:7e00h
EDD_MBR: ;загружаем вторичный загрузчик c помощью edd
mov bx,7e00h ;место для загрузки
mov eax,1
call readsectorHDD
readEDD_cicle:
add bx,200h
inc ax
call readsectorHDD
cmp ax,62
jne readEDD_cicle
jmp boot_loader_ok
error:
mov si,errorstring
call printf
dead_cicle_mbr:
jmp dead_cicle_mbr
find_file_root_dir: ;в si указатель на имя файла
pushf
pushad
mov di,addr_rootdir ;в di указатель на начало корневой директории в памяти
mov cx,512 ;кол-во элементов в корневом каталоге
find_file_root_dir_cicle:
pusha
mov cx,11
repz cmpsb
popa
jz end_find_file_root_dir_cicle
add di,32
loop find_file_root_dir_cicle
jmp error
end_find_file_root_dir_cicle:
mov ax,[di+1ah] ;младшее слово номера первого сектора файла . старшее для fat12 нафиг не нужно )
mov [fat12inc],ax
popad
popf
mov ax,[fat12inc] ;возвращаем значение в ax
ret
readsectorHDD: ;в es:bx адрес памяти (0 сегмент),в eax линейный адрес на диске ,в dl номер диска
pushf
pushad
push es
pop di
mov si,addr_paket ;адрес пакета EDD
mov [si+ 0h],byte 32
mov [si+ 1h],byte 0
mov [si+ 2h],byte 1
mov [si+ 3h],byte 0
mov [si+ 4h],bx
mov [si+ 6h],di
mov [si+ 8h],eax
xor eax,eax
mov ah,42h
int 13h
cmp ah,0
jnz error ;если ошибка ,то ...
popad
popf
ret ;ничего не возвращаем
printf: ;процедура вывода на монитор, в si указатель на строку
pushf
pushad
cicle_print:
lodsb
test al,al
jz end_print
mov ah,0eh
mov bl,7
int 10h ;используем функцию BIOS
jmp cicle_print
end_print:
popad
popf
ret ;конец процедуры вывода
readFAT12: ;функция чтения FAT12 . на входе в ax номер элемента , на выходе в ax номер следующего элемента.
pushf
pushad
mov bx,ax
shl ax,1
add ax,bx
shr ax,1
add ax,addr_fat12
mov di,ax
mov ax,[di]
bt bx,0
jae oddFAT12
shr ax,4
oddFAT12:
and ax,0fffh
mov [fat12inc],ax
popad
popf
mov ax,[fat12inc] ;возвращаем полученное значение в ax
ret
readsectorFDD: ;в es:bx адрес памяти (в пределах 1 мегабайта), в ax линейный адрес на диске от начала области данных,номер диска в [startdrive]
pushf
pushad
push es
push bx
add ax,31
mov bl,36
div bl
mov ch,al
mov al,ah
xor ah,ah
mov bl,18
div bl
mov dh,al
mov cl,ah
inc cl
mov dl,[startdrive]
mov ax,201h ;читаем один сектор
pop bx
int 13h
cmp ah,0
jnz error ;если ошибка ,то ...
pop es
popad
popf
ret ;ничего не возвращаем
filename db 'OSLOADERBIN';название файла - одиннадцать букв без точки . дополняется пробелами .
errorstring db 'error',0ah,0dh,0
times (7dbeh-$) db 90h ;забиваем NOP-ами остаток
org 7c00h+1beh
size_stat1 dq 0
LBA_start1 dq 0
size_stat2 dq 0
LBA_start2 dq 0
size_stat3 dq 0
LBA_start3 dq 0
size_stat4 dq 0
LBA_start4 dq 0
dw 0aa55h
Ээээ.... А можно с помощью CD-диска? Просто проверить не могу(с ноута). А на компе флоппика нет(
можно
Я пробовал запускать через VirtualBOX и безрезультатно.... Пишет error(
Цитата: GCSoft
Я пробовал запускать через VirtualBOX и безрезультатно.... Пишет error(
всё правильно . так и должно быть .
бинарника то "OSLOADER.BIN" у вас нету . скомпильте такой файл со своим кодом , положите в корень загрузочного образа и всё .
Код:
virtual at $
include "mbr.asm"
end virtual
org 7e00h
jmp start
load_string db 'loading UnicalOS !!!',0ah,0dh,0
start:
mov ax,3h
int 10h
mov si,load_string
call printf
jmp dead_cicle_mbr
include "mbr.asm"
end virtual
org 7e00h
jmp start
load_string db 'loading UnicalOS !!!',0ah,0dh,0
start:
mov ax,3h
int 10h
mov si,load_string
call printf
jmp dead_cicle_mbr
Нет я компил и засовывал свой файл OSLoader.bin. Все примерно также, записывал в iso образ. И опять error
только что смотрел на VirtualBOX - у меня всё нормально работает .
Кинь образ...
вот
Но образ чист!!!!
подключите этот образ к виртуалке , поставьте загрузку с него и запускайте .
Я кажись понял. Я сейчас также сделал и у меня получился бут, а он запускает cmd.bin. Все в один bin-арник и все) Я разобрался! Спасибо большое всем)
Вот всеж осталось одно: как запускать com или bin программы после их выполнения возвращать управление назад? Кодом если можно...
ничего никуда возвращать не нужно .
максимум что можно - это отправить ПК на перезагрузку .
скачайте список прерываний ральфа брауна . 19h прерывание , если склероз не изменяет . )
Да нет не для этого!!! Просто из коммандного интерпретатора нужно запускать Bin или Com-програмки! Вот и нужно....
для .com файлов точно не помню уже . почитайте описание com формата и PSP (Prefix Segment Programm) , там всё должно быть что вам нужно .
Что то не получается! Можете дать сайт с информацией по этому поводу, или пример?
Можно все же по подробнее про call seg:0?
call 1000h:0h
А как тогда должен выглядеть выполняющийся bin-арный файл?
begin:
***********
***********
***********
ret
Это не работает!(
эта модель работает . это у вас конкретная реализация не работает .
Код:
Код:
org 0h
jmp start
include 'libs\if.inc'
include 'libs\dos.inc'
message db 'Hello World',0
kern db 'kernel123.bin'
start:
print message
input message
ret
org 100h
jmp start
include 'libs\if.inc'
include 'libs\dos.inc'
message db 'Hello World',0
start:
print message
input message
call 1000h:0h
mov ax,4c00h
int 21h
jmp start
include 'libs\if.inc'
include 'libs\dos.inc'
message db 'Hello World',0
kern db 'kernel123.bin'
start:
print message
input message
ret
org 100h
jmp start
include 'libs\if.inc'
include 'libs\dos.inc'
message db 'Hello World',0
start:
print message
input message
call 1000h:0h
mov ax,4c00h
int 21h
Там лишний код
это и не будет работать .
Ладно, тогда как правильно?
у вас после загрузки "командного интерпретатора" нет никакого dos-а . значит ваш КИ должен сам уметь читать файлы с диска , корректно размещать их в оперативной памяти и после этого уже передавать управление .
Да елки палки!) Я то из MS-DOS пробую то)))))
в остальных проблемы увеличиваются .
Можно кодом)))?
У вас ВК или Скайп есть?