高级语言支持,条件字节设置指令 AA.高级语言支持指令,开始于80186,主要是用来简化高级语言的某些特征,总共有3条指令:ENTER,LEAVE,BOUND a.ENTER,LEAVE,建立与释放堆栈框架命令。在C语言中,栈不仅用来向函数传递入口参数,而且在函数内部的局部变量也存放在栈中。为了准确地存取这些这些局变量和准确地获得入口参数,就需要建立堆栈框架,先看一个小程序: //C Programming-Language int sum(int x,int y) { int sum; sum=x+y; return sum; } //The corresponding ASM codes lists below _sum proc near;注意C语言中函数参数的入栈方式是从右向左,即先是参数y入栈,再是x入栈,再是函数的返回地址入栈 push bp mov bp,sp;建立堆栈框架 sub sp,2 mov ax,word ptr [bp+4];取参数x add ax,word ptr [bp+6];加参数y mov word ptr [bp-2],ax mov ax,word ptr [bp-2] mov sp,bp;释放栈框架 pop bp ret _sum endp 此时栈顶的示意图是: |----------------------| | BP |<====SP |----------------------| | 函数返回地址 |<====BP+2 |----------------------| | 参数x |<====BP+4 |----------------------| | 参数y |<====BP+6 |----------------------| | ...... |<====BP+8 |----------------------| | ........ |<====BP+n,n是一能被2整除的数 |----------------------| 如果用建立和释放堆栈框架指令,那么对应的汇编程序应该是: _sum proc near enter 2,0;建立栈框架 mov ax,word ptr [bp+4];取参数x add ax,word ptr [bp+6];加参数y mov word ptr [bp-2],ax mov ax,word ptr [bp-2] leave;释放栈框架 ret _sum endp b.建立栈框架指令ENTER,格式如下:ENTER CNT1,CNT2。其中CNT1表示框架的大小,即子程序中需要放在栈中局部变量的字节数;CNT2是立即数,表示子程序嵌套级别,即从调用框架复制到当前框架的指针数。在立即数CNT2为0时,ENTER指令的实过程是: PUSH BP SP=>BP SP<=SP-CNT1 c.释放栈框架指令LEAVE,其具体实现过程: 8086: BP=>SP POP BP 80386: EBP=>ESP POP EBP d.ENTER和LEAVE指令均不影响标志寄存器中的各标志位,同时LEAVE指令只负责释放栈框架,并不负责函数返回。因此,要在LEAVE指令后安排一条返回指令。
BB.条件字节设置指令 这是80386新增的一组指令集,将会在后面全部列表出来。条件字节设置指令的格式: SETxx OPRD xx是助记符的一部分,OPRD只能是8位的寄存器或存储单元。 eg: SETO AL;表示当溢出标志位为1时,即OF=1,将AL置1,否则AL清0 SETNC CH;表示当CF=0时,将CH置1,否则将CH清0 SETNA BYTE PTR [100];表示当AF=0,将DS:[100]这一个字置1,否则将它清0 a.SETZ OPRD;等于0时(ZF=1),置OPRD为1,否则清0 b.SETE OPRD;同a c.SETNZ OPRD;不等于0时(ZF=0),置OPRD为1,否则清0 d.SETNE OPRD;同c e.SETS OPRD;为负数时(SF=1)置OPRD为1,否则清0 f.SETNS OPRD;同e正好相反(SF=0) g.SETO OPRD;OF=1,置OPRD为1,否则清0 h.SETNO OPRD;同g正好相反 i.SETP OPRD;偶(PF=1)置1 j.SETPE OPRD;同i k.SETNP OPRD;奇(PF=0)置1 l.SETPO OPRD;同k m.SETB OPRD;低于置OPRD为1,否则清0,这是针对无符号数的 n.SETNAE OPRD;不高于即低于或等于时置OPRD为1,否则清0,这是针对无符号数的 o.SETC OPRD;CF=1,置OPRD为1,否则清0 p.SETNB OPRD;高于或等于时,置OPRD为1,否则清0,这是针对无符号数的 q.SETAE OPRD;高于时置OPRD为1,否则清0,这是针对无符号数的 r.SETNC OPRD;CF=0时,置OPRD为1,否则清0,这是针对无符号数的 s.SETBE OPRD;低于或等于时,置OPRD为1,否则清0,这是针对无符号数的,CF|ZF=1 t.SETNA OPRD;同s,这是针对无符号数的,CF|ZF=1 u.SETNBE OPRD;高于时置OPRD为1,否则清0,这是针对无符号数的,CF OR ZF=0 v.SETA OPRD;同u,这是针对无符号数的,CF OR ZF=0 w.SETL OPRD;小于时,置OPRD为1,否则清0,这是针对有符号数的 x.SETNGE OPRD;同w,这是针对有符号数的 y.SETNL OPRD;大于或等于时,置OPR为1,否则清0,这是针对有符号数的 z.SETGE OPRD;同y,这是针对有符号数的 a1.SETLE OPRD;小于或等于时,置OPRD为1,否则清0,这是针对有符号数的 a2.SETNG OPRD;同a1,这是针对有符号数的 a3.SETNLE;大于时,置OPRD为1,否则清0,这是针对有符号数的 a4.SETG;同a3,这是针对有符号数的
|