从一个函数调用另一个函数中的裸函数?

3

当我尝试将declspec(naked)函数调用到另一个函数时,出现错误。根据函数原型,它必须返回一个值,但当我尝试返回一个值时,会出现另一个错误提示naked函数无法返回值。

__declspec(naked) void bar()    {
    __asm   {
        nop
        ret
    }
}

__declspec(naked) NTSTATUS WINAPI foo(int a, int b) {
    bar();
    return NTSTATUS(1);
}

所有这些都是合理的,因为裸函数不为函数创建堆栈帧,因此除非程序员显式地创建堆栈帧,否则调用另一个函数会出错。但是,当我尝试以正确的方式创建堆栈帧并进行堆栈对齐时,我会遇到错误。

如何从裸函数正确地调用另一个函数?

2个回答

3

裸函数 不支持返回语句

以下规则和限制适用于裸函数:

  • 不允许使用返回语句。

您需要自己处理堆栈帧 返回值,例如:

__declspec( naked ) void bar()    {
    __asm   {
        nop
        ret
    }
}
__declspec(naked) bool foo(int a, int b) {
    bar();
    __asm   {
        mov al,1
        ret
    }
}

int main() {
    bool return_value = foo(2, 2);
    std::cout << return_value; // 1
}

0
裸函数意味着编译器不会为您编写序言(设置 ESP 和 EBP)和收尾语(重置 ESP 和 EBP)。由于编译器不编写结束语,因此您无法使用“return”关键字要求其返回某些值。//序言
// simple prologue
      push ebp
      mov ebp, esp

// simple epilogue
      mov eax, ret_var  //by default eax holds return value
      mov esp, ebp
      pop ebp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接