enter指令是什么功能?
enter X, 0
好像等于
push ebp
mov ebp, esp
add esp, -X
enter N,L
N是分配的局部变量区的尺寸,L是过程嵌套级(0~31)。
相当于:
push ebp
mov ebp,esp
sub esp,(L - 1) * 4 ; L > 0才有这步操作,用来存储嵌套的L - 1个子过程的栈框架指针(注意是指针)
push ebp ; 当前过程的栈框架指针
sub esp,N
enter原来的设计是用于支持高级语言的过程的(和leave指令配对),但实际上这个指令要耗用近50个指令周期,结果根本就没有什么应用(leave倒是用得不少)
enter N,0
这种形式的倒是见过。
enter作用是给一个过程建立栈帧(Stack Frame)并保留局部变量空间
高级语言过程一般都有如下几句
push ebp
mov ebp,esp
sub esp,xxxx
....
leave
ret
简单的说,enter就相当于开头的那几条指令
1# Hmily
ENTER指令和LEAVE指令是由CPU提供的内置工具,用于实现某种类型的堆栈帧。它们使用起来非常简便,只需一步就可以完成在例程中建立堆栈帧的操作。
ENTER指令建立堆栈栈的过程是:将当前EBP寄存器压入堆栈,并使它指向局部变量区的顶部(见图C)。ENTER指令还支持嵌套堆栈帧的管理,通常嵌套堆栈是在同一个例程内(当然高级语言也得支持嵌套块才行)。为了实现嵌套,使用ENTER指令代码的必须指明当前嵌套的层数(这使得ENTER的使用与实现具体的例程调用之间关联性较小)。当给出嵌套的层数时,ENTER指令将指向当前每一个活动的堆栈帧的起始位置的指针存储到例程的堆栈帧中。然后,代码就可以使用这些指针来访问其它当前活动的堆栈帧了。
ENTER指令是一条非常复杂的指令,它实际上完成了相当多条指令的工作。在内部,ENTER指令是用相当冗长的一段微码(microcode)实现的,这样会导致一些执行效率的问题。为此,大多数编译器好像都在避免使用ENTER指令,尽管它们都支持C和C++等
语言中使用嵌套代码。这些编译器在为例程安排局部堆栈布局时就简单地忽视代码块的存在,而将所有的局部变量存放在一个独立的内存区域中。
LEAVE是与ENTER指令配合使用的指令。LEAVE指令只是恢复ESP和EBP寄存器之前存储的值。因为LEAVE指令相对比较简单,许多编译器好像常在函数的尾声中使用该指令(尽管在函数的序言中不一定使用ENTER指令)。
Enter的作用相当==push ebp和mov ebp,esp
函数开始一般都是这两句
Leave的作用相当==mov esp,ebp和pop ebp
后面这两句也很常见,函数调用完后一般都有
以上的Enter和leave的作用分别函数开始和结束 强大哈 、新手看不懂
页:
[1]