2016-08-19 6 views
0

Comment obtenir l'adresse d'un label?Flat Assembler: Comment obtenir l'adresse d'un label?

je veux obtenir l'adresse d'une étiquette en assembleur plat sans ajout de code supplémentaire

exemple:

label1: ;is at adress 0 
db 1h,2h,3h,4h,5h ;some data 

label2: ;is at adress 5 because label1 has 5 bytes of data 

i pourrait imprimer l'adresse à l'écran de la console mais cela ajoute encore la taille au programm et change le résultat. Je suis conscient de l'utilisation de l'étiquette, mais je veux le numéro d'adresse brute.

+0

Utilisez un débogueur ou quelque chose comme 'objdump' pour obtenir l'adresse de la table des symboles. Les adresses d'étiquettes ne sont stockées nulle part en dehors de la table de symboles si vous ne les utilisez pas (par exemple, en tant que cible de saut, adresse de chargement/stockage, opérande immédiat ou données (par exemple, '.dd label2') –

+0

Ok. Il est encore temps de modifier mon premier commentaire et de supprimer ceux qui sont maintenant obsolètes Notez qu'il serait plus exact de dire qu'il y a 5 octets de données entre 'label1' et' label2', les labels n'ont pas de taille associée (sauf si vous utilisez MASM ou TASM, où db/dw/dd après une étiquette implique magiquement la taille de l'opérande pour les instructions qui utilisent cette étiquette dans un opérande de mémoire) –

+0

De toute façon, juste pour clarifier, vous ne voulez pas obtenir l'adresse –

Répondre

1

Solution rapide:

Je viens de mettre tous les symboles à la fin du fichier d'assemblage puis regarda avec un éditeur hexadécimal:

exemple:

label1: ;example label (can be anywhere) 
;... 
;... My Programm 
;... 

;the end of the program 
db 0h ;just some spacer 
dw label1 
+0

yup, cela fonctionne et ne devrait pas perturber la mise en page du code précédent. Si FASM a une directive ALIGN, cela pourrait rendre le bloc d'adresses facile à trouver et aligné au début d'une ligne de sortie hexadécimale. Vous pouvez probablement dire à partir de ma réponse que je ne sais rien à propos de FASM spécifiquement, et surtout utiliser NASM/YASM sur Linux. –

0

Construisez votre programme avec des symboles de débogage, de sorte que la table de symboles (métadonnées) dans le fichier objet inclut les adresses de toutes les étiquettes.

Ensuite, vous pouvez utiliser objdump -t pour vider la table de symboles de l'exécutable, ou tout autre programme qui fait la même chose.


Autre que la table des symboles, adresses étiquettes seront dans le binaire intégré dans des instructions, par exemple dans des modes d'adressage absolus pour des modes d'adressage, des opérandes immédiats ou des données (par exemple, .dd label2). Les sauts normaux utilisent un codage relatif, de sorte que vous ne trouverez pas l'adresse de symbole absolue dans l'encodage d'instruction pour les sauts. TL: DR: il est possible de désassembler le binaire pour trouver les adresses absolues, mais seulement pour les étiquettes utilisées de cette façon, donc la table des symboles est beaucoup plus pratique. Si vous assemblez un binaire à plat (comme un secteur de démarrage), il n'y a pas de table de symboles dans le format de fichier. Vous êtes donc tributaire de l'impression d'informations FASM sur les symboles lorsque vous utilisez une option de ligne de commande pour cela. J'ai googlé et trouvé que there's a -s option pour écrire un .fas fichier de sortie de débogage symbole-info.

+1

Je ne suis pas sûr si FASM supporte les symboles de débogage et que le fichier '.fas' n'est malheureusement pas lisible par l'homme. –