Загрузчик

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by v4567, 24 May 2008.

  1. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Здравствуйте форумчане!
    Помогите разобраться, необходимо загрузить программу в оперативную память при включении компьютера. Программа работает без операционной системы. Она должна загрузиться не в тот сегмент в который БИОС загрузит мой загрузчик, т.к. БИОС грузит загрузчик в нулевой сегмент по смещению 7C00h это где-то 32 кбайта, а моя программа 40кбайт поэтому в этот сегмент она не поместиться, загрузчик я написал. Вопрос как осуществить дальний прыжок в другой сегмент командой jmp что-бы передать управление моей программе, у меня что-то ничего не получается, и в какой сегмент загружать мою программу, повторяю программа работает без операционной системы, да забыл написать загружаюсь я с дискеты, загрузчик и п программа находятся на дискете.
    Привожу код загрузчика, там где вопросы непонятно что писать.

    ; zagr.asm - Загрузчик.


    Code:
    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,??????h
    	mov es,ax
    	mov ch,0h
    	mov ah,2h
    	mov al,8d
    	mov cl,2h
    	mov dh,0h
    	mov dl,0h
    	mov bx,??????h
    	int 13h
    	pop es
    	pop bx
    	pop cx
    	pop dx
    	pop ax
    	jmp dword ptr [perex]
    	
    perex dd ???????h
    
    begin endp
    cseg ends
    end begin
    В регистр ax а потом и в es заносится адрес сегмента в bx смещение, и осуществляется дальний переход, собственно что писать вместо вопросов какие адреса?
    Форумчане помогите пожалуйста, за помощь заранее благодарен.
     
    #1 v4567, 24 May 2008
    Last edited by a moderator: 25 May 2008
    1 person likes this.
  2. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Interrupt List by Ralf Brown, скачай.

    Code:
    povtor1:
    mov ax,??????h
    mov es,ax
    mov ch,0h
    mov ah,2h
    mov al,8d
    mov cl,2h
    mov dh,0h
    mov dl,0h
    mov bx,??????h
    int 13h
    
    Прерывание int 13h http://www.ctyme.com/intr/int-13.htm
     
    1 person likes this.
  3. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Не про список прерываний я спрашивал, мне непонятно как осуществить дальний прыжок в другой сегмент и в какой сегмент грузить мою программу.
     
  4. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Там написано, что ложить в AX/AH, ты это место отметил в коде ??????

    http://www.ctyme.com/intr/int-13.htm
     
  5. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Overbreak, спасибо что помогаешь. Я посмотрел эту страницу и в своей программе я записал далее в ah 2h тоесть прерывание 13 функчия 2 чтение с дискеты сектора далее для этой функции указал какие и сколько секторов читать, понял свою первую ошибку указал мало секторов, моя программа занимает больше.
    У меня в начале загрузчика записывается в es адрес сектора вот какой сектор записать я и не знаю и как сделать дальний прыжок не знаю, то что написано на этой странице я знаю оно в загрузчике отражено вопрос не в этом.
     
  6. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    дальний прыжок всмысле jmp far/qword адрес

    Прочти доки по файловой системе FAT*, здесь обсуждалось устройство дискеты
    http://wasm.ru/forum/viewtopic.php?id=26488
     
  7. v4567

    v4567 New Member

    Joined:
    9 May 2008
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Да именно jmp far/dword
    Я сделал так, косвенный дальний переход:

    jmp dword ptr [perex]

    perex dd 11170000h

    1117 - сектор
    0000 - смещение

    не знаю правильно или нет 0verbreaK если знаешь подскажи правильно так будет или нет.
     
  8. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Загрузка сектора:

    - получаем номер сектора dx:ax
    - преобразуем его к CSH (цилиндр, сектор, сторона)
    - используем прерывание BIOS int 13h

    Пишем свой загрузочный сектор http://www.cyberguru.ru/programming/assembler/assembler-boot-sector.html

    Code:
    
    PB_BytsPerSec dw 0x200 ; Байт на сектор
    BPB_SecPerClus db 1 ; Секторов на кластер
    BPB_RsvdSecCnt dw 1 ; Число резервных секторов
    BPB_NumFATs db 2 ; Количектво копий FAT
    BPB_RootEntCnt dw 224 ; Элементов в корневом катологе (max)
    BPB_TotSec16 dw 2880 ; Всего секторов или 0
    BPB_Media db 0xF0 ; код типа устройства
    BPB_FATsz16 dw 9 ; Секторов на элемент таблицы FAT
    BPB_SecPerTrk dw 18 ; Секторов на дорожку
    BPB_NumHeads dw 2 ; Число головок
    BPB_HiddSec dd 0 ; Скрытых секторов
    BPB_TotSec32 dd 0 ; Всего секторов или 0
    
    Все зависит от файловой системы, на дискетах по моему FAT12/16
     
  9. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    >> мне непонятно как осуществить дальний прыжок в другой сегмент

    push _segment
    push _offset
    retf