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 32-bits / 64-bits Assembleur Discussion :

Windows x64 - arg et pile


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut Windows x64 - arg et pile
    Salut,

    J'ai une incompréhension sur la convention d'appel Windows lorsqu'il y a plus de quatre arguments.
    Par exemple pour la fonction "sendto", voici comment il faut procéder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	mov	qword [rsp+40],16
    	mov	qword [rsp+32],sockaddr
    	xor	r9,r9
    	mov	r8,6
    	mov	rdx,sendbuf
    	mov	rcx,[sock]
    	call	[sendto]
    Ce que je ne comprend pas, c'est pourquoi commencer à empiler à "+32".
    Par exemple, pour un code x32, c'est logique puisque tous les arguments sont pushé sur la pile les uns après les autres, donc 0,+4,+8,+12 etc
    Mais dans le cas du x64, les quatre premiers arg sont des registres, et donc, non pushés (non ?)
    La proc suivante peut récupérer les 4 premiers arg directement dans les registres puisqu'ils y sont..
    A moins que je n'ai rien compris, mais en tout cas, personnellement, sous Linux mes proc appelées récupèrent les arguments directement dans les registres correspondants.

    Mais là, on doit faire comme si les quatre premiers arguments étaient pushé et commencer à +32.

    Sous Linux, j'étais tombé sur une fonction avec plus de 6 arguments, et logiquement, pour le septième argument, j'avais simplement fait un "push arg". Et ça fonctionnait parfaitement..

    Je fais des déductions qui sont peut être fausses car j'ai de grosses lacunes sur la pile, ce à quoi je tente de remédier progressivement (J'atttends de tomber sur une bonne doc entièrement dédié à la pile et bien technique).

    Mais hier, pour ce "sendto", j'ai passé beaucoup de temps, sans comprendre pourquoi ça ne fonctionnait pas, puisque WSAGetLastError me sortait une erreur de type 10047..
    J'ai pensé que comme pour WSAStarttup, la structure était différente en x64.. Du coup j'ai cherché et encore cherché, sans jamais comprendre.
    C'est en me rappelant qu'il y avait un fichier "proc64.inc" pour windows et donc une macro "invoke" que j'ai compris en regardant le code (Il n'y a pas de "proc64.inc" pour Linux, donc j'ai appris à faire sans les macros).

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ce que je ne comprend pas, c'est pourquoi commencer à empiler à "+32".
    C'est une convention Windows 64bit. Même si les 4 premiers paramètres ne sont pas passés par le stack il faut les allouer un espace (4 quad mots) dans la pile. Donc les autres paramètres seront empilés depuis l'adresse [rsp+32]!

    http://msdn.microsoft.com/en-us/libr...86(VS.80).aspx
    http://msdn.microsoft.com/en-us/libr...kh(VS.80).aspx

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    J'étais tombé sur cette doc, mais je n'avais pas bien compris apparemment.
    Donc c'est propre à Windows, ça me rassure, je pensais n'avoir rien compris du tout au fonctionnement d'un call.

    J'ai retrouvé la fonction Linux avec plus de 6 arg sur laquelle j'étais tombé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	push	0
    	xor	r9,r9
    	xor	r8,r8
    	mov	rcx,64
    	mov	rdx,host
    	mov	rsi,16
    	mov	rdi,sockaddr
    	xor	eax,eax
    	call	[getnameinfo]
    En changeant le flag du 7ème arg, ça changeait effectivement le résultat du retour, donc j'en avais conclus que la convention était bien basé sur ce principe, et j'étais partie sur ce même principe pour du Win64.

    Merci à toi.

Discussions similaires

  1. "QOCI not loaded" sous Windows x64
    Par mercure07 dans le forum Bases de données
    Réponses: 0
    Dernier message: 22/03/2012, 08h23
  2. mod_perl2 pour Apache2 et Windows x64
    Par holblin dans le forum Apache
    Réponses: 1
    Dernier message: 01/03/2011, 12h05
  3. Program Files et Windows x64
    Par Danyel dans le forum VB.NET
    Réponses: 5
    Dernier message: 20/11/2009, 15h55
  4. Perl pour Windows x64
    Par Billette dans le forum Modules
    Réponses: 0
    Dernier message: 21/11/2007, 09h24
  5. Version Windows x64 x86 ?
    Par warwink dans le forum Windows XP
    Réponses: 9
    Dernier message: 09/06/2006, 01h53

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