2009-12-13 7 views

Répondre

7

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.

+0

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

+0

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

+0

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