指向 c++ 中内联 __asm 块的指针
所以我一直在VS2010中使用__asm块,但我一直无法找到更好的方法来让指针指向汇编块的开头。
我知道如何做到这一点的唯一方法是声明一个 void 函数。这样做的一个问题是,void 函数在我的汇编块之前和之后将有自己的汇编,我必须通过获取函数的真实地址并添加偏移量来进行补偿。
示例:
c++
void myfunc(){
__asm{
nop
nop
nop
ret
}
}
将产生与此类似的程序集:
push ebp
mov ebp,esp
add esp,8
nop
nop
nop
retn
mov esp,ebp
pop ebp
retn
如果执行 myfunc() 很可能会出错。
So I've been screwing around with the __asm block in VS2010 and I haven't been able to find a better way to get the pointer to the start of the assembly block.
The only way I know how to do this, is to declare a void function. One problem with this is that the void function will have its own assembly before and after my assembly block and I would have to compensate by getting the real address of the function and adding an offset.
Example:
c++
void myfunc(){
__asm{
nop
nop
nop
ret
}
}
Would result in assembly similar to this:
push ebp
mov ebp,esp
add esp,8
nop
nop
nop
retn
mov esp,ebp
pop ebp
retn
myfunc() would most likely error if executed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您基本上希望在函数上启用 __declspec(naked) ,以避免编译器生成的序言和结尾。
另请参阅:http://msdn.microsoft.com /en-us/library/h5w10wxs(v=vs.80).aspx
You basically want to enable __declspec(naked) on your function, to avoid the compiler-generated prologue and epilog.
See also: http://msdn.microsoft.com/en-us/library/h5w10wxs(v=vs.80).aspx