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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top