ASM 64 [Résolu]

cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 31 janv. 2013 à 15:14 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 3 févr. 2013 à 19:16
Bonjour,
je commence à m'intéresser à l'asm 64 bits.
j'ai récupéré ml64.exe et d'autre fichier dans un SDK(ce sdk ne contenait pas de lib)
j'ai tout mis dans le repertoire ou j'ai ecrit le fichier asm64.asm;

asm64.asm;

extrn MessageBoxA : proc
extrn ExitProcess : proc

.data
mes db 'hello', 0
titre db 'asm 64', 0

.code

Main proc
sub rsp, 28h
xor r9d, r9d
lea r8, titre
lea rdx, mes
xor rcx, rcx
call MessageBoxA
xor ecx, ecx
call ExitProcess
Main endp

end

ml64 fonctionne correctement et produit asm64.obj (ml64 /c asm64.asm)
mais link.exe me dit "unresolved external symbol MessageBoxA rederenced in fonction Main"
et idem pour ExitProcess "unresolved external symbol MessageBoxA rederenced in fonction Main"

pourtant j'ai mis user32.lib et kernel32.lib (issues du pack MASM32) dans le répertoire
voici la ligne de commande link;
link asm64.o kernel32.lib user32.lib /subsystem:windows /entry:Main

les lib classiques 32bits ne fonctionnent t'elles pas en 64 bits ?
link à t'il besoin de fichiers supplémentaires pour lier du 64 bits ?
qu'est ce qui ne va pas ? (je suis sous windows 7)
Afficher la suite 

9 réponses

Répondre au sujet
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 3 févr. 2013 à 15:24
+3
Utile
OK ça marche maintenant,
Merci BruNews.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_parki
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 1 févr. 2013 à 12:29
0
Utile
CALL toujours sur l'adresse "translatée".

call qword ptr __imp_MessageBoxA

Attention à toujours avoir RSP ligné sur 16 avant un CALL. Fonction appelée aura donc RSP align8 (non 16) à son début (pour cause de RIP pushé) et a doit avoir autant d'octets dispos au dessus de RIP que nbr d'octets totaux en param.
etc, etc...

ciao...
Commenter la réponse de BruNews
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 1 févr. 2013 à 13:26
0
Utile
Bonjour BruNews,merci de m'avoir répondu.

j'ai donc modifié le code comme suit;

extrn __imp_MessageBoxA : proc
extrn __imp_ExitProcess : proc

.data
mes db 'Hello', 0
titre db 'ASM 64', 0

.code
Main proc
sub rsp, 28h
xor r9d, r9d ; uType = 0
lea r8, titre ; lpCaption
lea rdx, mes ; lpText
xor rcx, rcx ; hWnd = NULL
call QWORD PTR __imp_MessageBoxA
xor ecx, ecx ; exit code = 0
call QWORD PTR __imp_ExitProcess
Main endp

end

mais j'ai toujours le même problème de liens..
j'ai mis user32.dll et kernel32.dll dans le repertoire.Leur PE header référence bien la forme translatée de messageBox et ExitProcess.

HELP !
Commenter la réponse de cs_parki
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 1 févr. 2013 à 17:41
0
Utile
OUPS, je viens de voir:
"issues du pack MASM32"

bouhhhh, ejecte toutes ces horreurs de ton disque dur.
Il faut les libs 64 pour compiler du 64 et les 32 pour le 32, le tout issu du platform SDK posé par VC++ et rien d'autre.

ciao...
Commenter la réponse de BruNews
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 1 févr. 2013 à 21:17
0
Utile
ok,j'ai la version express 2010 de visual c++,et je n'ai pas de sdk complet fourni avec.
je vais voir ce que je peux télécharger chez microsoft et je te tiens au courant.
Merci pour tes conseils.
Commenter la réponse de cs_parki
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 2 févr. 2013 à 23:14
0
Utile
Sur mon PC,j'ai le sdk windows 7.0A,dans le repertoire lib j'ai bien les lib user32.lib et kernel32.lib mais le problème de liens persiste
avec ces lib.

j'ai ensuite télécharger le sdk windows 7.1 pour visual studio 2010 et .net framework 4.0.J'ai bien dans VC/lib/amd64 de nouvelles lib mais aucune lib du type user ou kernel que je pourrais utiliser.
Commenter la réponse de cs_parki
cs_parki 77 Messages postés mardi 29 juillet 2008Date d'inscription 20 mars 2014 Dernière intervention - 3 févr. 2013 à 10:30
0
Utile
ce qui n'est pas clair pour moi;

En quoi les lib user32 et kernel32 qu'on utilisent pour lier un code asm 64 bits sont elles différentes des lib 32 bits classiques ?

Car elles contiennent les mêmes déclarations (MessageBox,ExitProcess,...) que les lib 32 bits.

Est ce qu'elles référencent simplement des DLL 64 bits au lieu de 32 bits ?
(comme je ne trouve pas ces lib 64bits sur mon pc,je ne peux pas explorer leur contenu)

En ce qui concerne les includes,peut on utiliser
les includes classiques 32 bits pour ces lib 64 bits (puisqu'on parle des même fonctions exitProcess et MessageBox) ?
Commenter la réponse de cs_parki
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 3 févr. 2013 à 11:03
0
Utile
Non, lib 32 et 64 sont differentes. Regarde le code que tu as mis plus haut, rien de PUSHé sur un appel fonction de 4 params, tout passe en registre, c'est du fastcall alors qu'on appelle en stdcall pour du 32.

Regarde ta boite de messages privés.

ciao...
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 3 févr. 2013 à 19:16
0
Utile
En meme temps, je te conseille fortement de virer VS, son compilo ne gere correctement que les entiers, intrinsics et flottants c'est une vraie daube.
VC++ en version 2012 ne connait que SSE2, absolument pas fait pour du code haute performances, il faut compiler avec Intel compiler 2013.

ciao...
Commenter la réponse de BruNews

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.