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
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