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

x86 16-bits Assembleur Discussion :

[8086] Un tableau de fonctions


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut [8086] Un tableau de fonctions
    hello !
    j'ai cherché et je ne crois pas que le probleme a ete deja posé dsl si ce n'est pas le cas

    je voudrai créer un tableau de fonctions où pour chaque i on executera la Ième fonction. j'ai pensé d'abord a les mettre successivement et a ajouter des instrus genre MOV AX,AX pour que les fonctions aient la meme taille mais je perd trop d'espace au fianal. donc j'ai penser a mettre les adresse debut de chaque fonction dans un tableau.

    Pour cela j'ai pas trouvé mieu que de nommer chaque fonction par une étiquette et de remplir le tableau en utilisant l'instru LEA .

    Question : y'a t'il un meilleur moyen de remplir le tableau ? peut etre meme a la compilation???? vu mes connaissance limite en asm je plante la

    Merci d'avoir lu le post.


    Résolu : il faut déclarer le tableau comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau   DW   etiq_fct1,etiq_fct2,....

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    ou est ce que quelqu'un connaitrait où était placer le deplacement equivalent a chaque etiquette?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Si tu veux créer un tableau de fonctions,
    tu stocke dansle tableau les adresses des fonctions.
    Si tu écrit un programme 16 bits, chaque adresses est composée d'une adesse de segment sur 2 octets et d'une adresse offset de 2octets, soit 4 octets par adresse.
    Si tu écrit un programme 32 bits, chaque adresse occupe 4 octets.

    La i-ème adresse du tableau est alors ègale à :
    début_du_tableau + i*4

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    dsl de n'avoir pas precisé, si c'etait necessaire, mais je programme sur 16bits.

    oui bon je sais qu'il faut un tableau de "deplacement" de 16 bits (pas besoin de stocker l'@ du segment c'est la meme (contenu dans CS)).
    Mais je voulais savoir si on pouvais créer ce tableau a la compilation c.à.d sans avoir a ecrire un bloc d'instructions du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    LEA   AX,etiq1
    MOV   [SI],AX
    ADD   SI,2
    LEA   AX,Etiq2
    etc ............

    Voilu donc j'ai pensé a crée un tableau d'octet qui contiendra le deplacement par rapport a la premiere etiquette (donc il faut que je compte la longuere de chaque bloc d'instructions) mais j'aurai prefere une methode plus elegante si c'est possible, evidemment.

    Merci d'avoir repondu.

    Si qq chose n'est pas claire qu que je me suis mal exprimer sur un point n'hesiter pas a me poser des questions.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Il s'agit de faire un tableau de données contenant les déplacements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tableau:
    dw etiq1
    dw etiq2
    dw etiq3
    Les données se déclarent avec DW.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau dw etiq1,etiq2,.....
    Ne va t'on pas creer un tableau qui contiendra juste le premier mot (2 octets) pointé par chaque etiquette au lieu du deplacement equivalent a chaque etiquette? j'ai bien peur que oui.

    mais je crois tu viens de me donne une bonne idée la. pourquoi ne pas créer un tableau qui contiendra des instruction de branchement a chaque fonction et cela pendant la compilation en utilisant la déclaration precedente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau DD etiq1,etiq2,.....
    où les etiquette pointe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Etiq1:    JMP   Etiq_fct1
    Etiq2:    JMP   Etiq_fct2
    (on peut remplacer les JMP par des CALL a voir)

    reste a comparer en terme d'encombrement avec la solution de mon premier post. en fin tout ca reste du bricolage

    Si qq'un a mieu..................................

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pour commencer, un rappel sur les instructions servant à déclarer des données :
    DB déclare une donnée de 1 octet (Byte)
    DW déclare une donnée sur 2 octets (Worf)
    DD déclare une donnée sur 4 octets (Double Word)

    Comme ton programme fonctionne en 16 bits, chaque adresse a une taille de 2 octets.

    Tu crée donc le tableau ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau DW Etiq_fct1,Etiq_fct2,.....
    Pour appeler la i-ème fonction, on peut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov si,word ptr tableau[i*2]
    call si
    Je pense que l'on peut également faire :
    Par exemple, pour appeler le 4ème fonction du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov si,word ptr tableau[6]
    call si
    Lorsque tu utilise un CALL label ou un JMP label,
    label est une adresse où le code est redirigé.
    Dans le tableau, tu a stocké ces adresses.
    Faire ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Etiq1:    JMP   Etiq_fct1
    Etiq2:    JMP   Etiq_fct2
    ... est donc inutile.
    On stocke dans le tableau Etiq_fct1,Etiq_fct2,....
    Pour exécuter la fonction,
    on lit son adresse dans le tableau
    puis on appelle cette adresse.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    tout d'abord merci de ton aide!!!
    je crois qu'on est pas d'accord sur un point, pour simplifier prenons un exemple avec une et une seule etiquette :

    Quand tu fais
    et que quelque part tu a

    auras-tu dans la mot memoire d'@ tableau le deplacement relatif au segment de code et qui pointera vers l'instruction : "Mov Ax,Bx" (Etiq_fct1)? si oui c'est parfait c'est exactement ce que je cherche on est d'accord.
    mais moi je crois plutôt qu'on aura un mot qui contiendra l'equivalent machine (en binaire quoi) de l'instruction Mov Ax,Bx (C.o.p sur un octet et M.O.D d'@ un octet).

    Expl2 :
    Si tu fais

    dans a tu n'auras pas le deplacement de b dans le segment mais bien 4

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    J'ai le sentiment que tu n'as pas très bien assimilé le concept d'étiquette (ce n'est pas reproche), c'est seulement un mot utilisé pour indiquer une adresse.

    Quand tu écris tu définis des constantes
    donc quand le compilateur rencontre ta séquence, il obtient (après les 2 passes, qu'il fait même si tu ne le sais pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = 4
    a = b ; donc a = 4
    Par contre, utiliser une étiquette , comme ici:
    et que quelque part tu a
    Dans ce cas, la valeur contenue dans le tableau sera bien l'adresse indiquée par l'étiquette.

    Pour résumer, une étiquette est une adresse, et donc le remplissage d'un tableau pour les sauts/appels ne pose pas de problème comme tu sembles le supposer (et un petit test t'aurait donné la réponse depuis longtemps)

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par disturbedID
    auras-tu dans la mot memoire d'@ tableau le deplacement relatif au segment de code et qui pointera vers l'instruction : "Mov Ax,Bx" (Etiq_fct1)? si oui c'est parfait c'est exactement ce que je cherche on est d'accord.
    mais moi je crois plutôt qu'on aura un mot qui contiendra l'equivalent machine (en binaire quoi) de l'instruction Mov Ax,Bx (C.o.p sur un octet et M.O.D d'@ un octet).
    Un label est une adresse.
    Quand tu écrit :
    label1 est l'adresse de l'instruction mov ax,bx.

    Lorsque tu écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableau DW Etiq1,Etiq2,...
    Etiq1: jmp Etiq1_fct1
    Etiq2: jmp Etiq2_fct2
    le tableau ne contient pas le code binaire correspondant aux instructions JMP mais contient l'adresse de ces instructions.

    Pour avoir un tableau contenant le code binaire correspondant aux instructions JMP, il aurait fallu faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau:
    jmp Etiq1_fct1
    jmp Etiq2_fct2
    ....

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    Ok merci les gars je tiens ma reponse là.

    Citation Envoyé par thewho
    (et un petit test t'aurait donné la réponse depuis longtemps)
    http://www.developpez.net/forums/sho...d.php?t=133073 . jettez y un oeil si vous avez le temps.



    je suppose que ca marchera toujours si mes etiquette sont en fait des noms de "PROC" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tableau  DW  Nom_proc1,Nom_Proc2
    Nom_Proc1    PROC
    ;Corps de la PROC
    Nom_Proc1    ENDP
    dernieres petites questions :

    1)quand tu fais un "Call Nom_Procedure" je crois bien que le IP est empiler mais si tu utilise dans la PROC un "PUSH qqchose" est-ce-que le programme s'y retrouvra?

    2)
    Citation Envoyé par thewho
    donc quand le compilateur rencontre ta séquence, il obtient (après les 2 passes, qu'il fait même si tu ne le sais pas)
    je crois que les compilateurs font au maximum 2 passes. si tu ecrit un pgm qui necessite plus de 2 passe il ce passe quoi?
    EXPLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a  EQU  b
    b  EQU c
    c  EQU 1

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Lors d'un call, IP est empilé.
    Lors d'un ret, IP est dépilé.

    La valeur de SP doit donc être la même au début et à la fin du procédure.
    Pour cette raison, le corps d'une procédure ressemble souvent à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    push bp
    mov bp,sp
    ; ...
    ; corps de la procédure
    ; ...
    mov sp,bp
    pop bp
    ret
    SP est sauvegardé dans bp au début de la procédure.
    A la fin de la procédure, SP est restauré avec la valeur de BP.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Points : 66
    Points
    66
    Par défaut
    Ok merci pour tout reste plus qu'a trouvé un moyen pour compler mais satanés programmes.

    Thx

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

Discussions similaires

  1. Taille d'un tableau en fonction de la taille de la fenetre
    Par Cow-b dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/08/2006, 17h58
  2. tableau de fonction membre
    Par Sergejack dans le forum C++
    Réponses: 5
    Dernier message: 11/08/2006, 02h39
  3. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  4. [mise à jour tableau en fonction du button radio]
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 30/12/2005, 11h41
  5. tableau et fonction en c++
    Par flobx dans le forum C++
    Réponses: 5
    Dernier message: 13/11/2005, 15h12

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