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 )

  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 )

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