C ++设置堆栈指针

时间:2017-05-22 09:59:12

标签: c++ assembly x86

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

asm volatile(
    "movl %%ebp %%esp"
);

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

Error: bad register name `%%ebp %%esp'

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

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

Doe知道如何在c ++中操作这两个寄存器吗?也许我应该用hexed OP代码来做它?

1 个答案:

答案 0 :(得分:5)

您正在使用GNU C Basic Asm syntax(没有输入/输出/ clobber约束),因此%并不特殊,因此不应对其进行转义。

仅在 Extended Asm (带约束)中,%需要转义为最终在硬编码寄存器名称前面加上一个%编译器的asm输出(as required in AT&T syntax)。

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

asm volatile(
    "movl %ebp, %esp"
);
没有输出操作数的

asm语句是隐式易失性的,但编写显式volatile并没有坏处。

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