在许多高级语言中,每个子程序(函数)都有自己的局部变量,这些局部变量只有当它们所在的子程序执行时才有意义。为了保存这些局部变量,当执行到这些子程序时,因为其局部变量已建立起相应的堆栈框架,因而当退出子程序时,应将这个框架撤除。ENTER和LEAVE指令相互配合,可完成上述工作。
指令格式 ENTER | imm16 ,imm8 |
|
指令格式 LEAVE |
|
|
· ENTER指令为局部变量建立一个堆栈区,指令中imm16指出子程序中所需堆栈的字节数,imm8指出子程序的嵌套层数(0-31);
· LEAVE指令用于撤消前面ENTER指令的操作。
例4-26 LEAVE指令举例。
TASK | PROC NEAR |
|
| ENTER 6 , 0 | ;建立堆栈区,并保存6个字节的局部变量 |
| ┇ |
|
| LEAVE | ;撤消已建立的堆栈区 |
| RET |
|
TASK | ENDP |
|
另外80286的指令系统还包括一些保护模式下的系统控制类指令,这组指令是
与保护模式相适应的处理器控制指令,它们常用于操作系统以及其它的控制软
件中,应用程序设计中用到的不多,故而此处不作详细介绍。保护模式下的系统控制类指令见表4-18 。
表4-18 80286保护模式的系统控制指令 | |||||
助记符 | 功能 | 助记符 | 功能 | ||
CLTS |
| 清除任务转移标志 | LGDT SGDT | src dest | 装入全局描述符表寄存器GDTR 存储全局描述符表寄存器GDTR |
ARPL | dest , src | 调整请求特权级RPL | |||
LMSW SMSW | src dest | 装入机器状态字 存储机器状态字 | LIDT SIDT | src dest | 装入8字节中断描述符表寄存器IDTR 存储8字节中断描述符表寄存器IDTR |
LAR LSL | dest , src dest , src | 装入访问权限 装入段界限值 | LLDT SLDT | src dest | 装入局部描述符表寄存器LDTR 存储局部描述符表寄存器LDTR |
VERR VERW | src src | 检查读允许 | LTR STR | src dest | 装入任务寄存器TR 存储任务寄存器TR |
本文转自
http://courseware.lzu.edu.cn/upload/2006/mayide/dianzikejian/4/a12.htm