2017-07-06 3 views
0

Comment effectuer un saut absolu (dword 64 bits) sur AArch64 avec aussi peu d'instructions que possible, tout en utilisant une source de données relative au compteur de programme?Saut absolu avec une source de données relative PC (AArch64)

À première vue, on peut supposer un LDR suivi d'un BR est possible, i.e.:

LDR x9, [PC, #0x8]; 
BR x9 
.dword 0xBADC0FFEE0DDF00D 

Mais depuis PC n'est plus un registre à usage général sur AArch64, ce n'est pas.

Alors, comment cela peut-il être fait avec le moins d'instructions possible?

+0

si vous lisez la documentation qu'il vous dit qu'il est une charge de PC par rapport, la pc n'est simplement pas codé dans l'instruction, il est impliqué dans ce jeu d'instructions. –

+0

Je vois, c'est pourquoi j'étais confus. Merci pour la clarification! –

+0

"Load Register (littéral) calcule une adresse à partir de la valeur PC et un décalage immédiat, charge un mot de la mémoire et l'écrit dans un registre." –

Répondre

3

Vous pouvez compter sur le compilateur généré pools littérales comme d'habitude:

LDR x9, =0xBADC0FFEE0DDF00D 
BR x9 

Ceci est lisible et sera essentiellement générer le même code.

Si vous voulez avoir un contrôle précis, vous pouvez utiliser la version LDR literal, le manuel dit:

registre de chargement (littérale) calcule une adresse de la valeur de PC et un décalage immédiat, charge un mot de mémoire, et l'écrit dans un registre.

En tant que tel que vous pouvez faire:

LDR x9, foo 
BR x9 
foo: .dword 0xBADC0FFEE0DDF00D 

ou moins lisible, mais sans étiquette:

LDR x9, .+8 
BR x9 
.dword 0xBADC0FFEE0DDF00D