当前位置: 代码迷 >> 综合 >> enter-leave的使用
  详细解决方案

enter-leave的使用

热度:41   发布时间:2023-12-13 08:31:25.0

enter-leave的使用

以下问题在实模式下讨论:  
faq-it.org/linux_command/enter和leave称为高级语言汇编指令支持.(一般的汇编教程上的介绍很少,  没有什么使用实例。)  
enter和leave的引入是为了使汇编程序开发更容易。  
enter-leave具体作用在子程序中(过程)(一般情况)  
在堆栈上腾出空间供临时变量使用.  


使用格式  
enter  cnt1,cnt2  
cnt1  16位立即数.  指的堆栈框架的大小,  
cnt2  8位立即数,嵌套的层次(  这个所用极少,  而且……偶还不懂,忘高手指教!)一般设为0  
leave  (就这样写)  

enter-leave有等价的汇编指令  
enter  cnt1,cnt2相当于  
push  bp  
mov  bp,sp  
sub  sp,cnt1  

到下一个leave之前,  不要改变bp的值.  
leave  等价于  
mov  sp,bp  
pop  bp  

#####堆栈上的数据说明:  

无论子程序是near还是far,  
临时变量从[bp-2]开始,下一个就是[bp-4](要看你假设的变量类型:byte或者word,设置了几个)  
不要碰[bp],  因为[bp]中放的是enter前的bp的值  
如果proc是near  则[bp+2]是返回地址的偏移  
如果proc是far  ,则[bp+4]:[bp+2]是返回地址cs:ip  

实例:  两数相乘,  结果保存于dx:ax.参数以堆栈传递  

push  1      ;换成其他16位寄存器也可  
push  2      ;  说明同上  
call  sub  
sub1  proc  near  
enter  4,0                        ;为局部变量保留空间  
mov  ax,[bp+4]                ;取参数:2  
mov  [bp-2],ax                ;保存到局部变量中  
mov  ax,[bp+6]                ;取参数:1  
mov  [bp-4],ax                ;保存到局部变量中  
mov  ax,[bp-2]  
mul  word  ptr  [bp-4]    ;计算  
leave                                ;释放局部变量占用的空间  
ret  4  
sub1  endp
  相关解决方案