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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top