2017-01-21 2 views
3

Je me demandais s'il est possible d'encoder une instruction comme:L'opérande de mémoire directe de 64 bits est-il possible sur x86-64?

add rax, [adresse]

où < adresse> est une adresse de 64 bits complet pointant vers un 64 bits valeur. NASM semble simplement tronquer l'adresse et l'encoder comme une adresse 32 bits. La seule forme de 64 bits d'adressage (avec une adresse directe) qui semble fonctionner est:

mov rax, [adresse QWORD]

qui est codée par NASM utilisant REX.W = 1 et des opcodes spéciaux de MOV avec adressage direct. L'utilisation de REX.W avec l'instruction add lui fait simplement interpréter l'adresse cible comme contenant une valeur de 64 bits, mais ne permet pas la spécification d'une adresse de 64 bits. Mais je suis curieux de savoir s'il y a un autre moyen.

(En passant, à cause de ce problème, je suis pour l'instant en train d'utiliser l'adressage relatif RIP). Est-ce que quelqu'un peut confirmer que la forme directe d'adressage de 64 bits est impossible?

+0

La référence de jeu d'instructions peut confirmer que, pas un étranger de l'Internet;) – Jester

+0

Jester, j'ai regardé la référence de jeu d'instructions. Mais il est quelque peu difficile d'exclure qu'il puisse y avoir un moyen surtout parce que je n'ai pas l'habitude de le lire. La référence du jeu d'instructions répertorie une option "[REX.W + 03/r] ADD r64, r/m64" mais basée sur l'expérimentation et vos réponses (et les tableaux concernant l'octet MOD R/M) je conclus que cela fait référence à un 64 valeur -bit stockée à une adresse de mémoire spécifiée de 32 bits (sans possibilité d'étendre l'adresse à 64 bits en dehors de l'utilisation d'instructions supplémentaires). – Morty

+0

@Morty L'ensemble ordinaire de modes d'adressage n'inclut pas un mode avec une disposition 64 bits ou absolue. Seules certaines instructions spéciales fournissent un tel mode d'adressage. – fuz

Répondre

3

L'architecture amd64 n'a pas de mode d'adressage avec une disposition 64 bits, sauf dans certains cas particuliers. Au lieu de cela, utilisez rip adressage relatif qui devrait être bien si votre binaire est inférieure à 2 Go de taille.

+0

Comme OP a dit correctement il ya ** un ** mov rax, moffs64' donc pas besoin de votre solution de contournement. Vous devriez utiliser un registre différent pour illustrer votre point;) – Jester

+0

@Jester Oh oui en effet. – fuz

+0

OK, c'est bien d'avoir confirmé qu'il n'est pas possible de faire un _addition_ (et pas seulement un déplacement) en utilisant une adresse 64 bits directe. – Morty