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 :

[x86_64] Passer un pointeur sur tableau défini dans .data


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut [x86_64] Passer un pointeur sur tableau défini dans .data
    Bonjour,

    J'avais un petit bout de code ASM en 32 bits qui fonctionnait correctement (chargé de détecter la présence de jeux d'instructions), et je voudrais en créer une autre version pour le 64 bit.
    Je débute vraiment en assembleur, c'est pour interfacer avec du C++.
    Le problème c'est que je voudrais appeler une fonction de le libC (strcmp) en passant un pointeur sur une chaîne définie dans .data, c'est légal en 32 bit mais pas en 64.
    Je sais pas quoi faire
    Voici le code:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    [BITS 64]
    segment .data
        GenuineIntel db "GenuineIntel",0
        AuthenticAMD db "AuthenticAMD",0
     
    segment .bss
    segment .text
     
        global ?Init@CpuInfo@zwl@@QEAAXXZ
        extern strcmp
     
    ;void zwl::CpuInfo::Init(void)
    ?Init@CpuInfo@zwl@@QEAAXXZ:
        push rbp
        mov rbp, rsp
        push rbx
        push rsi
     
        %ifdef ZEWEL_SYSTEM_WINDOWS
        mov rsi, rcx;put this into rsi
        %endif
        %ifdef ZEWEL_SYSTEM_LINUX
        mov rsi, rdi
        %endif
     
        mov eax, 0
        cpuid
        mov [rsi], ebx
        mov [rsi+4], edx
        mov [rsi+8], ecx
        mov byte [rsi+12], 0;brandName is now known
     
        mov eax, 1
        cpuid;going to test the support of some instructions sets
     
        ;    supportMMX = true;
        ;    supportSSE = true;
        ;    supportSSE2 = true;
        ;    if(ecx & 00000001h != 0)
        ;    {
        ;        supportSSE3 = true;
        ;    }
        mov byte [rsi+13], 1
        mov byte [rsi+17], 1
        mov byte [rsi+18], 1
        test ecx, 00000001h
        jz NO_SSE3
        mov byte [rsi+19], 1
     
        NO_SSE3:
     
        ;if(strcmp(brandName, "GenuineIntel", 12) == 0)
        ;{
        ;   cpuid 1h_eax
        ;    if(ecx & 00000200h != 0)
        ;    {
        ;        supportSSSE3 = true;
        ;        if(ecx & 00080000h != 0)
        ;        {
        ;            supportSSE4 = true;
        ;        }
        ;    }
        ;}
        %ifdef ZEWEL_SYSTEM_WINDOWS
        mov rcx, rsi
        mov rdx, GenuineIntel
        %endif
        %ifdef ZEWEL_SYSTEM_LINUX
        push rsi
        mov rdi, rsi
        mov rsi, GenuineIntel
        %endif
        call strcmp
        %ifdef ZEWEL_SYSTEM_LINUX
        pop rsi
        %endif
     
        cmp rax, 0
        jne NOT_INTEL_PROC
        mov eax, 1
        cpuid
        test ecx, 00000200h
        jz NO_SSSE3
        mov byte [rsi+20], 1
        test ecx, 00080000h
        jz NO_SSE4
        mov byte [rsi+21], 1
     
        NO_SSE4:
        NO_SSSE3:
        NOT_INTEL_PROC:
     
     
        ;if(strcmp(brandName, "AuthenticAmd) == 0)
        ;{
        ;   cpuid 80000001h_eax
        ;    if(edx & 00800000h != 0)
        ;    {
        ;        supportMMXExt = true;
        ;    }
        ;    if(edx & 80000000h != 0)
        ;    {
        ;        support3DNOW = true;
        ;        if(edx & 40000000h != 0)
        ;        {
        ;            support3DNOWExt = true;
        ;        }
        ;    }
        ;}
        %ifdef ZEWEL_SYSTEM_WINDOWS
        mov rcx, rsi
        mov rdx, AuthenticAMD
        %endif
        %ifdef ZEWEL_SYSTEM_LINUX
        push rsi
        mov rdi, rsi
        mov rsi, AuthenticAMD
        %endif
        call strcmp
        %ifdef ZEWEL_SYSTEM_LINUX
        pop rsi
        %endif
     
        cmp rax, 0
        jne NOT_AMD_PROC
        mov eax, 80000001h
        cpuid
     
        test edx, 00800000h
        jz NO_MMXEXT
        mov byte [rsi+14], 1
        NO_MMXEXT:
        test edx, 80000000h
        jz NO_3DNOW
        mov byte [rsi+15], 1
        test edx, 40000000h
        jz NO_3DNOWEXT
        mov byte [rsi+16], 1
     
        NO_3DNOW:
        NO_3DNOWEXT
        NOT_AMD_PROC:
     
        pop rsi
        pop rbx
        pop rbp
        ret
    Merci pour votre aide.

    ps: tout commentaire est le bienvenue, je suis entrain d'apprendre

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Je viens d'essayer d'appeler strcmp() sur un Linux 64 bits et ça marche sans rien faire de spécial. Tu es sûr que le problème est dans l'appel à strcmp() ?
    :wq

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    J'ai un problème au niveau du passage des arguments, surtout celui des chaînes définies dans .data: VS(2008) me sort une erreur au link parlant (j'ai pas accès à la machine donc je dis ce dont je me souviens) de la largeure d'addresse mémoire, "ADDR32", désactiver l'option /JeSaisPlusQuoi (mais impossible à désactiver parce que mon projet est une DLL).
    Par contre j'ai pas encore testé sous Linux (faudrait que je finnisse les makefiles d'ailleurs)

  4. #4
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    En fait c'est tout bête, tu utilises la convention d'appel des Unixoïdes au lieu de celle de Windows. Il faut passer les paramètres dans RCX, RDX, R8 puis R9. Pour les float et les double c'est dans XMM 0-3. Une fois que quatre paramètres ont été passés le reste doit être envoyé par la pile, même si il reste des registres libres. Apparemment avant d'appeler une fonction il faut aussi réserver au moins 32 octets sur pile (sub rsp, 32 par exemple) et la rééquilibrer soi-même après. Enfin je n'ai pas encore pu essayer en pratique donc c'est seulement ce que j'ai compris.
    Par contre je n'ai ai aucune idée pour le problème de compilation.
    :wq

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    Je crois que c'est exactement ce que je fais pour le passage des arguments, ou alors j'ai rien compris ...
    Je savais pas pour la pile, je vias chercher un peu.
    VS me sort précisemment:
    error LNK2017: 'ADDR32' relocation to '.data' invalid without /LARGEADDRESSAWARE:NO
    pour l'instruction mov rdx, AuthenticAMD et mov rdx, GenuineIntel

  6. #6
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Ah ouais j'avais juste vu l'appel pour Linux. Ici ça a l'air de fonctionner mais ça devient facilement casse-tête, par exemple les registres à préserver ne sont pas les mêmes non plus.
    Tu as essayer de linker avec l'option donnée ? Pour le compilateur l'application est bien en 64 bits ?
    :wq

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Points : 228
    Points
    228
    Par défaut
    ça compile bien le bon truc, c'est sûr.
    Et comme j'ai dis avant, je ne peux pas enlever l'option car je fais une DLL.
    Je pensais faire un truc du genre stocker la chaîne dans la pile, puis passer l'adresse du premier caractère, mais je ne sais pas faire (rsp, rbp, c'est du charabia pour moi )...

Discussions similaires

  1. pointeur sur tableau dans une structure
    Par rollbich dans le forum Débuter
    Réponses: 3
    Dernier message: 02/06/2013, 22h23
  2. Réponses: 5
    Dernier message: 21/09/2008, 09h45
  3. Réponses: 8
    Dernier message: 17/09/2008, 12h11
  4. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  5. Bug Firefox sur tableau centré dans un div (mauvais refresh)
    Par FrankOVD dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/07/2005, 17h47

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