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, если это имеет значение.
Заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ:Я смог использовать + вместо |. Отказ Похоже, что побитовые операторы не работают на этикетках. Как вы думаете, это специально или ошибка?
Решение
Этикетка представляет собой перемещаемое значение - его значение модифицируется линкером / погрузчиком. Разница между двумя ярлыками (в том же разделе) - это скалярное значение, и NASM будет работать с ним.
DD (MyLabel - $$) | 0x80000000.
Я исправил неправильное представление о том, что этикетка в 32-битном коде тоже 16 бит для YA.
Что это, что это предназначено для достижения?
Лучший, Фрэнк
Другие советы
Я предполагаю, что это ограничение ассемблера, потому что NASM - это двух пропускной ассемблер, который имеет трудности с «кодом, размер которого зависит от значения символа, объявленного после рассматриваемого кода».
http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoc3.html.
Раздел 3.7