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 :

Boot mais n'affiche rien


Sujet :

Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut Boot mais n'affiche rien
    Voila mon code ca boot mais ca n'affiche rien!

    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
     
     
    [BITS 16] ;indique que l'ontravaille en 16 bits	
    [ORG 0x0]
     
     
    jmp _debut
     
    	msgBoot db 'Bienvenue dans BOOTOS !',13,10,0
     
    	 _debut:
    		mov ax,0x07C0
    		mov ds,ax
    		mov es,ax
    		mov ax,0x8000	
    		mov ss,ax
    		mov sp, 0xf000
    		mov ax, 0B800h	
    		mov es,ax	
    		mov bx, 0
    		mov byte al,[msgBoot]
     
     
    	afficher_msg:
    		cmp al,0x00                   
    		je fin                       
    		mov [es:bx], al     
    		add bx, 2                     
    		mov byte al,[msgBoot+2]       
    		jb afficher_msg               
     
    	fin:
    		times 510-($-$$) db 0
    		dw 0xAA55
    		END
    Merci

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Le code un peu corrigé c'est bon ca affiche mais les deux derniers caractères sont une note et un cercle!?!
    De plus comment faire pour effacer l'écran avant d'afficher? ou a la rigueur écrire à l'endroit ou le curseur est placé!
    Thks

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    salut,

    pour ton premier probleme, c'est tout a fait normal d'avoir des caracteres "bizarres" a l'ecran car en fait tu vas mettre dans la memoire video les caracteres 13 et 10 qui ne sont pas interprétes comme un CR/LF par celle ci.

    Mon conseil est d'utiliser les interruptions du BIOS, comme tu es dans le boot il n'y a pas de soucis, celles ci interpretront bien le CR/LF.

    pour l'effacement de l'ecran, utilise aussi les interruptions du BIOS cela sera plus facile.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Justement pour l'affichage je ne voulais pas utiliser les interruptions bios!
    Je voulais faire un truc perso ben ca marche a par ces deux caracteres lol
    Comment faire le retour chariot alors?
    De plus je voudrais mettre mon code d'affichage dans un fichier .inc mais comment faire pr le passage d eparamètres?

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Et bien si tu ne veux pas du BIOS alors c'est a ton programme de savoir ou il est sur l'ecran

    Pour ma part j'ai fait la meme chose que toi, j'ai donc degagé le CR/LF de mes chaines et j'ai créé une methode qui passe a la ligne suivante

    En ce qui concerne le passage de parametre rien ne vaut l'utilisation de la stack

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Je suis pas très doué en asm tu pourrais pas me filer un petit coup de main?
    Donc ma chaine je met koi pour avoir mon caractère de fin?
    Comment sa marche les paramètres avec la stack?
    Et pour le retour a la ligne?
    Merci bcp

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    ok une chose a la fois
    pour ta chaine finie la toujours avec 0 car ton test cmp al,0x00 verifie que tu a fini.

    Maintenant tu dois avoir deux variables qui contiennent les valeurs x et y du curseur.

    tu peux les mettre a 0,0 par defaut
    tu incrementes x a chaque fois que tu affiche un caractere
    si x>=80 (largeur de l'ecran en caractere) alors tu remets x a 0 et tu incrementes y de 1
    si y>=25 (hauteur de ton ecran en caracteres) alors tu a deux choix:
    - le plus simple tu remets x et y a 0
    - tu scroll ton ecran d'une ligne vers le haut en remettant x a 0

    mets deja en place le systeme de gestion de la position du curseur et apres on s'attaquera au passage de parametre par la pile

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Merci j'ai compris le principe mais je ne comprends pas comment dire d'écrire a tel ou tel position

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    pas de souci en fait tu vas ecris a l'adresse [es:bx]
    - es doit toujours etre a la valeur b800h
    - bx donne la position ou ecrire, mais attention

    en fait en memoire tu retrouve pour chaque caractere un octet qui continet le code ASCII et un octet qui contient l'attribut du caractere (couleur).

    c'est pour cela que tu incrementes bx de 2 (add bx,2)

    donc bx doit toujours etre un multiple de 2 pour la position:
    - x,y
    - 0,0 bx=0
    - 1,0 bx=2
    - 0,1 bx=160

    mon conseil, tuilise un autre registre que bx le mieux est di (destination index)
    car certaines instructions agisse sur sa valeur.

    petit example

    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
     
     
    ; initialise le pointeur video.
    	mov	ax,0b800h
    	mov	es,ax
     
    ; methode qui donne la valeur de di en fonction de x et y
    	call	CursorPositionOffset
     
    ; methode qui incremente la valeur de x, les valeurs x et y
    ; sont modifiees si necessaires, comme quand x > 80
    	call	IncCursorPosition
     
    ; affiche le caractere 'a' avec l'attribut par défaut.
    	mov	al,'a'
    	mov	ah,07h
     
    ; stocke le code ASCII et l'attribut du caractere
    ; ax => es:di
    ; di est incrementé de deux
    	stosw

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    En principe si j'ai bien compris si bx=162 je suis a la seconde ligne?
    Mon cod en'est pas celui donné ci dessou le voila corrigé

    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
     
     
     
    [BITS 16] ;indique que l'on travaille en 16 bits	
    [ORG 0x0]
     
     
    jmp _debut
     
    ;---------------------------------------------------------
    ;Initialisation des varriables :
    ;-msgboot une chaine de caractere
    ;---------------------------------------------------------
    	msgBoot db 'Bienvenue dans BOOTOS !',0
     
    	 _debut:
    								;Initialisation des segments en 0x07C0 pour le boot
    		mov ax,0x07C0
    		mov ds,ax
    		mov es,ax
    		mov ax,0x8000	
    		mov ss,ax
    		mov sp,0xf000
    		mov ax,0xb800	                 ;On initialise ax pour le mode video
    		mov es,ax	                	     ;es prend la valeur de ax
    		mov bx,0                           ;Initialisation de bx 
    		mov byte al,[msgBoot]		     ;al contient le premier caractere de msgboot
    		mov cx,0			           ;Initialisation du compteur cx
     
    ;--------------------------------------------------------
    ;Procedure afficher message
    ;Affiche un message caractere par caractere en utilisant
    ;l'ecriture directe dans la memoire video
    ;--------------------------------------------------------
    	afficher_msg:
    		cmp al,0x0                          ;On compare le contenu de al avec le caractere de fin nul
    		je fin                            ;Si egale on saute a  fin
    		mov [es:bx],al                    ;On met le caracteere a  l'adresse de la memoire video
    		add bx,1                          ;On increment bx de 1
    		mov byte [es:bx],0x3              ;On definit l'attribut pour le caractere (ici 00000011b soit cyan sur fond noir)
    		add bx,1				    ;On incremente bx de 1	
    		add cx,1				    ;On incremente cx de 1
    		mov dx,bx				    ;On range temporairement bx dans dx
    		mov bx,cx				    ;bx prend la valeur du compteur cx
    		mov byte al,[msgBoot+bx]	    ;On passe au caractere suivant
    		mov bx,dx			 	    ;bx reprend sa valeur
    		jmp afficher_msg                  ;On affiche les caracteres suivant
     
    	fin:
    		times 510-($-$$) db 0		    ;On boucle pour avoir un fichier de 512 octets
    		dw 0xAA55

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    cela me parait juste, peut etre un peu lourd, necessitera surement une optimisation

    Quel en est le resultat?

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Ca boot
    Ca affiche le message sur fond noir couleur cyan
    mes j'aimerais que l'écran soit vider de tous les caractères auparavant car j'ai les druc du bios qui sont affichés

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    le moyen le plus simple et d'utilise le BIOS

    ou cette petite methode

    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
     
     
    clearscreen:
       push ax
       push cx
       push di
       push es
       mov ax,0b800h
       mov es,ax
       mov ax,0720h ; attribut par defaut et ' '
       xor di,di ; origine de l'ecran
       mov cx,80*25 ; nombre de caractere total
       rep stosw
       pop es
       pop di
       pop cx
       pop ax
       ret

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Ca te derange si je m'en sert pour mon projet?
    Merci

    2eme question importante:
    Je voudrais utiliser ma fonction d'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    afficher_msg:
    		cmp al,0x0                          ;On compare le contenu de al avec le caractere de fin nul
    		je fin                            ;Si egale on saute a  fin
    		mov [es:bx],al                    ;On met le caracteere a  l'adresse de la memoire video
    		add bx,1                          ;On increment bx de 1
    		mov byte [es:bx],0x3              ;On definit l'attribut pour le caractere (ici 00000011b soit cyan sur fond noir)
    		add bx,1				    ;On incremente bx de 1	
    		add cx,1				    ;On incremente cx de 1
    		mov dx,bx				    ;On range temporairement bx dans dx
    		mov bx,cx				    ;bx prend la valeur du compteur cx
    		mov byte al,[msgBoot+bx]	    ;On passe au caractere suivant
    		mov bx,dx			 	    ;bx reprend sa valeur
    		jmp afficher_msg                  ;On affiche les caracteres suivant
    dans un fichier à inclure genre aff.inc

    ensuite l'appeller de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    call afficher_msg
    Or dans ma fonction affiche j'ai un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov byte al,[msgBoot+bx]
    Ou msgboot é le nom de ma variable mais comment faire alors pour que n'importe quel varaible de type chaine de caractère puisse s'afficher?

    Merci

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    et bien en passant par la stack

    programme principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       push msgBoot
       call afficher_msg
       add sp,2
    tu mets sur la stack l'adresse de ta chaine, ne surtout pas oublie apres le call a la retirer de la stack. (add sp,2)

    sous programme:

    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
     
     
    afficher_msg:
    ; initialise la stack
       push bp
       mov bp,sp
     
    ; sauvegarde les registres necessaires
       ....
     
    ; recupere l'adresse de la chaine
       mov ax,[bp+4]
     
    ; reste du code
       ....
     
    ; restaure les registres depuis la stack
       ....
     
    ; quitte proprement
       leave
       ret

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Ptit question ca ne serait pas :
    et non
    le rep stosw c'est quioi exactement???
    Merci[/code]

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    non car tu recuperes une adresse et celle ci est sur 16-bit donc c'est bien mov ax,[bp+4]

    le rep c'est une boucle qui se repete tant que cx n'est pas a 0

    cela fait
    while(cx!=0)
    {
    stosw
    }

    et stosw:
    met ax a l'adresse donnée par es:di, et incremente di de 2 (car 2 octets a la fois)

  18. #18
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Merci pour toutes ces infos
    Pour ma fonction je vais travailler ca demain
    Si j'ai d'autres questions je poste


    Par contre tu sais faire marcher bosch?

  19. #19
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Uniquement sous Windows

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Ok j'ai fait un fichier de config ca s elance
    Par contre sous Tux tu sais faire une image avec dd a partir d'un bianaire?

Discussions similaires

  1. [XL-2010] Listbox n'affichant rien mais récupérant les valeurs
    Par bboy-eazy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/09/2014, 09h53
  2. [PC fixe] Ordinateur démarre mais n'affiche plus rien
    Par 12monkeys dans le forum Ordinateurs
    Réponses: 27
    Dernier message: 03/06/2012, 17h07
  3. ça affiche NULL mais je veux que ça affiche rien.
    Par psychoBob dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/05/2006, 22h35
  4. Opengl n'affiche rien.
    Par Fugus02 dans le forum OpenGL
    Réponses: 4
    Dernier message: 06/01/2004, 15h41

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