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

Assembleur Discussion :

Afficher une chaîne de caractères au boot


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut Afficher une chaîne de caractères au boot
    Bonjour à tous.
    Je suis tout nouveau dans le monde de la programmation en asm, et je commence déjà à rencontrer quelque probleme :
    j'ai codé un petit programme qui affiche un message et attend ensuite l'appuie sur une touche du clavier pour effectuer une action.

    Mon but est qu'il soit autonome, donc j'utilise exclusivement des interruptions du BIOS.

    Une fois compilé (j'utilise TASM) et linké, il s'execute trés bien sous windows.

    Je l'ai copié sur le premier secteur d'une disquette pour qu'il se lance au boot, mais une fois lancé, il affiche des caracteres bizarre au lieu de mes phrases.

    Je pense qu'il s'agit d'un probleme de segment ou d'offset mais je seche.

    Quelqu'un peut m'aider ?

    Mon code (je compile en .COM) :
    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
     
    code segment use16
     
    assume cs:code
     
     
    org 100h
     
     
    debut:
     
    mov ax, cs   ;initialisation
    mov ds, ax
    mov es, ax
     
    ecrit macro text, long   ;macro pour récupérer la position du curseur et écrire à la suite
    mov ah, 03h
    mov bh, 0
    int 10h
    mov ah, 13h
    mov al, 1
    mov bx, 14
    mov cx, long
    lea bp, text
    int 10h
    endm
     
    ecrit message, 49
     
     
    boucle:
     
    mov ah, 00h   ;boucle pour tester la touche du clavier enfoncée
    int 16h
    cmp al, ' '
    jz fin   ;si on appuie sur ESPACE, le programme va à la fin, sinon il affiche "Fonction inconnu"
    ecrit erreur, 19
    jmp boucle
     
     
    fin:
    ecrit fini, 36
    mov ah, 00h
    int 16h
    int 19h
     
     
     
    message db "Bonjour",10,10,13,"Que faire ?",10,13,"- SPACE pour redemarrer",10,10,13
    erreur db "Fonction inconnue",10,13
    fini db "Merci d'avoir utilise ce programme",10,13
     
     
    code ends
     
     
    end debut
    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    L'erreur vient du " org 100h " placé au début du programme.

    Un secteur de boot n'est pas un programme .COM, puisqu'un programme .COM est un programme MS-DOS.

    Le BIOS charge le secteur de boot à l'adresse 0000:7C00h puis passe la main à la première instruction.

    Il faut donc mettre " org 7C00h " à la place de " org 100h " au début du code.

    Pour plus d'explications, voir :
    http://inferno.cs.univ-paris8.fr/~am...utorial02.html

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Merci de ton aide.

    Comment dois-je compiler mon programme, en .exe ou en .com ?

    Si je mets org 7c00h, j'ai une erreur au linkage en .com sinon en .exe, mon programme est beaucoup trop gros.

    Un programme .com peut trés bien s'executer au boot sans ms-dos (enfin je n'ai pas eu de probleme), c'est seulement la fonction 13h de l'interruption 10h qui me pose probleme, si je l'enleve et que j'utilise la 0eh (afficher caractere par caractere) ça fonctionne, mais c'est beaucoup plus fastidieux que d'afficher la chaine directement.

    edit : en fait, j'ai un probleme à chaque fois que j'utilise une chaine de caratctere, quelque soit la fonction

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    J'ai fini par trouver:
    J'ai mis

    org 00h

    et à la place de mov ax, cs pour l'initialisation, j'ai mis

    mov ax, 07c0h (c'est ce qu'il y a sur le lien que tu m'as donné)

    et j'ai ensuite changé de linkeur : j'ai pris LINK car TLINK refusé de linker.


    Merci de ton aide

  5. #5
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Par défaut Et le MagicWord ? alors ?
    Il y a un truc que je ne comprend pas dans son Boot Sector ...
    Quelqu'un peut me dire pourquoi il réussi a booter sont BootSector alors qu'il na visiblement pas mis les 0x55AA de la fin ?

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    C'est vrai que je n'ai aucun probleme pour bouter alors que je n'ai pas 0x55aa

    Je me suis inspiré de ça : http://minso.free.fr/cavinfo/systeme/sos.html
    ils disent que ce n'est pas obligatoire.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Par défaut
    pourrais-je te demmander par quel moyen tu a copier ton programme sur ta disquette?
    peut-etre n'a tu pas ecraser le nombre magique de l'ancien bootsecteur? a tu essayer de regarder?

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Je me suis basé sur la source donnée dans le lien précedent, sauf qu'à la place de mettre mon code dans Début_copied, j'ai codé une fonction qui ouvre mon programme et le charge dans un buffer.

    Voila le code :
    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
     
    ; SOS Boot Program 0.1
    ; Version originale par Eric Minso & Sébastien Goude
    ; http://cavinfo.fr.st/
    ; Modifié par Ganply
     
    Code Segment
    Assume Cs:Code, ds:code, ss:code
     
    org 100h
     
     
    ;  ---  Initialisations  ---
    Debut:
    	Mov Ax, Cs
    	Mov Ds, Ax
    	Mov Es, Ax
     
    ;  ---  Récupération du nom du fichier passé en parametre dans la ligne de
    ;  commande  ---
     
    	mov al, cs:[80h]  ; récup le nombre de caract du nom
    	mov cl, al
    	dec cx
    	mov bx, 0
     
    Nom:
    	mov ah, byte ptr cs:[81h + bx + 1] ; récup le nom du fichier
    	mov byte ptr cs:[chaine + bx], ah
    	inc bx
    	loop nom	
     
    Ouverture:
    	lea dx, chaine   ; ouvre le fichier
    	mov al, 0
    	mov ah, 3dh
    	int 21h
    	jnc ecriture
    	mov ah, 09h
    	mov dx, offset erreur2
    	int 21h
    	mov ah,00h
    	int 16h
    	jmp fin
     
    Ecriture:
    	mov bx, ax   ; charge le fichier dans le buffer
    	mov cx, 512
    	mov dx, offset buffer
    	xor ax,ax
    	mov ah, 3fh
    	int 21h
    	mov ah, 3eh
    	int 21h
     
     
    ;  ---  Affichage du message  ---
    	Mov Ah, 09h
    	Mov Dx, Offset Message
    	Int 21h
     
    ;  ---  Attente d'une touche pour continuer  ---
    	Mov Ax, 0C08h
    	Int 21h
     
    ;  ---  Copie du buffer sur disquette  ---
    Copie_Disquette:
    	Mov Ah, 00h
    	Mov Dl, 0
    	Int 13h
     
    	Mov Ax, 0301h
    	Mov Dx, 0
    	Mov Cx, 2
    	Lea Bx, Buffer
    	Int 13h
    	JNC Okay
     
    ;  ---  S'il y a eu une erreur  ---
    	Inc Nb_Err
     
    ;  ---  S'il y a eu moins de 5 erreurs, on continue, sinon on sort  ---
    	Cmp Nb_Err, 5
    	JL Copie_Disquette
     
    ;  ---  Message d'erreur  ---
    	Mov Ah, 09h
    	Mov Dx, Offset Erreur
    	Int 21h
    	JMP Fin
     
    ;  ---  Message Ok  ---
    Okay:
    	Mov Ah, 09h
    	Mov Dx, Offset Ok
    	Int 21h
     
    ;  ---  Quitter le programme et retourner à MS-DOS  ---
    Fin:
    	Mov Ax, 4C00h
    	Int 21h
     
     
     
    Buffer	DB 512 Dup(0)
    Ok	DB "Copie Ok.",10,13,"La disquette boot est OK, vous pouvez red‚marrer votre PC.",10,13,36
    Erreur	DB "Erreur de copie sur disquette",10,13,36
    erreur2 DB "Erreur de lecture",10,13,36
    Message	DB "Introduisez une disquette vierge dans le lecteur A:",10,13,36
    Nb_Err	DB 0
    chaine  DB 127 dup(00h)
     
     
    Code EndS
    End Debut
    Désolé s'il n'est pas clair.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  2. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  3. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49
  4. Afficher une buffer de pixel avec Direct3D
    Par Black_Daimond dans le forum DirectX
    Réponses: 4
    Dernier message: 27/12/2002, 22h18
  5. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20

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