ANTICHAT Forum
HOME FORUMS MEMBERS RECENT POSTS LOG IN  
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #31  
Старый 26.05.2008, 20:07
v4567
Новичок
Регистрация: 09.05.2008
Сообщений: 7
С нами: 9476635

Репутация: 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..
 
Ответить с цитированием

  #32  
Старый 26.05.2008, 20:53
De-visible
Banned
Регистрация: 06.01.2008
Сообщений: 904
С нами: 9655526

Репутация: 1821


По умолчанию

Автор не z01b!
Там есть копирайты если что...
 
Ответить с цитированием

  #33  
Старый 26.05.2008, 22:08
v4567
Новичок
Регистрация: 09.05.2008
Сообщений: 7
С нами: 9476635

Репутация: 10
По умолчанию

De-visible, если знаешь где у меня ошибка в программе или есть информация по даному вопросу или исходные тексты аналогичного загрузчика, помоги мне пожалуйста.
 
Ответить с цитированием

  #34  
Старый 03.07.2008, 01:49
z01b
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
С нами: 10182506

Репутация: 1393


По умолчанию

Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать.
http://wasm.ru/forum/attachment.php?item=2197
 
Ответить с цитированием

  #35  
Старый 03.07.2008, 03:20
0verbreaK
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами: 9489537

Репутация: 136
По умолчанию

Цитата:
Сообщение от z01b  
Сегодня нарыл еще одну интересную статейку по сабжу, кому интересно, может скачать и читать.
http://wasm.ru/forum/attachment.php?item=2197
ссылку на тему плз
 
Ответить с цитированием

  #36  
Старый 03.07.2008, 13:44
z01b
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
С нами: 10182506

Репутация: 1393


По умолчанию

Цитата:
Сообщение от 0verbreaK  
ссылку на тему плз
Вот перезалил http://slil.ru/25953519
 
Ответить с цитированием

v4567 ответ по вопросу
  #37  
Старый 03.07.2008, 15:30
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
С нами: 9980798

Репутация: 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 
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните мне пожалуйста с нуля LoneWolf666 Уязвимости 12 12.02.2006 22:56



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.