从一个函数调用另一个函数
Call naked function from one to another?
当我试图将declspec(裸)函数调用到另一个函数时,我得到了一个错误根据函数原型,它必须返回一个值,但是当我试图返回一个值时,我得到了另一个错误,说裸函数不能返回值。
__declspec(naked) void bar() {
__asm {
nop
ret
}
}
__declspec(naked) NTSTATUS WINAPI foo(int a, int b) {
bar();
return NTSTATUS(1);
}
所有这些都是合理的,因为裸函数不会为函数创建堆栈帧,因此除非程序员显式创建堆栈帧,否则调用另一个函数是错误的。然而,当我试图创建一个堆栈帧并以正确的方式进行堆栈对齐时,我会遇到一个错误。
如何正确地从一个裸函数调用另一个?
裸函数不支持返回语句
以下规则和限制适用于裸函数:
- 不允许使用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
}
裸函数意味着编译器不会为您编写序言(设置esp和ebp)和尾声(重置esp和eb p)。由于编译器并没有编写结束语,所以您不能要求它使用"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
相关文章:
- 在模板化的 Rcpp 函数中调用另一个 cpp 函数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 通过引用常量函数调用另一个类的非常量函数
- 通过智能指针调用另一个类的成员函数
- 类设计以调用另一个类的成员函数
- 在 android ndk 中的同一.cpp文件上调用另一个 C++ 函数
- 函数调用另一个函数会给出错误的输出 C++
- C++构造函数调用另一个构造函数
- 我可以静态地阻止一个函数调用另一个函数吗
- 一个函数调用另一个函数时使用的内存会发生什么情况
- 复制构造函数调用另一个类的复制构造函数
- 从一个函数调用另一个函数
- 从C++中类模板中的函数调用另一个成员函数
- 在C/ c++中,当两个函数具有相同的名称,一个函数调用另一个函数时,它将工作
- 非静态成员函数的使用无效 - 类成员函数调用另一个类成员函数
- 在QT中从一个构造函数调用另一个构造函数
- boost python C++函数调用另一个函数时出错
- 一个库中的函数调用另一个库中的重写delete[]