80386ASM程序设计基础(六)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

高级语言支持,条件字节设置指令

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,这是针对有符号数的

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航