如果在x86中更改堆栈指针,基本指针是否会更改?

时间:2019-01-25 15:35:50

标签: assembly x86

开始时,通常将%ebp设置为%esp。如果我将堆栈指针设置为某个特定位置,则基本指针是否也会更改?

我是否需要将其更改为新位置,例如$(newstacklocation-4)?

2 个答案:

答案 0 :(得分:5)

基本指针和堆栈指针是单独的寄存器。基本指针仅在将其设置为新值时才会更改。设置堆栈指针不会隐式更改任何其他通用寄存器。

顺便说一句,这就是保留基本指针的全部原因:如果推入或弹出堆栈,则堆栈指针会发生变化,并且所有esp相对偏移也会发生变化。但是基本指针不会改变,因此堆栈上变量的ebp相对偏移量保持不变。这使组装中的编写功能变得更加容易,因为您可以修改堆栈框架而不必修复所有堆栈偏移。

答案 1 :(得分:1)

说明仅按照英特尔/ AMD手册“操作”部分中的说明进行操作。

sub $12, %espsub $12, %eax没什么不同。 SUB修改目标寄存器(以及带有条件代码的EFLAGS),即 all

EIP像往常一样前进到下一条指令。非分支指令通常不会提及,但是运行任何指令都会提高EIP。

对体系结构状态没有其他魔术效果。这是汇编语言。一切都只是内存或寄存器中的字节。您想要对这些字节进行任何操作,都必须通过编写CPU运行指令来使它自己发生。

如果您使用leave之类的指令,则可以,它会同时更改ESP和EBP,等效于

mov  %ebp, %esp
pop  %ebp

因为这就是the manual for leave中的意思。