我正在使用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".
任何人都可以建议如何使这个工作?
更新:要响应Pax的问题(请参阅注释),如果Windows加载程序在运行时更改了基址,则Windows加载程序仍将重定位DLL/EXE PE映像,并且标记地址将在运行时通过以下方式修补:加载器使用基于重新的地址,因此使用标签地址的编译/链接时间值不是问题.
提前谢谢了.