C++设置堆栈指针

Aks*_*nik 2 c++ x86 assembly

在我的C++/C项目中,我想将堆栈指针设置为等于基指针 ...直观地,我会使用这样的东西:

asm volatile(
    "movl %%ebp %%esp"
);
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,我收到此错误消息:

Error: bad register name `%%ebp %%esp'
Run Code Online (Sandbox Code Playgroud)

我使用gcc/g ++版本4.9.1编译器.

我不知道我是否需要设置特定的g ++或gcc标志...应该有一种方法来操作espebp寄存器,但我只是不知道正确的方法来做到这一点.

有谁知道如何在c ++中操纵这两个寄存器?也许我应该使用hexed OP代码?

眠りネ*_*ネロク 5

您正在使用GNU C Basic Asm语法(没有输入/输出/ clobber约束),所以%不是特殊的,因此,它不应该被转义.

它仅在Extended Asm(带约束)中%需要转义,最终%在编译器的asm输出中以硬编码寄存器名称前面单个(根据AT&T语法的要求).

您还必须使用逗号分隔操作数:

asm volatile(
    "movl %ebp, %esp"
);
Run Code Online (Sandbox Code Playgroud)

asm没有输出操作数的语句是隐式易失性的,但写一个显式没有坏处volatile.

但请注意,将此语句放在函数中可能会干扰编译器处理堆栈帧的方式.