IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > F.A.Q. Assembleur x86 > Matériel
        Comment arrêter et redémarrer le PC ?
        Comment s'écrit un boot-loader de base ?
        Comment écrire sur le port parallèle ?

rechercher
precedent    sommaire    suivant    telechargermiroir


Comment arrêter et redémarrer le PC ?
auteur : Romain Tartière (Smortex)
Il existe plusieurs méthodes. La plus simple est d'utiliser l'interruption 19h, mais cela présente de nombreux inconvénients, du fait que la mémoire n'est pas effacée et que les vecteurs d'interruption ne sont pas réinitialisés pour la zone [00h..1Ch]. On a donc des chances de causer un plantage au lieu de redémarrer le système. On préférera donc a cette première méthode la suivante : écrire 1234h en 0040:0072 suivi d'un saut long en FFFF:0000, ce qui a pour effet de causer un redémarrage a chaud. Enfin, si on est en mode protégé, on peut redémarrer en causant une "triple fault", ce qui se fait très facilement en altérant le registre IDTR et en exécutant une interruption logicielle.


Comment s'écrit un boot-loader de base ?
auteurs : Romain Tartière (Smortex), VBurel, le mage tophinus
Un boot-loader est un programme de 512 octet qui se trouve sur le premier secteur d'un disque et est exécuté par le BIOS dans le but de charger le système d'exploitation. Il est copié à l'adresse 07C0:0000 avant d'être exécuté. Si le programme doit faire plus de 512 octets, le boot-loader aura le rôle de charger les secteurs suivants en mémoire.

Un secteur de boot minimaliste est tel que celui-ci (Écrit avec FASM) :

        Org     0;
       
        Jmp     07C0h:Start
       
;---------------------;
; Programme principal ;
;---------------------;
Start:
        Mov     Ax,Cs
        Mov     Ds,Ax
Mov     Es,Ax

; Programme de boot proprement dit...
Hang:
   Jmp Hang
       
End.:

   ;--- 00 jusqu'à 510 ---
   times 510 - End. db 0
   dw 0AA55h
On peut également procéder de cette façon :

        Org     0;
       
        Jmp     Start
       
;---------------------;
; Programme principal ;
;---------------------;
Start:
        Cli
        Mov     Ax,07C0h
        Mov     Ds,Ax
        Mov     Es,Ax
        ; Initialisation de la pile ici
        Sti

; Programme de boot proprement dit...
Hang:
   Jmp Hang
       
End.:

   ;--- 00 jusqu'à 510 ---
   times 510
   dw 0AA55h
L'utilisation de Cli et Sti dans le second exemple est recommandée lors de l'initialisation de SS et SP.

Pour mettre le mot magique en fin de secteur, vous pouvez utiliser ce code pour TASM (et MASM) :

fin_prog:
    times 510 - fin_prog db 0
dw 0AA55h 
... et pour NASM :

    times 510-($-$$) db 0
    dw 0AA55h

Comment écrire sur le port parallèle ?
auteur : Romain Tartière (Smortex)
L'instruction :

out 378h, ax
ne fonctionne pas... et c'est normal ! Si vous regardez la documentation de votre micro, vous noterez que le numéro du port doit impérativement appartenir à [0..255]. La solution est guère plus loin dans la documentation : il faut passer par le registre DX. On peut alors écrire dans un plus grand nombre de ports : [0..1023].

mov dx, 378h
out dx, ax

rechercher
precedent    sommaire    suivant    telechargermiroir

Consultez les autres F.A.Q's


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.