开始时,通常将%ebp设置为%esp。如果我将堆栈指针设置为某个特定位置,则基本指针是否也会更改?
我是否需要将其更改为新位置,例如$(newstacklocation-4)?
答案 0 :(得分:5)
基本指针和堆栈指针是单独的寄存器。基本指针仅在将其设置为新值时才会更改。设置堆栈指针不会隐式更改任何其他通用寄存器。
顺便说一句,这就是保留基本指针的全部原因:如果推入或弹出堆栈,则堆栈指针会发生变化,并且所有esp
相对偏移也会发生变化。但是基本指针不会改变,因此堆栈上变量的ebp
相对偏移量保持不变。这使组装中的编写功能变得更加容易,因为您可以修改堆栈框架而不必修复所有堆栈偏移。
答案 1 :(得分:1)
说明仅按照英特尔/ AMD手册“操作”部分中的说明进行操作。
sub $12, %esp
与sub $12, %eax
没什么不同。 SUB修改目标寄存器(以及带有条件代码的EFLAGS),即 all 。
EIP像往常一样前进到下一条指令。非分支指令通常不会提及,但是运行任何指令都会提高EIP。
对体系结构状态没有其他魔术效果。这是汇编语言。一切都只是内存或寄存器中的字节。您想要对这些字节进行任何操作,都必须通过编写CPU运行指令来使它自己发生。
如果您使用leave
之类的指令,则可以,它会同时更改ESP和EBP,等效于
mov %ebp, %esp
pop %ebp
因为这就是the manual for leave
中的意思。