NASM - L'extension de l'étiquette avec le drapeau de bits
Question
Je dois régler le bit d'une adresse d'étiquette / offset.
J'ai essayé:
test.nasm:
BITS 32
dw mylabel | 0x8000
mylabel:
dd 0
Mais en essayant de monter ce que je reçois:
nasm -f bin test.nasm
test.nasm:3: error: `|' operator may only be applied to scalar values
Pourquoi ne pas voir mylabel comme valeur scalaire? Je pensais que les étiquettes sont simplement remplacées par leur adresse (valeur scalaire) par l'assembleur.
J'utilise nasm v 9.2.04 si cette question.
Merci d'avance pour toute aide.
EDIT: Je suis en mesure d'utiliser + au lieu de | . Il semble que les opérateurs binaires ne fonctionnent pas sur les étiquettes. Que pensez-vous, est-ce à dessein ou un bug?
La solution
Une étiquette est une valeur relogeable - sa valeur est modifiée par l'agent de liaison / chargeur. La différence entre les deux marqueurs (dans la même section) est une valeur scalaire, et Nasm travaillera avec elle.
dd (mylabel - $$) | 0x80000000
I fixé à tort que l'étiquette en code 32 bits est de 16 bits pour ya, aussi.
Qu'est-ce que cela est destiné à accomplir?
Best, Frank
Autres conseils
Je pense que c'est une limitation de l'assembleur, car nasm est un assembleur deux passes, il a de la difficulté avec est « code dont la taille dépend de la valeur d'un symbole déclaré après le code en question. »
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html
Section 3.7