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

Raspberry Pi Discussion :

Comment utiliser BEQ en assembleur ?


Sujet :

Raspberry Pi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 217
    Points : 623
    Points
    623
    Par défaut Comment utiliser BEQ en assembleur ?
    Bonjour, BEQ est une instruction d'équivalent , donc j'essaye l'instruction mais cela ne fonctionne pas ?

    voici 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
    .global main      # Provide program starting address to linker
    main:   
            jal   stdio_init_all
            mv    s1, x0
    loop:   
            li t1, 0 # t1 = 
            li t2, 0 # t2 =0 
    
            beq t1, t2, ; # if t1 ==2t1 then target
            la    a0, target # load address of helloworld
    
            addi  s1, s1, 1
            mv    a1, s1        # counter    
    
            jal   printf
            li a0, 1250                  # waiting time
            call sleep_ms 
            j     loop
    target: 
        li a0,helloworld  # a0 helloworld= 
    
    
    .data
    helloworld:      .asciz "Hello RISC-V World %d\n"
    j'essaye de faire une simple instruction d'équivalence donc je charge t1 et t2 à 0 , si t1 = t2 donc à 0 je charge le string a0
    mais la il refuse la compilation.
    il y a un truc que je ne saisie pas , on dit que x0 est branché à 0 donc si je fait la commande:
    ca devrais passer ? mais la cela ne fonctionne pas , peut être qu'il a confusion que t1 n'est pas un registre temporaire ?

    d'ailleur

  2. #2
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2019
    Messages : 53
    Points : 90
    Points
    90
    Par défaut
    Bonsoir.
    Pour l'instruction beq la syntaxe exacte est beq reg,reg,etiquette donc il faut mettre

    ou comme on peut utiliser des chiffres avec b et f ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    beq t1, t2,1f
    ....   instructions
    1:
    .... suite
    li est réservé pour des nombres et donc pour alimenter un registre il faut utiliser mv comme ceci
    Bon courage.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 217
    Points : 623
    Points
    623
    Par défaut
    merci de ta réponse , j'ai donc fait ceci :
    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
    .global main      # Provide program starting address to linker
    main:   
            jal   stdio_init_all
            mv    s1, x0
    
            li a0, 4250                  # waiting time
            call sleep_ms 
            la    a0, debug_beq # load address of helloworld
            li t1,50
            li t2,50
            beq t1, t2,target
    
    loop:   
            la    a0, helloworld # load address of helloworld
            addi  s1, s1, 1
            mv    a1, s1        # counter    
    
            jal   printf
            j     loop
    
    target:            
            jal   printf   
              
    .data
    debug_beq:       .asciz "beq ok ! %d\n"
    helloworld:      .asciz "Hello RISC-V World %d\n"
    j'ai bien le message beq ok, par contre je ne rentre jamais dans la boucle ?
    après le printf faut t'il lui dire quelque chose ?

    sinon si j'écris ceci avec les labels en numéro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1:
            li a0, 4250                  # waiting time
    2:              
            call sleep_ms 
            la    a0, debug_beq # load address of helloworld
            li t1,50
            li t2,50
    13:
            beq t1, t2,target
    j'ai compiler et cela fonctionne c'est si on faisait un redirection d'adresse ? niveau rapidité ça n'impacte pas le programme
    à la place de faire des jumps ?

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 217
    Points : 623
    Points
    623
    Par défaut
    J'ai comparer le fichier binaire entre ces 2 écritures et c'est la même taille en ko donc ça doit pas allourdir son fonctionnement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .global main      # Provide program starting address to linker
    
    main:   jal   stdio_init_all
            mv    s0, x0
    loop:   la    a0, helloworld # load address of helloworld
            addi  s0, s0, 1
            mv    a1, s0        # counter        
            jal   printf
            j     loop
    .data
    helloworld:      .asciz "Hello loop %d\n"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .global main      # Provide program starting address to linker
    
    main:   jal   stdio_init_all
            mv    s0, x0
    1:   la    a0, helloworld # load address of helloworld
            addi  s0, s0, 1
            mv    a1, s0        # counter        
            jal   printf
            j     1b
    .data
    helloworld:      .asciz "Hello 1b %d\n"
    mainteant que j'ai compris pour le branchement, comment on fait par exemple pour écrire T1 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    .global main      # Provide program starting address to linker
    
    main:   jal   stdio_init_all
            mv    s0, x0
            li t1,50
    1:   la    a0, helloworld # load address of helloworld
            addi  s0, s0, 1
            mv    a1, s0        # counter        
            jal   printf
            j     1b
    .data
    helloworld:      .asciz t1

  5. #5
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2019
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2019
    Messages : 53
    Points : 90
    Points
    90
    Par défaut
    Bonjour.
    Vous ne pouvez pas afficher directement le contenu d'un registre. Printf étant une instruction du langage C, regardez dans une documentation C comment imprimer une valeur numérique.
    Sinon, vous pouvez écrire en assembleur une conversion du contenu d'un registre en une chaine de caractères et donc qui peut être imprimée par printf.
    Faites attention aussi aux autres registres qui peuvent être écrasés par l'appel à printf (regardez la nome d'appel des fonctions C et notez les registres qui sont sauvegardés à coup sûr pour les utiliser dans vos programmes).

    Bon assembleur.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 13h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 10h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 10/02/2003, 00h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 10h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 16h21

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