Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

26.05.2008, 20:07
|
|
Новичок
Регистрация: 09.05.2008
Сообщений: 7
Провел на форуме: 4367
Репутация:
10
|
|
Прочитал данную статью автора z01b видно что человек очень хорошо разбирается в данной теме.
z01b, у меня ктебе есть вопрос, помоги разобраться с загрузчиком. Написал свой загрузчик но он почемуто не работает.
Загрузчик записываю в первый сектор нулевого цилиндра на дискете, загружаюсь с неё. Далее информация с дискеты читается на аппаратном уровне, на уровне биоса, тоесть никакой файловой системы на ней нет, а информацию с неё читаю используя 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
Данный загрузчик не работает, z01b если ты видешь где у меня ошибки или знаешь в чём проблема помоги пожалуйста, за ответ заранее благодарен.
Последний раз редактировалось De-visible; 26.05.2008 в 20:53..
|
|
|

26.05.2008, 20:53
|
|
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме: 4037638
Репутация:
1821
|
|
Автор не z01b!
Там есть копирайты если что...
|
|
|

26.05.2008, 22:08
|
|
Новичок
Регистрация: 09.05.2008
Сообщений: 7
Провел на форуме: 4367
Репутация:
10
|
|
De-visible, если знаешь где у меня ошибка в программе или есть информация по даному вопросу или исходные тексты аналогичного загрузчика, помоги мне пожалуйста.
|
|
|

03.07.2008, 01:49
|
|
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
Провел на форуме: 2360904
Репутация:
1393
|
|
Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать.
http://wasm.ru/forum/attachment.php?item=2197
|
|
|

03.07.2008, 03:20
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
Провел на форуме: 379101
Репутация:
136
|
|
Сообщение от z01b
Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать.
http://wasm.ru/forum/attachment.php?item=2197
ссылку на тему плз
|
|
|

03.07.2008, 13:44
|
|
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
Провел на форуме: 2360904
Репутация:
1393
|
|
Сообщение от 0verbreaK
ссылку на тему плз
Вот перезалил http://slil.ru/25953519
|
|
|

