IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Aide Kernel Affichage ecran


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Aide Kernel Affichage ecran
    Bonjour a tous je viens a vous car je suis perdu j'ai coder un bootloader et un noyau et voici mon souci donc le bootloader charge les interruptions du clavier et charge le vesa 640x480 et lance le noyau donc le noyau analyse le disque et si il trouve le fichier configkrl il le démarre sinon on tombe sur un shell ( X:\" ) donc le shell a plusieurs option affiche les fichier du répertoire redémarre le pc il le stop il éffaçe l'ecran comme la commande CLS le souci c'est que quand je lance plusieurs commande arriver en bas de l'écran il m'affiche plus rien les commande sont bloqué mai le shell fonctionne toujours car je peut le rebooter ou arreter le pc

    vola ma question : Coment je peut faire pour faire démarrer un fichier externe un *.bin ou *.com

    Ex : X:\start monfichier.com ou .bin

    tous simplement Merci de votre aide

  2. #2
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    bonjour,

    c'est toi qui gère l'affichage VESA ? certaines cartes ne gèrent pas toutes les fonctionnalités d'affichage de texte dans ces modes.
    Certaines n'affichent même pas du texte.

    as-tu besoin de mode VESA pour le boot ? pourquoi ne pas partir sur le mode texte, et ensuite basculer lors du démarrage de ton système,
    et gérer toutes les fonctionnalités (affichage texte, graphique, fenêtre peut-être....)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Sxsx-no
    Bonjour pour le Mode Vesa ( affichage de l'écran j'ai trouver mon erreur =) Merci pour ta réponse si rapide
    ma dexieme question et comme puis je lancer un application externe avec mon shell comme start par exemple

    X:\start monprogrm.bin ou .com



    pour le vesa c'est resolue merci

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Je dirais que c'est à toi de voir comment tu veux gérer tes exécutables...

    du rudimentaire comme l'étaient les .COM du DOS
    ou plus complexe avec échange d'informations, permissions etc...

    Si ta question était plutôt "comment lancer des programmes DOS depuis mon shell", bien tu peux oublier, à moins de
    recréer toutes routines du DOS (int 21h)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut sxsx-no
    Tu est super j'arrive enfin à y voir claire dans l'ASM derniere Question si cela te dérange pas car parmi tous les forum sur le net tu et le seul a me répondre j'ai aussi lancer se shell depuis une clef usb ou un ISO mais quand je crée un iso il me démarre bien mon boot puis m'affiche noyau introuvable ?

    donc mon boot en : boot.bin et noyau.xno

    je compile :
    copy boot.bin/B+ noyau.xno boot.img/Y

    je crée un iso avec cette img mais il ne démarre pas mon noyau n'i sur Iso ni Usb a tu une solution ? Merci beaucoup pour toute ton aide Tres gentil

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Ok, j'avais mal compris ton problème, ce n'est pas toi qui a programmé ce "shell",
    mais il est lancé au lieu de booter sur ton code c'est bien ça ?

    Dans ce cas, tu trouveras sûrement une réponse dans la rubrique "Programmation d'OS"

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    bonsoir merci pour tes réponse je ne cherche pas a crée un os juste un simple shell comme Freedos j'ai crée un shell avec du mal avec des tuto sur les net et plein d'information sur wikipedia j'ai mi quelque moi a le faire donc je resume :

    j'ai un boot qui charge juste le micro-noyau

    le noyau démarre et la il charge les interuption du clavier Etc ... mais quand je le boot sur usb avec Grub Par exemple il me demarre mon boot mais le boot ne trouve pas mon noyau alors que le noyau et bien la
    Idem pour les iso je compile un Iso bootable avec mon boot mais le noyau n'est pas trouver et la je plane

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    si je vois bien tu a deja etait confronter a se souci a cette adresse :

    http://www.developpez.net/forums/d64...oader-cle-usb/

    mais je ne comprend pas comment il a fait car mois aussi j'ai recuperai la valeur du registre DL que j'ai palcer dans la variable mais apres je suis perdu total

  9. #9
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Je ne sais pas comment GRUB gère le boot d'autres périphériques...
    pourquoi n'essaies-tu pas de spécifier l'ordre de démarrage dans le setup ? ( ou par l'appuie d'une touche de fonction au boot)

    Le mieux serait peut-être que tu postes la partie de ton code qui ne fonctionne pas, il y a beaucoup trop de causes possibles
    à ce plantage...

    edit: je viens de penser à une chose, au début de ton programme de boot, il faut sauvegarder le contenu de DL
    car ce dernier contient le numéro de lecteur


    à+

    PS: FREEDOS n'est pas un qu'un shell, c'est un OS

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    voila un bout du bootloader qui normalement doit
    booter mon micro-shell ( bootloader du site de A.michelizella de pepin )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
     
    %define BASE    0x100  ; 0x0100:0x0 = 0x1000
    %define KSIZE   50     ; nombre de secteurs a charger
     
    [BITS 16]
    [ORG 0x0]
     
    jmp start
    %include "UTIL.INC"
    start:
     
    ; initialisation des segments en 0x07C0
        mov ax, 0x07C0
        mov ds, ax
        mov es, ax
        mov ax, 0x8000    ; stack en 0xFFFF
        mov ss, ax
        mov sp, 0xf000
     
    ; recuparation de l'unite de boot
        mov [bootdrv], dl    
     
    ; affiche un msg
        mov si, msgDebut
        call afficher
     
    ; charger le noyau
        xor ax, ax
        int 0x13
     
        push es
        mov ax, BASE
        mov es, ax
        mov bx, 0
        mov ah, 2
        mov al, KSIZE
        mov ch, 0
        mov cl, 2
        mov dh, 0
        mov dl, [bootdrv]
        int 0x13
        pop es
     
    ; initialisation du pointeur sur la GDT
        mov ax, gdtend    ; calcule la limite de GDT
        mov bx, gdt
        sub ax, bx
        mov word [gdtptr], ax
     
        xor eax, eax      ; calcule l'adresse lineaire de GDT
        xor ebx, ebx
        mov ax, ds
        mov ecx, eax
        shl ecx, 4
        mov bx, gdt
        add ecx, ebx
        mov dword [gdtptr+2], ecx
     
    ; passage en modep
        cli
        lgdt [gdtptr]    ; charge la gdt
        mov eax, cr0
        or  ax, 1
        mov cr0, eax        ; PE mis a 1 (CR0)
     
        jmp next
    next:
        mov ax, 0x10        ; segment de donne
        mov ds, ax
        mov fs, ax
        mov gs, ax
        mov es, ax
        mov ss, ax
        mov esp, 0x9F000    
     
        jmp dword 0x8:0x1000    ; reinitialise le segment de code
     
    ;--------------------------------------------------------------------
    bootdrv:  db 0
    msgDebut: db "Chargement du kernel", 13, 10, 0
    ;--------------------------------------------------------------------
    gdt:
        db 0, 0, 0, 0, 0, 0, 0, 0
    gdt_cs:
        db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10011011b, 11011111b, 0x0
    gdt_ds:
        db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10010011b, 11011111b, 0x0
    gdtend:
    ;--------------------------------------------------------------------
    gdtptr:
        dw 0  ; limite
        dd 0  ; base
    ;--------------------------------------------------------------------
     
    ;; NOP jusqu'a 510
    times 510-($-$$) db 144
    dw 0xAA55

  11. #11
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Mais ce bootloader est en mode protégé
    Ton programme est-il en mode protégé ?

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    non a la base il etait en mode proteger mais le kernel ne passer pas donc en cherchent sur le net j'ai trouver des tuto en anglais pour crée un booloader voici le nouveau bootloader
    il ne passe pas en mode protéger car il me donne erreur ( Erreur de processeur irrécupérable )

    le problème c'est que en boot sur Usb il me démarre le nouveau boot mais pas le noyau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
     
    Bits	16
    %define secteur  11
    %define port_clavier_60			60h
    %define 	nbr_sector  0x20  
     
    jmp	Main
     
    convert_sector:
    push	bx
    push	ax
    mov	bx, ax
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    add	dl, 01h
    mov	cl, dl
    mov	ax, bx
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    mov	dx, 0
    div	WORD [Sides]
    mov	dh, dl
    mov	ch, al
    pop	ax
    pop	bx
    mov	dl, BYTE [BootDrive]
    ret
     
    SectorsPerTrack	dw	18
    Sides	dw	2
     
    reset_floppy:
    mov	ax, 0
    mov	dl, BYTE [BootDrive]
    int	13h
    ret
     
     
    Print:
    lodsb
    cmp	al, 0
    je	Done
    mov	ah, 0eh
    int	10h
    jmp	Print
     
    Done:
    ret
     
    Main:
    cli
    mov	ax, 0x0000
    mov	ss, ax
    mov	sp, 0xFFFF
    sti
    mov	ax, 07C0h
    mov	ds, ax
    mov	es, ax
     
    mov	[BootDrive], dl
     
     
    ;mov si,msg_disk
    ;call   Print
    ;mov si, msg_krl
    ;call Print
    mov si, msg_kyb
    call Print
    mov si, msg_vga
    call Print
    mov	si, msg1
    call	Print
     
    hlt
    attend_frappe:
    mov ah,0		
    int 16h
    xor ax,ax
    in al,port_clavier_60
    test al,10000000b		
    jnz attend_frappe		
     
    mov	ch, 0
    mov	cl, 2
    mov	dh, 1
    mov	bx, buffer
    mov	al, secteur
    mov	ah, 2
    pusha
    load_root:
    int	13h
    jnc	loaded_root
    call	reset_floppy
    jmp	load_root
     
    loaded_root:
    popa
    mov	di, buffer
    mov	cx, 224
    search_root:
    push	cx
    pop	dx
    mov	si, filename
    mov	cx, 11
    rep	cmpsb
    je	found_file
    add	ax, 32
    mov	di, buffer
    add	di, ax
    push	dx
    pop	cx
     
    loop	search_root
    mov	si, msg
    call	Print
    cli
    hlt
     
    msg	db	'Erreur Noyau SxS Non Trouver!',0
    msg1  db 'Appuyez sur une touche pour demarrer SxS',10,13,0
    msg_disk  db 'Chargement Du Disque  [OK]',10,13,0
    msg_krl   db 'Chargement Du Noyau   [OK]',10,13,0
    msg_kyb   db 'Chargement Du Clavier [OK]',10,13,0
    msg_vga   db '',10,13,0
     
    found_file:
    mov	ax, WORD [di+15]
    mov	[FirstSector], ax
     
    mov	bx, buffer
    mov	ax, 1
    call	convert_sector
    mov	al, 9
    mov	ah, 2
    pusha
    load_fat:
    int	13h
    jnc	loaded_fat
    call	reset_floppy
    jmp	load_fat
     
     
    loaded_fat:
    mov	ah, 2
    mov	al, 1
    push	ax
     
    load_file_sector:
    mov	ax, WORD [FirstSector]
    add	ax, 31
    call	convert_sector
    mov	ax, 2000h
    mov	es, ax
    mov	bx, WORD [Pointer]
     
    pop	ax
    push	ax
     
    int	13h
    jnc	calculate_next_sector
    call	reset_floppy
    jmp	load_file_sector
     
    calculate_next_sector:
    mov	ax, [FirstSector]
    mov	dx, 0
    mov	bx, 6
    mul	bx
    mov	bx, 4
    div	bx
    mov	si, buffer
    add	si, ax
    mov	ax, WORD [si]
     
    or	dx, dx
    jz	even
     
    odd:
    shr	ax, 4
    jmp	short next_sector_calculated
     
    even:
    and	ax, 0FFFh
     
    next_sector_calculated:
    mov	WORD [FirstSector], ax
    cmp	ax, 0FF8h
    jae	end
    add	WORD [Pointer], 512
    jmp	load_file_sector
     
    end:
    pop	ax
    mov	dl, BYTE [BootDrive]
    jmp	2000h:0000h
     
    BootDrive	db	0
    filename	db	"KERNEL  XNO"
    FirstSector	dw	0
    Pointer	dw	0
     
    times 510 - ($-$$)	db	0
     
    buffer:
     
    dw	0xAA55
    " UN GRAND MERCI POUR TON AIDE TU EST SUPER "

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    je réexplique si tu ne ma pas compris j'ai chercher a crée bootloader avec un micro-noyau qui me lance un shell

    j'ai utiliser le bootloader qui recharge la GDT de ( PEPIN )

    mais le noyau ne démarre pas

    donc j'ai trouver des tuto en anglais qui ma permis de crée un bootloader qui passe en 16 Bits qui démarre bien mon kernel ( mais il le démarre pas sur usb )

    donc je cherche a démarrer mon noyau depuis un Usb et passer en mode protéger mais je plante total

  14. #14
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    ok, ton shell est en 16 bit, donc c'est normal qu'il ne démarre pas avec ce bootloader.

    Au démarrage (lors du boot) le processeur est en 16 bits, et peut pafaitement démarrer depuis une clé USB

    Le problème vient donc de ton bootloader en 16 bits.

    pourrais-tu nous le poster ?

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    voici mon bootloader en 16bit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    Bits	16
    %define secteur  1
    %define port_clavier_60			60h
     
     
    jmp	Main
     
    convert_sector:
    push	bx
    push	ax
    mov	bx, ax
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    add	dl, 01h
    mov	cl, dl
    mov	ax, bx
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    mov	dx, 0
    div	WORD [Sides]
    mov	dh, dl
    mov	ch, al
    pop	ax
    pop	bx
    mov	dl, BYTE [BootDrive]
    ret
     
    SectorsPerTrack	dw	18
    Sides	dw	2
     
    reset_floppy:
    mov	ax, 0
    mov	dl, BYTE [BootDrive]
    int	13h
    ret
     
     
    Print:
    lodsb
    cmp	al, 0
    je	Done
    mov	ah, 0eh
    int	10h
    jmp	Print
     
    Done:
    ret
     
    Main:
    mov	[BootDrive], dl
     
    mov ah,0x00                
    mov dl,0x00          
    int 0x13           
    cli
    mov	ax, 0x0100
    mov	ss, ax
    mov	sp, 0xFFFF
    sti
    mov	ax, 07C0h
    mov	ds, ax
    mov	es, ax	
     
    mov si,msg_disk
    call   Print
    mov si, msg_krl
    call Print
    mov si, msg_kyb
    call Print
    mov si, msg_vga
    call Print
    mov	si, msg1
    call	Print
     
    hlt
    attend_frappe:
    mov ah,0		
    int 16h
    xor ax,ax
    in al,port_clavier_60
    test al,10000000b		
    jnz attend_frappe		
     
     
    mov	ch, 0
    mov	cl, 2
    mov	dh, 1
    mov	bx, buffer
    mov	al, secteur
    mov	ah, 2
    pusha
    load_root:
    int	13h
    jnc	loaded_root
    call	reset_floppy
    jmp	load_root
     
    loaded_root:
    popa
    mov	di, buffer
    mov	cx, 224
    search_root:
    push	cx
    pop	dx
    mov	si, filename
    mov	cx, 11
    rep	cmpsb
    je	found_file
    add	ax, 32
    mov	di, buffer
    add	di, ax
    push	dx
    pop	cx
     
    loop	search_root
    mov	si, msg
    call	Print
    cli
    hlt
     
    msg	db	'Erreur Noyau SxS Non Trouver!',0
    msg1  db 'Appuyez sur une touche pour demarrer SxS',10,13,0
    msg_disk  db 'Chargement Du Disque  [OK]',10,13,0
    msg_krl   db 'Chargement Du Noyau   [OK]',10,13,0
    msg_kyb   db 'Chargement Du Clavier [OK]',10,13,0
    msg_vga   db '',10,13,0
     
    found_file:
    mov	ax, WORD [di+15]
    mov	[FirstSector], ax
     
    mov	bx, buffer
    mov	ax, 1
    call	convert_sector
    mov	al, 9
    mov	ah, 2
    pusha
    load_fat:
    int	13h
    jnc	loaded_fat
    call	reset_floppy
    jmp	load_fat
     
     
    loaded_fat:
    mov	ah, 2
    mov	al, 1
    push	ax
     
    load_file_sector:
    mov	ax, WORD [FirstSector]
    add	ax, 31
    call	convert_sector
    mov	ax, 2000h
    mov	es, ax
    mov	bx, WORD [Pointer]
     
    pop	ax
    push	ax
     
    int	13h
    jnc	calculate_next_sector
    call	reset_floppy
    jmp	load_file_sector
     
    calculate_next_sector:
    mov	ax, [FirstSector]
    mov	dx, 0
    mov	bx, 6
    mul	bx
    mov	bx, 4
    div	bx
    mov	si, buffer
    add	si, ax
    mov	ax, WORD [si]
     
    or	dx, dx
    jz	even
     
    odd:
    shr	ax, 4
    jmp	short next_sector_calculated
     
    even:
    and	ax, 0FFFh
     
    next_sector_calculated:
    mov	WORD [FirstSector], ax
    cmp	ax, 0FF8h
    jae	end
    add	WORD [Pointer], 512
    jmp	load_file_sector
     
    end:
    pop	ax
    mov	dl, BYTE [BootDrive]
    jmp	2000h:0000h
     
    BootDrive	db	0
    filename	db	"KERNEL  XNO"
    FirstSector	dw	0
    Pointer	dw	0
     
    ;times 510 - ($-$$)	db	0
     
    buffer:
     
    dw	0xAA55

  16. #16
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Pfiou ! c'est chaud là ...

    programmer en assembleur ne consiste pas juste à recopier quelques bouts de codes et à les coller
    à la suite.

    J'ai pas lu tout ton programme, mais voici quelques boulettes relevées à la va-vite :

    - tu as un sous programme "reset_floppy" mais tu ne l'utilises pas au début du programme principal (en plus il réinitialise le lecteur de disquette)
    - au début du main donc, tu initialise sans passer par reset_floppy, le lecteur de disquette (dl=0) au lieu d'utiliser la valeur sauvée dans bootdrive
    - tu affiches les messages avant d'avoir effectué les actions
    - tu utilises la fonction 0 de l'int 16h qui attend un touche au clavier, et ensuite tu viens lire directement dans le port clavier sans attendre la moindre interruption matérielle...
    - dans load-root, dl n'est pas initialisé avec le numéro de bootdrive
    - il y en a sûrement beaucoup d'autres, mais là j'ai plus trop envie...

    - Enfin, pourquoi avoir mis la ligne "times 510 - ($-$$) db 0" en commentaire ???
    Un secteur de boot fait 512 octets, et le code AA55h sur les 2 derniers octets permet de valider que ce secteur est bien bootable.

    Bon, y'a encore du boulot là

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    bonjour merci d'avoir regarder le code source pour les erreur désolé je débute juste depuis 2 mois je commence juste a connaitre les base mais c'est dur de trouver des tutoriel sur assembleur x86 quand je compile le boot et le shell sur floppyA je lance virtual pc qui démarre nickel mon programme si tu a de bon tutoriel sur asm ( nasm ) je serait heureux je cherche juste faire évoluer mais connaissance en informatique

    voila si tu veux en savoir plus voici mon skype : x-no37

    ENCORE UN GRAND MERCI POUR TON AIDE

  18. #18
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Sorry je n'utilise pas skype.

    Par contre, je pense qu'il serait intéressant pour tous que tu continue sur ce post, jusqu'à ce que ton problème soit résolu.
    pose tes questions sur des bouts de code, et poste régulièrement ton code comme précédemment.
    Puisque tu débutes, je te conseille de commenter tes lignes de programme au maximum.

    Tu as la possibilité de repartir de zéro avec un code de boot qui fonctionne déjà en 16 bits,
    mais puisque ce n'est pas pour un devoir mais pour ta culture générale, autant faire fonctionner celui-ci

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Bolivie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour merci pour ta réponse, oui je vais continuer mon projet se n'est pas la première fois que j''ai un souci avec la programmation j'ai passer du temps sur le C/C++ pour mon bootloader je les un peut modifier

    le bootloader fonctionne toujours sur une disquette virtuel sans erreur mais sur usb il me dit que mon shell n'est pas trouver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
     
    Bits	16   ;on passe en 16Bits
    %define secteur  1   ; la valeur AL et equivalent a 1 ( secteur )
    %define port_clavier_60			60h 
     
     
    jmp	Main   ; on saut a Main 
     
    convert_sector:
    push	bx
    push	ax
    mov	bx, ax
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    add	dl, 01h
    mov	cl, dl
    mov	ax, bx
    mov	dx, 0
    div	WORD [SectorsPerTrack]
    mov	dx, 0
    div	WORD [Sides]
    mov	dh, dl
    mov	ch, al
    pop	ax
    pop	bx
    mov	dl, BYTE [BootDrive]
    ret
     
    SectorsPerTrack	dw	18
    Sides	dw	2
     
    reset_floppy:
    mov	ax, 0
    mov	dl, BYTE [BootDrive]
    int	13h
    ret
     
     
    Print:
    lodsb
    cmp	al, 0
    je	Done
    mov	ah, 0eh
    int	10h
    jmp	Print
     
    Done:
    ret
     
    Main:
    call reset_floppy   ; on reinitialise le floppy 
    mov [BootDrive], dl ; recuparation de l'unite de boot
    cli                  ; initialisation des segments
    mov	ax, 0x07C0
    mov	ss, ax
    mov	sp, 0xf000
    sti
    mov	ax, 07C0h
    mov	ds, ax
    mov	es, ax	
    mov si, msg_kyb     ;affiche le msg clavier
    call Print          ; saut a print pour afficher le msg
    mov si, msg_vga     ;affiche le msg vide pour sauter un ligne
    call Print          ; saut a print pour afficher le msg
    mov	si, msg1        ;affiche le msg pour appuyer sur un touche pour démarrer le systeme 
    call	Print        ; saut a print pour afficher le msg
    mov	ch, 0
    mov	cl, 2
    mov	dh, 1  
    mov	bx, buffer
    mov	al, secteur
    mov	ah, 2
    pusha
    load_root:   
    int	13h
    jnc	loaded_root
    ;call  reset_floppy
    jmp	load_root
     
    loaded_root:
    hlt                ; ici on attend un frappe du clavier pour demarrer le shell
    attend_frappe:
    mov ah,0		
    int 16h
    xor ax,ax
    in al,port_clavier_60
    test al,10000000b		
    jnz attend_frappe	;si on a appuyer sur un touche on continue 
    popa
    mov	di, buffer
    mov	cx, 224
    search_root:       ; ici on recherche le shell 
    push	cx
    pop	dx
    mov	si, filename  ; ici ont cherche le nom du shell
    mov	cx, 11
    rep	cmpsb
    je	found_file    ; si on trouve le shell on continue 
    add	ax, 32
    mov	di, buffer
    add	di, ax
    push	dx
    pop	cx
     
    loop	search_root
    mov	si, msg       ; si on trouve pas le shell Erreur on affiche le msg Non trouvé
    call	Print
    cli
    hlt              ; et la on bloque le boot sur le msg 
     
    msg	db	'Erreur Noyau SxS Non Trouver!',0
    msg1  db 'Appuyez sur une touche pour demarrer SxS',10,13,0
    msg_kyb   db 'Chargement Du Clavier [OK]',10,13,0
    msg_vga   db '',10,13,0
     
    found_file:          ; donc si on trouve le shell on contine
    mov	ax, WORD [di+15]
    mov	[FirstSector], ax
    mov	bx, buffer
    mov	ax, 1
    call	convert_sector
    mov	al, 9
    mov	ah, 2
    pusha
    load_fat:
    int	13h
    jnc	loaded_fat
    call reset_floppy   ; on reinitialise la disquette 
    jmp	load_fat
     
    loaded_fat:
    mov	ah, 2
    mov	al, 1
    push	ax
     
    load_file_sector:
    mov	ax, WORD [FirstSector]
    add	ax, 31
    call	convert_sector
    mov	ax, 2000h
    mov	es, ax
    mov	bx, WORD [Pointer]
     
    pop	ax
    push	ax
     
    int	13h
    jnc	calculate_next_sector ; si on a aucun souci de secteur on continue 
    call	reset_floppy     ; si on a un souci de secteur on reinitialiser la disquette 
    jmp	load_file_sector
     
    calculate_next_sector:   ; on calcule les secteur suivant
    mov	ax, [FirstSector]
    mov	dx, 0
    mov	bx, 6
    mul	bx
    mov	bx, 4
    div	bx
    mov	si, buffer
    add	si, ax
    mov	ax, WORD [si]
     
    or	dx, dx
    jz	even
     
    odd:
    shr	ax, 4
    jmp	short next_sector_calculated
     
    even:
    and	ax, 0FFFh
     
    next_sector_calculated:
    mov	WORD [FirstSector], ax
    cmp	ax, 0FF8h
    jae	end
    add	WORD [Pointer], 512
    jmp	load_file_sector
     
    end:
    pop	ax
    mov	dl, BYTE [BootDrive]     ; on charge le shell 
    jmp	2000h:0000h              ; on demarre le shell 
     
    BootDrive	db	0
    filename	db	"KERNEL  XNO"  ; le nom du shell 
    FirstSector	dw	0
    Pointer	dw	0
     
    times 510 - ($-$$)	db	0
     
    buffer:
     
    dw	0xAA55

  20. #20
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    lorsque ton bootloader est chargé par le bios, ce dernier utilise lui-même
    l'INT 13h. et c'est pour ça qu'on récupère le numéro du lecteur contenu dans DL
    pour connaître le lecteur sur lequel le système est en train de booter.
    donc ton reset de disque "avant" le mettre le numéro du lecteur en cours dans BootDrive
    forcément ça force la valeur à 0 (définie dans les données plus bas)

    Donc il faut avant tout sauver DL dans BootDrive
    Mais bon... pourquoi vouloir réinitialiser un lecteur alors que le système l'a déjà fait
    en chargeant ce boot ... (oui, tu peux virer ce reset )

    ligne 55 et 59 : tu devrais choisir la version que tu préfères lire puisque ces deux lignes sont identiques
    de plus la 59 ne sert à rien puisque ax n'a pas été modifié entre temps.

    je déplacerais la ligne 75 juste après la 67 comme ça, en cas de multiples essais de lecture, tous les
    paramètres contenus dans les registres seront ok
    au passage, il manque l'initialisation de dl avec la valeur de BootDrive

    ligne 74 : il fait quoi là ce pusha ?? à virer !

    ligne 78 : là par contre, le reset du disque est conseillé car le secteur n'a pas pu être lu
    il faudrait aussi prévoir un compteur pour ne pas boucler indéfiniment s'il y a erreur

    ligne 82 : la commande hlt met le processeur en pause jusqu'à la prochaine interruption.
    Comme il y a en permanence un paquet d'interruptions par secondes, ça ne sert à rien ici.

    lignes 86, 87, 88, 89, 90 : ne servent à rien, la fonction 00h de l'INT 16h attend une frappe si le buffer est vide
    de plus, le port 60h ne doit être consulté qu'à la suite d'une interruption clavier, et l'INT16h s'en charge déjà.

    ligne 110 : remplacer ce hlt par la même chose que es lignes 84 et 85 pour attendre une touche du clavier,
    ou si c'est juste pour tourner en rond, faire une boucle infinie avec jmp

    Je vois au passage que tu n'utilises par la fonction convert_sector tu devrais la virer car ton programme
    ne doit pas dépasser 512 octets en tout, et cette place pourrait t'être utile plus tard

    Je te conseille d'aller jeter un oeil sur ce site : http://www.gladir.com/CODER/ASM8086/index.htm
    il y a pratiquement toutes les infos utiles pour débuter

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/11/2007, 08h26
  2. Affichage ecran de controle LINUX
    Par toberman008 dans le forum Réseau
    Réponses: 8
    Dernier message: 04/06/2007, 20h04
  3. affichage ecran printf, fprintf_fflush
    Par nicodn02 dans le forum C
    Réponses: 7
    Dernier message: 27/04/2007, 10h30
  4. Aide pour affichage des résultats
    Par vanou dans le forum ASP
    Réponses: 7
    Dernier message: 08/06/2006, 20h53
  5. [MySQL] Aide pour affichage de donné recup dans une BD
    Par mitchb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/05/2006, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo