📄 80386asm程序设计基础(六).htm
字号:
</B> </TD></TR>
<TR bgColor=#999999>
<TD colSpan=3 height=1></TD></TR></TBODY></TABLE>
<TABLE width=770 border=0>
<TBODY>
<TR>
<TD class=td1 vAlign=top align=middle width=150 bgColor=#fafafa><BR><!--广告条开始//-->
<SCRIPT src="80386ASM程序设计基础(六).files/other.js"></SCRIPT>
<!--广告条结束//--></TD>
<TD align=middle width=620><!--文章说明信息开始//-->
<TABLE cellSpacing=0 cellPadding=0 width=600 bgColor=#eeeeee border=0>
<TBODY>
<TR bgColor=#ffffff>
<TD align=middle width=50 height=10></TD>
<TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A
href="http://www.csdn.net/develop/">文档中心</A> - <FONT
color=#003399>其他开发语言 </FONT> </TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>标题</FONT></TD>
<TD><B> 80386ASM程序设计基础(六)</B> kingcaiyao(原作)
</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> 80386ASM</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE width=600 border=0>
<TBODY>
<TR>
<TD align=left><!--内容开始//--><BR>
<P>高级语言支持,条件字节设置指令<BR>
AA.高级语言支持指令,开始于80186,主要是用来简化高级语言的某些特征,总共有3条指令:ENTER,LEAVE,BOUND<BR>
a.ENTER,LEAVE,建立与释放堆栈框架命令。在C语言中,栈不仅用来向函数传递入口参数,而且在函数内部的局部变量也存放在栈中。为了准确地存取这些这些局变量和准确地获得入口参数,就需要建立堆栈框架,先看一个小程序:<BR>
//C Programming-Language<BR> int sum(int x,int y)<BR>
{<BR> int sum;<BR>
sum=x+y;<BR> return sum;<BR> }<BR>
//The corresponding ASM codes lists below<BR> _sum proc
near;注意C语言中函数参数的入栈方式是从右向左,即先是参数y入栈,再是x入栈,再是函数的返回地址入栈<BR>
push bp<BR> mov bp,sp;建立堆栈框架<BR>
sub sp,2<BR> <BR> mov ax,word ptr
[bp+4];取参数x<BR> add ax,word ptr
[bp+6];加参数y<BR> mov word ptr
[bp-2],ax<BR> mov ax,word ptr
[bp-2]<BR> mov sp,bp;释放栈框架<BR>
pop bp<BR> ret<BR> _sum
endp<BR> 此时栈顶的示意图是:<BR> |----------------------|<BR> |
BP
|<====SP<BR> |----------------------|
<BR> | 函数返回地址
|<====BP+2
<BR> |----------------------|<BR> |
参数x
|<====BP+4<BR> |----------------------|<BR> |
参数y
|<====BP+6<BR> |----------------------|<BR> |
......
|<====BP+8<BR> |----------------------|<BR> |
........
|<====BP+n,n是一能被2整除的数<BR> |----------------------|<BR> 如果用建立和释放堆栈框架指令,那么对应的汇编程序应该是:<BR> _sum
proc near<BR> enter
2,0;建立栈框架<BR> mov ax,word ptr
[bp+4];取参数x<BR> add ax,word ptr
[bp+6];加参数y<BR> mov word ptr
[bp-2],ax<BR> mov ax,word ptr
[bp-2]<BR> leave;释放栈框架<BR>
ret<BR> _sum endp<BR> b.建立栈框架指令ENTER,格式如下:ENTER
CNT1,CNT2。其中CNT1表示框架的大小,即子程序中需要放在栈中局部变量的字节数;CNT2是立即数,表示子程序嵌套级别,即从调用框架复制到当前框架的指针数。在立即数CNT2为0时,ENTER指令的实过程是:<BR> PUSH
BP<BR> SP=>BP<BR> SP<=SP-CNT1<BR> c.释放栈框架指令LEAVE,其具体实现过程:<BR> 8086:<BR> BP=>SP<BR> POP
BP<BR> 80386:<BR> EBP=>ESP<BR> POP
EBP<BR> d.ENTER和LEAVE指令均不影响标志寄存器中的各标志位,同时LEAVE指令只负责释放栈框架,并不负责函数返回。因此,要在LEAVE指令后安排一条返回指令。</P>
<P> BB.条件字节设置指令<BR> 这是80386新增的一组指令集,将会在后面全部列表出来。条件字节设置指令的格式:<BR> SETxx
OPRD<BR> xx是助记符的一部分,OPRD只能是8位的寄存器或存储单元。<BR> eg:<BR> SETO
AL;表示当溢出标志位为1时,即OF=1,将AL置1,否则AL清0<BR> SETNC
CH;表示当CF=0时,将CH置1,否则将CH清0<BR> SETNA BYTE PTR
[100];表示当AF=0,将DS:[100]这一个字置1,否则将它清0<BR> a.SETZ
OPRD;等于0时(ZF=1),置OPRD为1,否则清0<BR> b.SETE
OPRD;同a<BR> c.SETNZ
OPRD;不等于0时(ZF=0),置OPRD为1,否则清0<BR> d.SETNE
OPRD;同c<BR> e.SETS
OPRD;为负数时(SF=1)置OPRD为1,否则清0<BR> f.SETNS
OPRD;同e正好相反(SF=0)<BR> g.SETO
OPRD;OF=1,置OPRD为1,否则清0<BR> h.SETNO
OPRD;同g正好相反<BR> i.SETP OPRD;偶(PF=1)置1<BR> j.SETPE
OPRD;同i<BR> k.SETNP OPRD;奇(PF=0)置1<BR> l.SETPO
OPRD;同k<BR> m.SETB
OPRD;低于置OPRD为1,否则清0,这是针对无符号数的<BR> n.SETNAE
OPRD;不高于即低于或等于时置OPRD为1,否则清0,这是针对无符号数的<BR> o.SETC
OPRD;CF=1,置OPRD为1,否则清0<BR> p.SETNB
OPRD;高于或等于时,置OPRD为1,否则清0,这是针对无符号数的<BR> q.SETAE
OPRD;高于时置OPRD为1,否则清0,这是针对无符号数的<BR> r.SETNC
OPRD;CF=0时,置OPRD为1,否则清0,这是针对无符号数的<BR> s.SETBE
OPRD;低于或等于时,置OPRD为1,否则清0,这是针对无符号数的,CF|ZF=1<BR> t.SETNA
OPRD;同s,这是针对无符号数的,CF|ZF=1<BR> u.SETNBE
OPRD;高于时置OPRD为1,否则清0,这是针对无符号数的,CF OR ZF=0<BR> v.SETA
OPRD;同u,这是针对无符号数的,CF OR ZF=0<BR> w.SETL
OPRD;小于时,置OPRD为1,否则清0,这是针对有符号数的<BR> x.SETNGE
OPRD;同w,这是针对有符号数的<BR> y.SETNL
OPRD;大于或等于时,置OPR为1,否则清0,这是针对有符号数的<BR> z.SETGE
OPRD;同y,这是针对有符号数的<BR> a1.SETLE
OPRD;小于或等于时,置OPRD为1,否则清0,这是针对有符号数的<BR> a2.SETNG
OPRD;同a1,这是针对有符号数的<BR> a3.SETNLE;大于时,置OPRD为1,否则清0,这是针对有符号数的<BR> a4.SETG;同a3,这是针对有符号数的</P><BR><!--内容结束//--></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><!--文章评论开始//-->
<TABLE cellSpacing=0 cellPadding=0 width=770 align=center bgColor=#006699
border=0>
<TBODY>
<TR bgColor=#006699>
<TD id=white align=middle bgColor=#006699><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle><!--文章人气开始//-->
<SCRIPT src="80386ASM程序设计基础(六).files/readnum.htm"></SCRIPT>
<!--文章人气开始//--></TD></TR></TBODY></TABLE><!--文章评论结束//--><BR>
<DIV align=center>
<TABLE cellSpacing=1 cellPadding=2 width=770 align=center bgColor=#cccccc
border=0>
<TBODY>
<TR>
<TH id=white bgColor=#006699><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE width=770 border=0>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=17348">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR width=770 noShade SIZE=1>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR align=middle>
<TD vAlign=bottom height=10><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
height=48 src="80386ASM程序设计基础(六).files/biaoshi.gif" width=40
border=0></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -