NASM - Erweiterung Etikett mit Bitmarkierung
Frage
Ich brauche das höchste Bit einiger Label-Adresse einstellen / Offset.
Ich habe versucht:
test.nasm:
BITS 32
dw mylabel | 0x8000
mylabel:
dd 0
Aber wenn man versucht, diese zu montieren erhalte ich:
nasm -f bin test.nasm
test.nasm:3: error: `|' operator may only be applied to scalar values
Warum nicht sehen mylabel als skalare Wert? Ich dachte, Etiketten nur mit ihrer Adresse (Skalar-Wert) vom Assembler ersetzt.
Ich verwende nasm v 2.09.04 wenn diese Fragen.
Vielen Dank im Voraus für jede Hilfe.
EDIT: Ich habe in der Lage zu verwenden + statt | . Es sieht aus, als ob die Bit-Operatoren nicht auf Etiketten arbeiten. Was denken Sie, ist dies absichtlich oder ein Bug?
Lösung
Ein Label ist ein verschiebbarer Wert - sein Wert wird durch den Linker / Lader modifiziert. Der Unterschied zwischen zwei Etiketten (im gleichen Abschnitt) ist ein Skalarwert und NASM wird mit ihm arbeiten.
dd (mylabel - $$) | 0x80000000
Ich reparierte die falsche Vorstellung, dass ein Etikett in 32-Bit-Code 16 Bit für ya ist, auch.
Was ist es, dass dies beabsichtigt ist, zu erreichen?
Best, Frank
Andere Tipps
Meine Vermutung ist, es ist eine Einschränkung des Monteurs, weil nasm ist ein zwei Pass-Assembler es Schwierigkeiten hat, mit ist „Code, deren Größe abhängig vom Wert eines Symbols erklärt, nachdem der Code in Frage.“
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html
Abschnitt 3.7