分享
 
 
 

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有