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

Autres architectures Assembleur Discussion :

[ARM] Etat des registres lors de l'exécution d'un code


Sujet :

Autres architectures Assembleur

  1. #1
    Membre régulier Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Points : 78
    Points
    78
    Par défaut [ARM] Etat des registres lors de l'exécution d'un code
    Bonjour

    Lors d'un partiel ( licence) je suis tombé sur ce code assembleur ARM, actuellement j'essaie de le comprendre dans le cas des rattrapages à venir mais je coince sur certains points. Yout d'abord je vais vous mettre l'enoncé pour mieux discerner le sujet et ensuite le code avec ma/mes questions vis-à-vis de celui ci.

    soit la zone mémoire localisée a l'adresse 0x20000000 qui contient les valeurs suivantes:
    0xAA, 0x32, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x04, 0x00, 0x00, 0x20, 0xFF, 0x78
    indiquer le contenu des registres à l'issue de l'execution de chacune des lignes
    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
    Area monprog,CODE,READONLY  
     
    Adr EQU 0x2000000A  
    Vb EQU 10  
     
    ENRTY  
    EXPORT	_main  
     
    _main  
     
    LDR R0,=Adr  
    MOV R1,#Vb  
    SUB R0,R0,R1 
    LDRB R2,[R0]
    LDR R3,[R0,R1]
    LDR R4,[R3,#4] !
    LDR R2,[R3,#-4
    ....
    Voilà. Alors tout d'abord, ai-je raison de penser que LDR R0, =Adr prendra la dixième valeur soit 0x4C car son adresse est 0x2000000A ?

    Ensuite je bloque par rapport à R1 : il prend 10 selon le mov mais lors de l'instruction SUB en dessous R0 = R0 - R1 soit 0x4C - 10 soit 0x42. Or il n'y pas cette valeur donc ai-je tort dans mon raisonnement ?

    En vous remerciant d'avance.

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Le LDR R0,=Adr affecte la constante LDR à R0, et non sa valeur (tu ne déréférences pas encore) du coup R0 vaut 0x2000000A, auquel tu soustrais R1 qui vaut 10 = 0x0A en hexadécimal.

    C'est lorsque tu fais un LDR avec le nom du registre entre crochets, tu vas effectivement aller lire à la mémoire pointée par le registre (bon par contre la syntaxe de l'assembleur ARM est réellement horrible pour un x86eux comme moi )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Membre régulier Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Points : 78
    Points
    78
    Par défaut
    Ok je vois sa joue au niveau adresse.

    Pour le LDR R4, [R3,#4] comment on fait pour decaler 4 octet sur une adresse ?

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    A priori, LDR charge 4 octets d'un seul coup (en little endian), et c'est LDRB qui charge octet par octet.

    Donc R3 contient le DWORD pointé par R0+R1=0x2000000A, et je te laisse regarder voir à quoi ça correspond (attention le processeur travaille en little endian). Et tu veux dire quoi par "décaler 4 octets sur une adresse" ?

    Edit: le ! derrière donne l'ordre au processeur de mettre à jour le registre "pointeur" une fois qu'on a accédé à l'adresse.

    Sinon y'a une une doc pas mal faite ici: http://www.heyrick.co.uk/armwiki/LDR (et largement plus compréhensible que la doc officielle )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

Discussions similaires

  1. Cacher l'arborescence des groupes lors de l'exécution
    Par definder1986 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 25/12/2012, 17h16
  2. erreur lors de l'exécution de mon code
    Par sarrsouraa dans le forum Visual Studio
    Réponses: 0
    Dernier message: 11/10/2011, 15h33
  3. Pb lors de l'exécution des SWING
    Par Snawel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/03/2008, 07h59
  4. Réponses: 2
    Dernier message: 13/09/2006, 00h03
  5. Réponses: 11
    Dernier message: 07/07/2006, 19h24

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