从一个到另一个调用裸功能?

时间:2014-10-25 11:15:47

标签: c++ c assembly

当我尝试将declspec(裸)函数调用到另一个函数时,我收到错误 根据函数原型,它必须返回一个值但是 当我尝试返回一个值时,我得到另一个错误,说裸函数无法返回值。

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

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

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

如何正确地从裸体功能呼叫到另一个功能?

2 个答案:

答案 0 :(得分:3)

裸体功能don't support return statements

  

以下规则和限制适用于裸体功能:

     
      
  • 不允许使用return语句。
  •   

你应该自己处理堆栈框架返回值,例如

__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
}

答案 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