指向 c++ 中内联 __asm 块的指针

发布于 2024-10-29 17:30:17 字数 440 浏览 1 评论 0原文

所以我一直在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事和酒 2024-11-05 17:30:23

您基本上希望在函数上启用 __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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文