80386ASM程序设计基础(六)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 12:04:30

高级语言支持,条件字节设置指令
  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,这是针对有符号数的