La section bss ne peut contenir aucun objet. Certains assembleurs peuvent encore vous permettre de passer à la section .bss, mais tout ce que vous pouvez faire est de dire quelque chose comme: x: . = . + 4
.
Dans la plupart des assembleurs de nos jours et spécifiquement dans gnu pour intel, il n'y a plus de directive .bss
, donc vous passez temporairement à bss et créez le symbole bss en une seule fois avec quelque chose comme: .comm sym,size,alignment
. C'est pourquoi vous obtenez vraisemblablement une erreur. "bss directive non reconnue" ou quelque chose comme ça.
Et vous pouvez obtenir l'adresse soit:
lea woof, %eax
ou
movl $woof, %eax
Mise à jour: aha, syntaxe intel, pas l'architecture intel. OK:
.intel_syntax noprefix
lea esi,fun
lea esi,[fun]
mov eax,OFFSET FLAT:fun
.att_syntax
lea fun, %eax
mov $fun, %eax
.data
fun: .long 0x123
Toutes les formes lea
devraient générer le même code.
merci, très éclairant. Cependant, ce n'est pas vraiment la section bss ou data qui me préoccupe ici. J'ai juste besoin de savoir comment charger l'adresse d'une étiquette dans une adresse en utilisant la syntaxe gnu INTEL, pas AT & T. J'ai essayé mov eax, woof et mov eax, dword ptr [woof], mais les deux me donnent le même résultat. Je veux faire quelque chose comme movl $ woof,% eax, mais en utilisant la syntaxe gnu intel. – jian2587
merci DigitalRoss! J'utilisais aussi lea, mais je me demande si je peux le faire en utilisant un mov. Je suppose que OFFSET FLAT est la clé ici? – jian2587
A droite, il existe plusieurs modes d'adressage; MOV peut charger immédiatement, ce qui peut aussi être une adresse, ou charger le contenu d'une adresse. Normalement sur Unix c'est 'movl $ woof,% eax' vs' movl woof,% eax', mais dans la syntaxe Intel c'est un peu plus ringard. Quoi qu'il en soit, "oui", lea et mov peuvent charger une adresse. – DigitalRoss