NASM - Estendere un'etichetta con bit di flag
Domanda
Ho bisogno di impostare il bit più alto di qualche indirizzo dell'etichetta / offset.
ho provato:
test.nasm:
BITS 32
dw mylabel | 0x8000
mylabel:
dd 0
Ma quando si cerca di montare questo ottengo:
nasm -f bin test.nasm
test.nasm:3: error: `|' operator may only be applied to scalar values
Perché non si vede mylabel come un valore scalare? Ho pensato che le etichette sono solo sostituiti con il loro indirizzo (valore scalare) per l'assembler.
sto usando nasm v 2.09.04 se quello che conta.
Grazie in anticipo per qualsiasi aiuto.
Modifica Sono stato in grado di utilizzare + al posto di | . Sembra come se gli operatori bit per bit non funzionano sulle etichette. Cosa ne pensi, è apposta o un bug?
Soluzione
Un'etichetta è un valore trasferibile - il suo valore viene modificato dal linker / loader. La differenza tra due etichette (nella stessa sezione) è un valore scalare, e Nasm funzionerà con esso.
dd (mylabel - $$) | 0x80000000
I fissato sbagliata che un'etichetta codice a 32 bit è di 16 bit per ya, anche.
Che cosa è che questo ha lo scopo di realizzare?
Best, Frank
Altri suggerimenti
La mia ipotesi è che è una limitazione del assemblatore, perché NASM è un due passaggio assemblatore ha difficoltà con è "codice di cui dipende dimensioni sul valore di un simbolo dichiarato dopo il codice in questione."
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html
Sezione 3.7