当我尝试立即调用或跳转 VC++ 2010 内联汇编器时
_asm
{
call 00405B90h;
jmp 00405B90h;
jmp far 00405B90h;
}
它会产生一个错误
C2415: improper operand type
这可能吗?如何做到这一点?
到目前为止我有一个解决方法:
_asm
{
push 00405B90h; // This is a jump work around
call 00405B90h;
}
根据您要调用的内容,将 var 设置为地址并执行以下操作:
DWORD var = 0xDEADBEEF;
__asm jmp [var]
或者,我做什么:
__asm
{
mov eax,ModuleBase
add eax,RVA
call eax ;obviously call can be jmp
}
您可以轻松地对其进行宏定义(添加寄存器参数可能是个好主意):
#define JMP_IMM(x) __asm mov eax,x \
__asm jmp eax
不幸的是,MASM 不支持对绝对地址的相对调用,并且其他汇编器(如 NASM)也无法对 COFF 目标文件执行此操作。因此,工具链的限制迫使您通过间接调用或 jmp 来使用这种效率较低的机器代码。
如何在 MASM 中为近直接相对调用/jmp 编写绝对目标 https://stackoverflow.com/questions/50058523/how-to-write-an-absolute-target-for-a-near-direct-relative-call-jmp-in-masm
直接调用user32.dll中的函数时出错 https://stackoverflow.com/questions/53461451/error-when-calling-function-in-user32-dll-directly
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)