2010-12-05 8 views
1

Мне нужно установить самый старший бит некоторого адреса/смещения метки.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, если это имеет значение.

Заранее благодарим за любую помощь.

EDIT: Я был в состоянии использовать + вместо |. Похоже, что побитовые операторы не работают с метками. Как вы думаете, это специально или ошибка?

ответ

1

метка является перемещаемым значение - его значение изменяется посредством линкера/загрузчика. Разница между двумя метками (в том же разделе) является скалярным значением, и Nasm будет работать с ней.

dd (mylabel - $$) | 0x80000000

Я исправил неверное представление о том, что метка в 32-битном коде также 16 бит для ya.

Что это значит для достижения?

Best, Frank

+0

Предполагается, что dw хранит смещение (как 16-битное значение) метки mylabel с начала файла, но оно должно быть расширено с помощью некоторого флага. Я пишу секцию .reloc файла/изображения win exe (PE) вручную. – masterxilo

0

Мое предположение - это ограничение ассемблера, потому что nasm - это двухпроходный ассемблер, с которым он сталкивается с трудностями, - это «код, размер которого зависит от значения символа, объявленного после кода, о котором идет речь».

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

Раздел 3.7

+0

Но это также терпит неудачу, если я определяю MyLabel раньше. – masterxilo