NASM - Разширяващ етикет с битов флаг

Трябва да задам най-високия бит на някакъв адрес/отместване на етикет.

Опитах:

test.nasm:

BITS 32

dw mylabel | 0x8000

mylabel:
dd 0

Но когато се опитвам да сглобя това, получавам:

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

Защо не вижда mylabel като скаларна стойност? Мислех, че етикетите просто се заменят с техния адрес (скаларна стойност) от асемблера.

Използвам nasm v 2.09.04, ако това има значение.

Благодаря предварително за всяка помощ.

РЕДАКТИРАНЕ: Успях да използвам + вместо |. Изглежда, че побитовите оператори не работят върху етикети. Как мислите, това нарочно ли е или е грешка?


person masterxilo    schedule 05.12.2010    source източник


Отговори (2)


Етикетът е преместваема стойност - стойността му се променя от свързващия/зареждащия механизъм. Разликата между два етикета (в една и съща секция) е скаларна стойност и Nasm ще работи с нея.

дд (mylabel - $$) | 0x80000000

Поправих погрешното схващане, че етикет в 32-битов код е 16 бита и за вас.

Какво се цели да постигне това?

Най-добре, Франк

person Frank Kotler    schedule 07.12.2010
comment
Dw трябва да съхранява отместването (като 16-битова стойност) на mylabel-label от началото на файла, но трябва да бъде разширено с някакъв флаг. Пиша .reloc секцията на win exe (PE) файл/изображение ръчно. - person masterxilo; 07.12.2010

Предполагам, че това е ограничение на асемблера, тъй като nasm е асемблер с две преминавания, който има затруднения с "код, чийто размер зависи от стойността на символ, деклариран след въпросния код."

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html

Раздел 3.7

person OmnipotentEntity    schedule 05.12.2010
comment
Но също така се проваля, ако дефинирам mylabel преди това. - person masterxilo; 05.12.2010