Salut,

J'ai toujours eu cette erreur sous Fasm - Linux x64 pour certain call et jump.
En faite, dès l'instant que je tente d'atteindre certaines proc qui se trouvent "en dessous" du call ou jmp qui doivent les appeler, Fasm me sort ce message d'erreur et refuse de compiler.
C'est vraiment agaçant, et à la limite, je ne peux pas coder en x64..

Pour pouvoir coder, j'ai deux solutions:
- Ecrire mes codes à l'envers : /
- Faire un "mov rax,addr" "call rax" (fonctionne parfaitement avec n'importe quelle proc)

J'ai même testé en mettant des crochets, genre call [proc], ce qu'il ne faut normalement faire que pour les proc externes. Rien ne fonctionne.
Il doit y avoir une explication tout simple, lié à la norme x64, du moins je l'espère, sinon c'est qu'il s'agit d'un bug étrange de Fasm.

Toutes les procs sont dans le même segment.
Les mettres dans un autre segment n'y change rien.
Je n'ai jamais eu ce problème en x32.

Le truc encore plus étrange, c'est que ça fonctionne pour des procs qui appellent d'autres proc qui sont plusieurs proc en dessous d'elles !
C'est galère car ne compilant pas, aucun moyen de savoir ce qu'il se passe..

Je vais quand même donner un exemple assez parlant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
;-------------------------------------------------------------------------
segment readable executable
;-------------------------------------------------------------------------
 
entry $
 
	jmp	plop
	plop:
flat assembler version 1.71.16 (16384 kilobytes memory)
code.asm [53]:
jmp plop
error: relative jump out of range.


J'ai aussi testé un "jmp qword [rip+plop]". Dès l'instant qu'il y a des crochets ça compile, et au debugger, si je regarde la valeur de rip+plop, ça donne:
rip = adresse courante
plop = +nombre de byte pour aller à plop

Donc logiquement c'est parfait, mais quand je tente le jmp, le debugger me dit ceci:
The debugged application encountered a segmentation fault.
The address 0x0000000000000000 could not be accessed.
Bref je ne sais vraiment pas d'où vient le problème.

Et concernant les call et jmp qui fonctionnent, il sont écrit normalement
exemple:
jmp 0x0000000000400000

J'ai même été jusqu'à récupérer l'adresse sous sa forme hexa, et l'écrire directement comme ci-dessus. Ca ne compile pas..


edit:
C'est bon j'ai trouvé..
C'est le faite que des procs arrivent à appeler d'autres proc qui sont plusieurs proc en dessous d'elles qui m'a mis la puce à l'oreille.
J'avais déjà soupsonné un problème d'étiquette, et finalement c'est bien ça.

En écrivant ceci ça compile et fonctionne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
;-------------------------------------------------------------------------
segment readable executable
;-------------------------------------------------------------------------
 
entry $
 
tagada:
	jmp	plop
	plop:
Fasm en x64 n'a pas l'air d'apprécier le "entry $", alors qu'il a toujours fonctionnné parfaitement en x32.
Du coup j'ai remis la méthode "entry start" avec un "start:" comme point d'entrée.