2010-12-05 5 views
1

Ich muss das höchste Bit einer Etikettenadresse/Offset setzen.NASM - Etikett mit Bit-Flag erweitern

Ich habe versucht:

test.nasm:

BITS 32 

dw mylabel | 0x8000 

mylabel: 
dd 0 

Aber wenn man versucht, dies zu montieren ich:

nasm -f bin test.nasm 
test.nasm:3: error: `|' operator may only be applied to scalar values 

Warum es mylabel als Skalar nicht sehen Wert? Ich dachte, Labels werden einfach durch ihre Adresse (Skalarwert) vom Assembler ersetzt.

Ich benutze Nasm v 2.09.04, wenn das zählt.

Vielen Dank im Voraus für jede Hilfe.

EDIT: Ich habe in der Lage gewesen + statt verwenden |. Es sieht so aus, als ob die bitweisen Operatoren nicht auf Labels arbeiten. Was denkst du, ist das absichtlich oder ein Fehler?

Antwort

1

Ein Label ist ein verschiebbarer Wert - sein Wert wird durch den Linker/Lader modifiziert. Der Unterschied zwischen zwei Labels (im selben Abschnitt) ist ein Skalarwert und Nasm wird damit arbeiten.

dd (mylabel - $$) | 0x80000000

Ich reparierte das Missverständnis, dass ein Etikett im 32-Bit-Code auch 16 Bit für ya ist.

Was soll das erreichen?

Best, Frank

+0

Das dw soll den Offset (als 16-Bit-Wert) des Mylabel-Labels vom Anfang der Datei speichern, aber es muss mit einem Flag erweitert werden. Ich schreibe den .reloc Teil einer Win EXE (PE) Datei/Bild manuell. – masterxilo