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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top