数据压入堆栈时,ESP寄存器的指向?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据压入堆栈时,ESP寄存器的指向?相关的知识,希望对你有一定的参考价值。

EBP寄存器被设置为指向堆栈的顶部之后,函数中使用的任何附加数据都存放在堆栈中,位置在EBP指针之后问题:如果函数把任何数据压入堆栈,ESP寄存器仍然指向局部变量被存放之前的位置解决:在函数代码开始另加一行,通过从ESP寄存器减去一个值,为局部变量保留一定数量的堆栈空间"ESP寄存器仍然指向局部变量被存放之前的位置"是什么意思??解决方法中保留一定数量的堆栈空间又是保留多少?

参考技术A 堆栈空间有ESP指针控制函数传递参数通常是把ESP减去一个数值,使ESP远离栈顶,以便腾出一些空间来存储局部变量。而参数在压栈之前通常要将ESP的值赋给EBP,保存函数返回的地址。

汇编语言常用指令

1、堆栈相关指令

push:把一个32位的操作数压入堆栈中。这个操作导致esp被减4。esp被形象地称为栈顶。我们认为顶部是地址小的区域,那么,压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。

pop:相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。

sub:减法。第一个参数是被减数所在的寄存器;第二个参数是减数。(对应的还有add指令。)

add:加法。

ret:返回。相当于跳转回调用函数的地方。(对应的call指令来调用函数,返回到call之后的下一条指令。)(本质相当于pop+jmp)

call:调用函数。(本质相当于push+jmp)

2、数据传送指令

mov:数据移动。第一个参数是目的,第二个参数是来源。在C语言中相当于赋值号。

xor:异或。这虽然是逻辑运算的指令,但是有趣的是,xor eax,eax这样的操作常常用来代替mov eax,0。好处是速度更快,占用字节数更少。(见到xor eax,eax,应该马上明白这是清零操作。)

lea:取得地址(第二个参数)后放入到前面的寄存器(第一个参数)中。(mov不支持后一个操作数写成寄存器减去数字,但是lea支持,所以可以用lea来代替它。)

stos:看如下例子

mov ecx,30h

mov eax,0CCCCCCCCh

rep stos dword ptr es:[edi]

stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。rep使指令重复执行中填写的次数。方括弧表示存储器,这个地址实际上就是edi的内容所指向的地址。

3、跳转与比较指令

jmp:无条件跳转。

jg:大于的时候跳转。

jl:小于的时候跳转。

jge:大于等于的时候跳转。

cmp:比较。往往是jg、jl、jge、之类的条件跳转指令的执行条件。

以上是关于数据压入堆栈时,ESP寄存器的指向?的主要内容,如果未能解决你的问题,请参考以下文章

esp寻址ebp寻址

ESP寄存器和SS寄存器有什么区别?

课程学习总结报告

堆栈与ESP(栈指针寄存器)

Linux内核第二节

第五章----过程