2017-09-04 7 views
-2

À quoi sert le code machine déplaçable généré par Assembler? Et si générée alors quelle est l'utilité d'obtenir ce code machine relocalisable pour le convertir en code absolu?À quoi sert le code machine déplaçable généré par Assembler? et pourquoi se convertir en absolu après?

J'ai regardé cette vidéo. https://www.youtube.com/watch?v=Qkwj65l_96I&t=309s

Dans ce qu'il dit sur le code machine absolue et relative

+1

Ainsi, plusieurs fichiers d'objet de code machine relogeables peuvent être combinés en une seule image exécutable, et éventuellement de manière à ce que l'image exécutable puisse être déplacée et chargée d'une adresse différente. –

+0

@KarshSoni comprenez-vous ce que signifie le code relocatable? pour la plupart des adresses relatives vs des adresses fixes. Vous pouvez faire en sorte que la plupart, sinon la totalité, de votre programme utilisent un adressage relatif dont le compilateur, l'assembleur et l'éditeur de liens peuvent faire le travail pour vous. Le point étant que vous pouvez déplacer le binaire ailleurs. Ainsi, par exemple, au lieu de lire à l'adresse absolue 0x1234 à partir d'une instruction à l'adresse 0x1000, vous lisez à la place l'emplacement 0x234 octets en avant de l'adresse actuelle (adressage relatif au PC). –

+0

https://stackoverflow.com/questions/45945018/does-arm-none-eabi-ld-rewrite-the-bl-instruction/45951427#45951427 est un exemple utilisant l'adressage relatif et dans ce cas une table d'adresses fixe est insérée qui doit être modifié dans le cadre de la relocalisation. Des exemples simples peuvent être écrits qui ne nécessitent aucun correctif d'exécution ... –

Répondre

2

donc le code relocatable utilise des adresses relatives?

N ° Au moins pas nécessairement. Ou voulez-vous dire "code indépendant de la position" au lieu de "code relocatable"?

À quoi sert le code machine déplaçable généré par Assembler?

En théorie, vous pouvez assembler un programme entier en même temps. (En effet, je l'ai déjà fait quand je l'ai écrit un assembleur pour une CPU historique.)

Cependant cela a un inconvénient principal:

Pensez à la ligne de code suivante:

mov [myVariable], eax 

Disons que le La variable myVariable se trouve à l'adresse 0x1234560. Ensuite, dans le code de la machine, vous aurez les instructions suivantes:

mov [0x1234560], eax 

Maintenant vous modifiez un fichier dans votre projet qui consiste ~ 200 fichiers (ce qui est typique pour les projets dans l'industrie automobile). Disons que vous avez ajouté quelques instructions à un fichier au début du projet.

Cela signifie que les adresses de tous les éléments (fichiers) qui suivent ce fichier dans le projet changeront. Disons que l'adresse de myVariable n'est plus 0x1234560 mais 0x1234870.

Cela signifie que notre ligne de code doit maintenant se traduire dans l'instruction suivante:

mov [0x1234870], eax 

À cause de cela tous les fichiers de votre projet doivent être assemblés à nouveau!

Si vous avez du code relogeable l'instruction suivante est générée:

mov [0], eax 

... et quelques informations que l'adresse 0 doit être remplacée par l'adresse de myVariable.

Cela signifie que seules les adresses doivent être remplacées lorsque l'un des 200 fichiers change.