03.07.2008, 15:30
|
|
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
Провел на форуме: 1740746
Репутация:
435
|
|
v4567 ответ по вопросу
v4567 - некогда проверять
интересен только один вопрос:
Сброс дисковой системы - то есть у тебя файловой системы там нет как таковой и соответственно компилируемый файл *.bin на выходе.
Вопрос собственно такой - А ты правильно пишешь бинарник на флопик без файловой системы?
Ниже просто приведу листинг рабочего загрузчика , программы записи бинарника на дискету!
Полная версия Мини ОС[ скачать ]
Код HTML:
для установки вставить дискетку и запустить батник - он там один! листинги имеются
PS: ниже даны листинги. Прошу прощения за множество копирайтов в этой версии просто это единственный экземпляр сохранившийся с тех времен когда я занималась данной темой, более поздние версии этой глупости невыжили.
PHP код:
name "loader"
#make_boot#
org 7c00h
; пропустите данные и секцию декларации функции:
jmp start
; секция данных
msg db "welcome to MINI -os", 0Dh,0Ah,
db "loading...",0Dh,0Ah, 0
err db "invalid data at sector: 2, cylinder: 0, head: 0 - integrity check failed.", 0Dh,0Ah
db "refer to tutorial 11 - making your own operating system.", 0Dh,0Ah
db "system will reboot now... press any key...", 0
start:
push cs
pop ds
; инициализируем стек:
mov ax, 07c0h
mov ss, ax
mov sp, 03feh ; вершина стека
; set data segment:
push cs
pop ds
; устанавливаем видео режим 80x25:
mov ah, 00h
mov al, 03h
int 10h
; выдаем сообщение приветствия:
lea si, msg
call print_string
; bios передает номер диска в dl:
mov ah, 02h
mov al, 10 ; чтение секторов
mov ch, 0 ; цилиндр
mov cl, 2 ; сектор
mov dh, 0 ; головка
; dl не меняется! - номер диска
; буфер данных:
mov bx, 0800h
mov es, bx
mov bx, 0
; чтение!
int 13h
; проверка целостности:
cmp es:[0000],0E9h ; первый байт ядра должен быть 0E9 (jmp).
je integrity_check_ok
; ошибкапри проверки целостности
lea si, err
call print_string
; ожидаем нажатия клавиши
mov ah, 0
int 16h
; храним значение в 0040h:0072h:
; 0000h - холодная загрузка
; 1234h - перезапуск из памяти
mov ax, 0040h
mov ds, ax
mov w.[0072h], 0000h ;холодная загрузка
jmp 0ffffh:0000h ;reboot!
integrity_check_ok:
; передача управления на ядро:
jmp 0800h:0000h
print_string proc near
push ax
push si
next_char:
mov al, [si]
cmp al, 0
jz printed
inc si
mov ah, 0eh
int 10h
jmp next_char
printed:
pop si
pop ax
ret
print_string endp
Запись бинарника на дискетку
PHP код:
name "writebin"
org 100h
jmp st
filename db 128 dup(0)
buffer db 512 dup (0)
buffer_size = $ - offset buffer
handle dw 0
kernel_flag db 0
counter dw 0
sect db 1
cyld db 0
head db 0
drive db 0
st: mov ax, cs
mov ds, ax
mov es, ax
call clear_screen
cp: xor cx, cx
mov cl, [80h]
jcxz np
mov si, 82h
mov di, offset filename
cld
rep movsb
mov [di-1], 0
cld
xor cx, cx
mov cl, [80h]
mov di, offset filename
mov al, '/'
repne scasb
jz fs
jmp boot
fs: cmp [di-2], ' '
jne nsp
mov [di-2], 0
nsp:mov [di-1], 0
or [di], 0010_0000b
cmp [di], 'k'
jne wp
or kernel_flag, 1
mov sect, 2
lea dx, s0
mov ah, 9
int 21h
jmp s0s
s0 db 0Dh,0Ah,"[/k] - start from sector: 2 " , 0Dh,0Ah, '$'
s0s:
jmp of
boot:
lea dx, s3
mov ah, 9
int 21h
jmp s3s
s3 db 0Dh,0Ah," boot record ", 1 , 0Dh,0Ah, '$'
s3s:
; open file
of: mov ah, 3dh
mov al, 0
mov dx, offset filename
int 21h
jc co
mov handle, ax
lea dx, m0
mov ah, 9
int 21h
jmp m0m
m0 db "opened: $"
m0m:
mov si, offset filename
call print_string
; read bytes from file
rd: mov ah, 3fh
mov bx, handle
mov cx, buffer_size
mov dx, offset buffer
int 21h
jc er
cmp ax, 0 ; no bytes left?
jz cf
; write bytes to disk
wr: mov ah, 03h
mov al, 1 ; write 1 sector (512 bytes).
mov cl, sect ; sector (1..18)
mov ch, cyld ; cylinder (0..79)
mov dh, head ; head (0..1)
mov dl, drive ; always 0 (A:)
mov bx, offset buffer
int 13h
jc er
inc counter
; set cursor at 2,5
mov ah, 2
mov dh, 5
mov bh, 0
int 10h
; show current progress:
lea dx, s1
mov ah, 9
int 21h
jmp s1s
s1 db 1Dh,0Ah,"writing: $"
s1s:
mov ax, counter
call print_num_uns
; sectors... cylinders... heads...
cmp kernel_flag, 1
jne cf
inc sect
cmp sect, 18
jbe rd ; ^
mov sect, 1
inc cyld
cmp cyld, 79
jbe rd ; ^
mov cyld, 0
inc head
cmp head, 1
jbe rd ; ^
; close file
cf: mov bx, handle
mov ah, 3eh
int 21h
jc er
jmp ex
co: lea dx, e0
mov ah, 9
int 21h
jmp e0e
e0 db " cannot open the file...",0Dh,0Ah,'$'
e0e:
jmp ex
np: lea dx, e1
mov ah, 9
int 21h
jmp e1e
e1 db " no parameters...",0Dh,0Ah
db "==============================================================================",0Dh,0Ah
db "this program was designed especially to test VeHG -operating system",0Dh,0Ah
db "if you are emulating in emu8086, click file->set command line parameters.",0Dh,0Ah
db "from command prompt type:", 0Dh,0Ah
db " writebin [filename] [/k]",0Dh,0Ah,
db "when /k parameter is specified file is written to second sector (kernel area).",0Dh,0Ah,
db "==============================================================================",0Dh,0Ah,'$'
e1e: jmp ex
er: lea dx, e2
mov ah, 9
int 21h
jmp e2e
e2 db " i/o error...",0Dh,0Ah,'$'
e2e:
jmp ex
wp: lea dx, e3
mov ah, 9
int 21h
jmp e3e
e3 db " wrong parameter. only [/k] is supported. use 8.3 short file names only.",0Dh,0Ah,'$'
e3e:
ex: lea dx, m1
mov ah, 9
int 21h
jmp m1m
m1 db 0Dh,0Ah," total sectors: $"
m1m:
mov ax, counter
call print_num_uns
lea dx, m2
mov ah, 9
int 21h
jmp m2m
m2 db 0Dh,0Ah, "thank your for using writebin! - VeHG.com - 2008 (c) freeware",0Dh,0Ah
db " press any key...",0Dh,0Ah, '$'
m2m:
; wait for any key...
mov ah, 0
int 16h
ret ; exit.
; this macro prints a char in AL and advances
; the current cursor position:
PUTC MACRO char
PUSH AX
MOV AL, char
MOV AH, 0Eh
INT 10h
POP AX
PUTC ENDM
; prints out an unsigned value of AX register.
; allowed values from 0 to 65535
print_num_uns proc near
push ax
push bx
push cx
push dx
; flag to prevent printing zeros before number:
mov cx, 1
; (result of "/ 10000" is always less or equal to 9).
mov bx, 10000 ; 2710h - divider.
; ax is zero?
cmp ax, 0
jz print_zero
begin_print:
; check divider (if zero go to end_print):
cmp bx,0
jz end_print
; avoid printing zeros before number:
cmp cx, 0
je calc
; if ax<bx then result of div will be zero:
cmp ax, bx
jb skip
calc:
mov cx, 0 ; set flag.
mov dx, 0
div bx ; ax = dx:ax / bx (dx=remainder).
; print last digit
; ah is always zero, so it's ignored
add al, 30h ; convert to ascii code.
putc al
mov ax, dx ; get remainder from last div.
skip:
; calculate bx=bx/10
push ax
mov dx, 0
mov ax, bx
div cs:ten ; ax = dx:ax / 10 (dx=remainder).
mov bx, ax
pop ax
jmp begin_print
print_zero:
putc '0'
end_print:
pop dx
pop cx
pop bx
pop ax
ret
ten dw 10 ; used as divider.
print_num_uns endp
; print null terminated string at ds:si
print_string proc near
push ax ; store registers...
push si ;
nxtch: mov al, [si]
cmp al, 0
jz printed
inc si
mov ah, 0eh ; teletype function.
int 10h
jmp nxtch
printed:
pop si ; re-store registers...
pop ax ;
ret
print_string endp
clear_screen proc near
push ax ; store registers...
push ds ;
push bx ;
push cx ;
push di ;
mov ax, 40h
mov ds, ax ; for getting screen parameters.
mov ah, 06h ; scroll up function id.
mov al, 0 ; scroll all lines!
mov bh, 07 ; attribute for new lines.
mov ch, 0 ; upper row.
mov cl, 0 ; upper col.
mov di, 84h ; rows on screen -1,
mov dh, [di] ; lower row (byte).
mov di, 4ah ; columns on screen,
mov dl, [di]
dec dl ; lower col.
int 10h
; set cursor position to top
; of the screen:
mov bh, 0 ; current page.
mov dl, 0 ; col.
mov dh, 0 ; row.
mov ah, 02
int 10h
pop di
pop cx
pop bx
pop ds
pop ax
ret
clear_screen endp
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|