Вопрос

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

Я старался:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top