⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 80386asm程序设计基础(六).htm

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