NASM - расширение метки с помощью битового флага - PullRequest
1 голос
/ 05 декабря 2010

Мне нужно установить старший бит некоторого адреса / смещения метки.

Я пытался:

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: Я смог использовать + вместо | . Похоже, что побитовые операторы не работают с метками. Как вы думаете, это специально или ошибка?

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

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

дд (mylabel - $$) | 0x80000000

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

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

Лучшее, Frank

0 голосов
/ 05 декабря 2010

Я предполагаю, что это ограничение ассемблера, потому что nasm - это двухпроходный ассемблер, с которым он сталкивается с трудностями: "код, размер которого зависит от значения символа, объявленного после рассматриваемого кода".http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html

Раздел 3.7

...