Я использую Borland Turbo C ++ с некоторым встроенным ассемблерным кодом, так что, вероятно, ассемблерный код в стиле Turbo Assembler (TASM). Я хочу сделать следующее:
void foo::bar( void )
{
__asm
{
mov eax, SomeLabel
// ...
}
// ...
SomeLabel:
// ...
}
Таким образом, адрес SomeLabel помещается в EAX. Это не работает, и компилятор жалуется на: неопределенный символ 'SomeLabel'.
В Microsoft Assembler (MASM) символ доллара ($) служит текущим счетчиком местоположения, что было бы полезно для моей цели. Но, опять же, это не работает в Borlands Assember (синтаксическая ошибка выражения).
Обновление: чтобы быть более конкретным, мне нужен компилятор для генерации адреса, который он перемещает в eax как константу во время компиляции / компоновки, а не во время выполнения, поэтому он будет компилироваться как "mov eax, 0x00401234".
Кто-нибудь может подсказать, как заставить это работать?
ОБНОВЛЕНИЕ: Чтобы ответить на вопрос Пакса (см. Комментарий), если базовый адрес изменяется во время выполнения загрузчиком Windows, образ DLL / EXE PE по-прежнему будет перемещаться загрузчиком Windows, а адрес меток будет исправлен в время выполнения загрузчиком для использования переопределенного адреса, поэтому использование значения времени компиляции / ссылки для адреса метки не является проблемой.
Большое спасибо заранее.