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

Turbo Pascal Discussion :

[TP]code asm dans une procedure


Sujet :

Turbo Pascal

  1. #1
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut [TP]code asm dans une procedure
    J'ai un problème en asm pour récupérer les addresses de variables locales à l'intérieur d'une procedure. En effet, je souhaite récupérer l'addresse d'une variable qui est passée en paramètre dans une procedure mais avec du code assembleur. Pour exemple, j'ai fait une procedure length(s) qui doit récupérer la longueur de la chaîne s :

    uses crt;
    var leng:byte;

    procedure length(s:string);assembler;
    asm
    MOV SI,OFFSET s;
    LODSB;
    MOV leng,AL;
    end;


    begin
    clrscr;
    length('salut');
    writeln(leng);
    readln;
    end.

    La longueur est donc stockée dans leng, seulement leng ne me retourne pas du tout la longueur de la chaîne ni même un des caractères de la chaîne. Après vérification, il se trouve que l'addresse que j'obtiens avec ce code n'est pas du tout la même que celle qui aurait du être c'est-à-dire l'addresse de s. Pourquoi est-ce que je n'obtiens pas la même addresse, et comment sont stockée en mémoire les variables locales dans les procedures ?
    Merci

  2. #2
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Ta chaîne de caractère peut dans ton cas être modifiée. Elle est donc copiée dans la pile pour ta procédure? Puis on te passe une adresse.

    Elle n'est donc plus sur DS, mais sur SS. Lodsb va donc te retourner n'importe quoi. Quant à offset, je n'en parle même pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function Length(const S: string): Byte;
    asm
      les di, S
      mov al, es: [di]
    end;
    A+

  3. #3
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Tiens, au passage, il y a une autre manière de récupérer la longueur d'une chaîne sous TP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function Length(const S: string): Byte;
    begin
    Length := Byte(S[0]);
    end;
    Il n'est par ailleurs pas nécessaire de passer par une fonction. Tu peux aussi utiliser une fonction inline, qui sera plus rapide.

    A+

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut page graphique
    En fait, la taille d'une string en memoire est nécessaire pour ecrire cette string a l'écran : j'ai fait une routine asm qui permet donc d'écrire à l'écran une string en mode texte 03h. ( si vous voulez le code source, un petit mail... )
    a+

Discussions similaires

  1. Code asm dans une macro C
    Par progfou dans le forum C
    Réponses: 11
    Dernier message: 01/03/2006, 18h50
  2. Réponses: 6
    Dernier message: 05/08/2004, 13h15
  3. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08
  4. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57
  5. Réponses: 4
    Dernier message: 28/12/2003, 15h50

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