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

Ваш аккаунт

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

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

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

По созданию ОС

78K
10 марта 2013 года
GCSoft
73 / / 10.03.2013
Помогите пожалуйста. Написал консоль на FASM, и нужно, чтобы загрузчик запускал его! Как лучше всего его оформить? Помогите нужно срочно! Запускать эту ОСь без разницы с диска или с дискеты. Еще нужно вот одно-как запускать COM программы из программы (В DOS) на FASM? Буду благодарен!
Страницы:
78K
20 марта 2013 года
GCSoft
73 / / 10.03.2013
Может кто кинет код загрузчика, передачи управления или bin-арнику или com-у. Очень нужно!
260
21 марта 2013 года
Ramon
1.1K / / 16.08.2003
Мир разрушен.
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
ставлю копирайт . :)
универсальный загрузчик . в адреса с 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
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Ээээ.... А можно с помощью CD-диска? Просто проверить не могу(с ноута). А на компе флоппика нет(
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
можно
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Я пробовал запускать через VirtualBOX и безрезультатно.... Пишет error(
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
Цитата: GCSoft
Я пробовал запускать через VirtualBOX и безрезультатно.... Пишет error(


всё правильно . так и должно быть .
бинарника то "OSLOADER.BIN" у вас нету . скомпильте такой файл со своим кодом , положите в корень загрузочного образа и всё .

252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
код примерно такой :
Код:
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
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Нет я компил и засовывал свой файл OSLoader.bin. Все примерно также, записывал в iso образ. И опять error
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
только что смотрел на VirtualBOX - у меня всё нормально работает .
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Кинь образ...
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
вот
Прикрепленные файлы:
2 Кб
Загрузок: 653
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Но образ чист!!!!
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
а загрузочный имидж есть . )
подключите этот образ к виртуалке , поставьте загрузку с него и запускайте .
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Я кажись понял. Я сейчас также сделал и у меня получился бут, а он запускает cmd.bin. Все в один bin-арник и все) Я разобрался! Спасибо большое всем)
78K
21 марта 2013 года
GCSoft
73 / / 10.03.2013
Вот всеж осталось одно: как запускать com или bin программы после их выполнения возвращать управление назад? Кодом если можно...
252
21 марта 2013 года
koderAlex
1.4K / / 07.09.2005
назад - это куда ?
ничего никуда возвращать не нужно .
максимум что можно - это отправить ПК на перезагрузку .
скачайте список прерываний ральфа брауна . 19h прерывание , если склероз не изменяет . )
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Да нет не для этого!!! Просто из коммандного интерпретатора нужно запускать Bin или Com-програмки! Вот и нужно....
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
.bin файлы вызываются командой call seg:0 . бинарники должны заканчиватся командой ret .
для .com файлов точно не помню уже . почитайте описание com формата и PSP (Prefix Segment Programm) , там всё должно быть что вам нужно .
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Что то не получается! Можете дать сайт с информацией по этому поводу, или пример?
20K
22 марта 2013 года
ellor!
198 / / 24.05.2012
Запросто
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Можно все же по подробнее про call seg:0?
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
call 1000h:0h
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
А как тогда должен выглядеть выполняющийся bin-арный файл?
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
org 0h
begin:
***********
***********
***********
ret
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Это не работает!(
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
эта модель работает . это у вас конкретная реализация не работает .
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
А как ее реализовать???? Я пробовал так:
 
Код:
org 0h
jmp begin
include 'libs\if.inc'
include 'libs\dos.inc'
msg db 'Winda',0
begin:
print msg
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
В результате выполнения программа просто встает!
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Там лишний код
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
это и не будет работать .
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Ладно, тогда как правильно?
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
правильно сначала алгоритм составить , а потом уже код писать .
у вас после загрузки "командного интерпретатора" нет никакого dos-а . значит ваш КИ должен сам уметь читать файлы с диска , корректно размещать их в оперативной памяти и после этого уже передавать управление .
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Да елки палки!) Я то из MS-DOS пробую то)))))
252
22 марта 2013 года
koderAlex
1.4K / / 07.09.2005
в таком случае исчезает только первый пункт .
в остальных проблемы увеличиваются .
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
Можно кодом)))?
78K
22 марта 2013 года
GCSoft
73 / / 10.03.2013
У вас ВК или Скайп есть?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог