我使用 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 加载程序在运行时更改基址,则 DLL/EXE PE 映像仍将由 Windows 加载程序重新定位,并且标签地址将在运行时通过以下方式进行修补加载器使用重新基地址,因此使用标签地址的编译/链接时间值不是问题。
提前谢谢了。
上次我尝试使一些汇编代码与 Borland 兼容时,我遇到了不能前向引用标签的限制。不确定这是否是您在这里遇到的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)