ASM 64

Résolu
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019 - 31 janv. 2013 à 15:14
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 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)

9 réponses

cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
3 févr. 2013 à 15:24
OK ça marche maintenant,
Merci BruNews.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 févr. 2013 à 12:29
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...
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
1 févr. 2013 à 13:26
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 !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 févr. 2013 à 17:41
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
1 févr. 2013 à 21:17
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.
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
2 févr. 2013 à 23:14
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.
0
cs_parki Messages postés 75 Date d'inscription mardi 29 juillet 2008 Statut Membre Dernière intervention 25 mars 2019
3 févr. 2013 à 10:30
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) ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 févr. 2013 à 11:03
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 févr. 2013 à 19:16
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...
0
Rejoignez-nous