Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在单独分配的堆栈上运行函数_C++_Assembly_X86_Stack - Fatal编程技术网

C++ 在单独分配的堆栈上运行函数

C++ 在单独分配的堆栈上运行函数,c++,assembly,x86,stack,C++,Assembly,X86,Stack,我试图在单独分配的堆栈上运行函数 我想保留堆栈以备以后使用,这样我就可以恢复它并恢复函数 下面的代码编译并运行,但没有任何内容打印到屏幕上 #include <cstdlib> #include <csetjmp> #include <iostream> using namespace std; unsigned char stack[65535]; unsigned char *base_ptr = stack + 65535 - 1; unsigned

我试图在单独分配的堆栈上运行函数

我想保留堆栈以备以后使用,这样我就可以恢复它并恢复函数

下面的代码编译并运行,但没有任何内容打印到屏幕上

#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
    }
}
#包括
#包括
#包括
使用名称空间std;
无符号字符堆栈[65535];
无符号字符*base_ptr=stack+65535-1;
无符号字符*旧_堆栈;
无符号字符*旧字符基;
空函数()
{

cout根据英特尔关于
MOV
的x86文档,第3-403页,您应该在加载新的
ESP
值之前立即加载
SS
寄存器。这将阻止任何中断运行,直到
ESP
被分配。

根据英特尔关于
MOV
的x86文档,第3-403页,您需要在加载新的<代码> ESP<代码>值之前,应立即加载<代码> SS<代码>登记。阻止任何中断运行直到分配到代码> ESP < /C++ >。< /P> < P>欢迎C++和No.Frung.C++中的函数名被编译器损坏(使用GCC函数成为我的Z8官网)这是为了促进函数重载。编译器跟踪它在后台赋予不同函数的实际名称,因此您不知道它。这是任何其他试图与C++交互的语言的问题。

此代码无法在我的计算机上链接

解决办法: 1) 使用g++编译并传递-S标志(so g++-S test.cpp)。然后查看程序集输出(cat test.S)以查看调用了什么函数。然后将“调用函数”中的名称更改为“调用函数”(对我来说,它可能很容易与您不同)。
2)使用C:更改CUT

欢迎使用C++和No.Mngle。C++中的函数名被编译器所破坏(使用GCC函数为我成为Z8官能)这是为了促进函数重载。编译器跟踪它在后台赋予不同函数的实际名称,因此您不知道它。这是任何其他试图与C++交互的语言的问题。

此代码无法在我的计算机上链接

解决办法: 1) 使用g++编译并传递-S标志(so g++-S test.cpp)。然后查看程序集输出(cat test.S)以查看调用了什么函数。然后将“调用函数”中的名称更改为“调用函数”(对我来说,它可能很容易与您不同)。
2) 使用C:更改cout实际上我看不出你的代码有任何问题。 您的示例按原样编译、链接并按预期运行


可能是您的控制台设置问题,或者是一些全局STL/CRT初始化问题,或者其他问题。无论如何,您可以在
函数中设置一个断点,以确保您能够达到目标。

事实上,我认为您的代码没有任何问题。 您的示例按原样编译、链接并按预期运行



可能是您的控制台设置问题,或是一些全局STL/CRT初始化问题,或是其他任何问题。无论如何,您可以在
函数中设置一个断点,以确保您可以到达那里。

可能
setjmp
/
longjmp
对您的问题有用吗?setjmp/longjmp不保留堆栈,只保留cpu寄存器。因此我如果你从一个函数中长出jmp,本地变量可以被覆盖。你不会告诉我们你在使用哪个编译器。有了一个支持MASM风格的程序集,我将编写
mov ebp,[base\u ptr]
mov esp,[base\u ptr]
。难道[base\u ptr]不等同于(*base\u ptr)?@albundy-这取决于汇编程序的语法。你必须表达等价于
&base\u ptr
base\u ptr
*base\u ptr
。你得到的是哪一个?这取决于!要获得C风格的
eax=*base\ptr;
你必须同时执行
mov eax、
mov eax、[eax]
。也许
setjmp
/
longjmp
对您的问题可能有用?setjmp/longjmp不保留堆栈,只保留cpu寄存器。因此,如果您从函数中longjmp,则可以覆盖本地变量。您不需要告诉我们正在使用哪个编译器。有了一个支持MASM风格的程序集,我将编写
mov ebp,[base_ptr]
mov esp[base_ptr]
。难道[base_ptr]不等同于(*base_ptr)?@albundy-这取决于汇编程序的语法。你必须表达等价于
&base\u ptr
base\u ptr
*base\u ptr
。你得到的是哪一个?这取决于!要获得C风格的
eax=*base\ptr;
你必须同时执行
mov eax、
mov eax、[eax]
。我在function()中放置了一个断点,并且正在调用它。我甚至可以单步执行cout code=/几乎是您的代码:,用g++编译,然后运行,打印出“Hello World”。您使用的是什么环境(编译器/OS/机器)?以及程序“int main(){cout无法编译。vs2012似乎不支持asm(“”),只有{asm}但问题作者并没有抱怨链接器的问题!它构建正常,但没有达到预期效果。我在function()中设置了一个断点,并且正在调用它。我甚至可以单步执行cout code=/几乎是您的代码:,用g++编译,然后运行,打印出“Hello World”。您使用的是什么环境(编译器/操作系统/机器)?以及程序“int main(){cout无法编译。vs2012似乎不支持asm(“”),仅支持{uu asm}但是问题作者并没有抱怨链接器的问题!它构建的很好,但没有达到预期的效果。如果你要同时加载SS和ESP,这是为了同步。这里没有发生。这不是我在阅读文档时得到的印象。我读到它的意思是,你必须在ESP之前设置SS,这样ESP在不在s的情况下无法运行中断表状态。设置SS会阻止所有中断运行,直到下一条指令执行完毕。如果要同时更改SS和ESP,您的解释是正确的