【发布时间】:2012-08-01 03:57:29
【问题描述】:
我正在尝试在单独分配的堆栈上运行一个函数。
我想保留堆栈以供以后使用,以便我可以恢复它并恢复功能。
以下代码编译并运行,但屏幕上没有任何内容。
#include <cstdlib>
#include <csetjmp>
#include <iostream>
using namespace std;
unsigned char stack[65535];
unsigned char *base_ptr = stack + 65535 - 1;
unsigned char *old_stack;
unsigned char *old_base;
void function()
{
cout << "hello world" << endl;
}
int main()
{
__asm
{
mov old_base, ebp
mov old_stack, esp
mov ebp, base_ptr
mov esp, base_ptr
call function
mov ebp, old_base
mov esp, old_stack
}
}
使用vs2012/win8/intel Q9650
【问题讨论】:
-
也许
setjmp/longjmp可能对您的问题有用? -
setjmp/longjmp 不保留堆栈,只保留 cpu 寄存器。所以如果你 longjmp 退出一个函数,本地的 vars 可以被覆盖。
-
您没有告诉我们您使用的是哪个编译器。使用一个支持 MASM 样式的程序集,我会写
mov ebp,[base_ptr]和mov esp,[base_ptr]。 -
不会 [base_ptr] 等同于 (*base_ptr) 吗?
-
@albundy - 这取决于汇编程序的语法。你必须表达
&base_ptr、base_ptr和*base_ptr的等价物。你来这里的是哪一个?这取决于!要获得 C 风格eax = *base_ptr;,您必须同时执行mov eax,[base_ptr]和mov eax,[eax]。