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

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

📁 80386ASM的程序设计基础教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        <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>&nbsp;&nbsp; 算术运算指令,逻辑运算指令,移位指令<BR>&nbsp;&nbsp; 
            AA.算术运算指令<BR>&nbsp;&nbsp; 
            A.加减法运算ADD,ADC,INC,SUB,SBB,DEC,CMP,NEG<BR>&nbsp;&nbsp; 
            a.ADD,和8086功能,用法相同,不过支持32位操作,下面的语句都是合法的。<BR>&nbsp;&nbsp; ADD&nbsp; 
            ESI,EDI<BR>&nbsp;&nbsp; ADD&nbsp; EAX,DWORD&nbsp; PTR&nbsp; 
            [1000H]<BR>&nbsp;&nbsp; 
            b.ADC,带进位的加法指令,即OPRDS+OPRDD+CF,其中OPRDS代表源操作数,OPRDD代表目的操作,CF代表进位标志位,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; 
            c.SUB,和8086相同,支持32位操作。<BR>&nbsp;&nbsp; 
            d.SBB,带进位的减法指令,即OPRDD-OPRDS-CF,其中OPRDS代表源操作数,OPRDD代表目的操作数,CF代表进位标志位,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; 
            e.DEC,减1操作,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; 
            f.CMP,比较操作,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; 
            g.NEG,求补操作,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; h.INC&nbsp; 
            加1操作,功能和用法与8086相同,支持32位操作。<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 
            B.乘除法指令MUL,DIV,IMUL,IDIV<BR>&nbsp;&nbsp; 
            a.MUL,无符号数乘法指令,和8086功能用法一样,即指令中只给出一个操作,被乘数已默认,如果指令给出的操作数是32位的话,被乘数默认为EAX,那么乘积将存放在EDX:EAX中,其中EDX存放高32位,EAX存放低32位,如果此时EDX=0,即高32位为0的话,那么OF=0,CF=0,否则被置1。如果指令给出的操数作是16位的话,被乘数默认为AX那么乘积将放在DX:AX中,其中DX中将存放高16位,AX中存放低16位。如果指令给出的操作数是8位的话,被乘数默认为AL,那么乘积将放在AX,AH中存放高8位,AL中存放低8位。<BR>&nbsp; 
            b.DIV,无符号数的除法指令,和8086一样,指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32,那么被除数将是EDX:EAX, 
            最终的商将存放在EAX, 
            余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在EAX的高16位。如果指令中给出的操作数为8位,那么被除数是16位,最终得到的商将放在AL中,余数放在AH中。<BR>&nbsp; 
            c.IMUL,有符号数的乘法指令,除了具有8086的用法外,有新的形式:<BR>&nbsp;&nbsp;&nbsp; c1.IMUL 
            DST,SRC;将源操作数SRC与目的操作DST相乘,并将结果送往DST。<BR>&nbsp;&nbsp;&nbsp; c2.IMUL 
            DST,SRC1,SRC2;将源操作数SRC1与源操作数SRC2相乘,并将结果送往DST。<BR>&nbsp;&nbsp;&nbsp; 
            使用这种形式必须遵守的规则,形式c1指令中目的操作数必须是16位或32位通寄存器,源操作数的长度必须与目的操作的长度一样(8位立即数除外,即00H-FFH或80H-7FH),源操作数可以是通用寄存器,也可以是存储单元或立即数。形式c2指令中的源操作数SRC1可以是通用寄存器也可以是存储单元,源操作数SRC2必须是立即数,DST必须是16位或32位通用寄存器。呵呵,对于这些规则无需去问为什么,这是硬件的特性决定的,如果一定要问为什么,那只能问INTEL公司的硬件工程师了:)。同时,有一点要注意的是:这两种形式的指令,目的寄存器的长度与源操作数长度一样(8位立即数除外),这样的话,该指令事实上对有符号数和无符号数是一样的,因为乘积的低位部分均存储在目的寄存器中,而高位部分在这两种形式的指令中不予以存储。<BR>&nbsp; 
            d.IDIV,有符号数的除法指令,用法和8086相同,不过支持32位操作。&nbsp;&nbsp; </P>
            <P>&nbsp; C.符号扩展指令CBW,CWD,CWDE,CDQ<BR>&nbsp; 
            a.CBW,前面已介绍,在第三篇。<BR>&nbsp; b.CWD,前面已介绍,在第三篇。<BR>&nbsp; 
            c.CWDE,是80386新增的指令。格式:CWDE。功能:将AX的符号位扩展到EAX的高16位中。<BR>&nbsp; 
            d.CDQ,是80386新增的指令。格式:CDQ。功能,将EAX的符号位扩展到EDX中。<BR>&nbsp; 
            e.以上四条指令均不影响标志位。<BR>&nbsp; f.举例说明:<BR>&nbsp; ;If 
            AX=1234H,EAX=99991234H<BR>&nbsp; CBW;After processing the 
            instruction,AX=1234,DX=0000H<BR>&nbsp; CDQ;After processing the 
            instruction,EAX=99991234H,EDX=FFFFFFFFH</P>
            <P>&nbsp; 
            BB.逻辑运算指令和移位指令NOT,AND,OR,XOR,TEST,SAL,SAR,SHL,SHR,ROL,ROR,RCL,RCR,SHLD,SHRD<BR>&nbsp; 
            a.NOT,AND,OR,XOR,TEST这些指令的功能和用法与8086完全相同,不过它们支持32位操作。<BR>&nbsp; 
            b.TEST,测试指令,该指令测试的结果并不回送到目的操作数和源操数。之所以要使用这条的指令,主要是因为根据TEST指令得到的结果,进行程序的条件转移。<BR>&nbsp; 
            c.SAL,算术左移,功能和8086一样,但在8086中,如果在移位的位数超过1位,那么一定要移位的位数放在CX寄存器中。在80386中,可以不用这样做,其它的移位指令也一样。除了这一点以外,用法和8086一样,当然也支持32位操作。以下的语句均是合法的。<BR>&nbsp; 
            SHL AL,5;这在8086中是非法,但在80386中是合法的<BR>&nbsp; SHL WORD PTR 
            [SI],3<BR>&nbsp; 
            d.SAR,算术右移,将操作数右移指定的位数,但左边的符号位保持不变,移出的最低位进入CF标志位。<BR>&nbsp; 
            e.SHL,逻辑左移,用法和功能与SAL一样。<BR>&nbsp; 
            f.SHR,逻辑右移,将操作右移指定的位数,同时每移一位,左边用0补充,移出的最低位进入CF标志位。<BR>&nbsp; 
            g.说明:在80386中,实际移位的位数是指令中移位位数的低5位,也就是说移位位数的范围在0-31或0-1FH,CF标志位总是保留着目的操作数最后被移出位的值。当移位位数大于操作数的长度时,CF被置0。如果移位位数为1,移位前后的结果的符号位都是一样,那么很明显的是该操作数经移位后没有移出,此时OF=0。这四条指令的移位示意图(我画的是16位操作数的移位示意图,8位和32依此类推),SAL,SHL相当于乘法;SAR,SHR相当于除法。<BR>&nbsp; 
            SAL:<BR>&nbsp; 
            |-------------------------------------------------------------------------------------------|<BR>&nbsp; 
            |CF|&lt;-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<BR>&nbsp; 
            |-- 
            ----------------------------------------------------------------------------------------|<BR>&nbsp; 
            SHL:<BR>&nbsp; 
            |-------------------------------------------------------------------------------------------|<BR>&nbsp; 
            |CF|&lt;-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|<BR>&nbsp; 
            |--- 
            ---------------------------------------------------------------------------------------|<BR>&nbsp; 
            SAR:<BR>&nbsp;&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------|<BR>&nbsp; 
            |-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|-&gt;|CF||<BR>&nbsp; 
            | 
            |---|----------------------------------------------------------------------------------------|<BR>&nbsp; 
            |&nbsp;&nbsp;&nbsp;&nbsp; ^<BR>&nbsp; |-----|最高位保持不变<BR>&nbsp; 
            SHR:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------|<BR>&nbsp; 
            0-&gt;|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|-&gt;|CF||<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------|<BR>&nbsp; 
            h.ROL,循环左移,支持32位操作数,用法和8086一样。<BR>&nbsp; 
            i.ROR,循环右移,支持32位操作数,用法和8086一样。<BR>&nbsp; 
            j.RCL,带进位的循环左移,支持32位操作数,用法和8086一样。<BR>&nbsp; 
            k.RCR,带进位的循环右移,支持32位操作数,用法和8086一样。<BR>&nbsp; 
            l.ROL,ROR,RCL,RCR的移位示意图(仍然以16位操作数来画,8位/32位依次类推):<BR>&nbsp; 
            ROL:<BR>&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |&lt;-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|&lt;--------|<BR>&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------------| 
            <BR>&nbsp;&nbsp; 
            |--------------------------------------------------------------------------------------------------|&nbsp; 
            <BR>&nbsp; ROR:<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |-&gt;|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|-&gt;|<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------| 
            <BR>&nbsp;RCL:<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |&lt;-|CF|&lt;-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|&lt;-|<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------------|&nbsp;&nbsp; 
            <BR>&nbsp; RCR:<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |-&gt;|CF|&lt;-|bit15|bit14|bit13|bit12|bit11|bit10|bit9|bit8|bit7|bit6|bit5|bit4|bit3|bit2|bit1|bit0|-&gt;|<BR>&nbsp;&nbsp; 
            |---- 
            --------------------------------------------------------------------------------------------|<BR>&nbsp;&nbsp; 
            |-------------------------------------------------------------------------------------------------|<BR>&nbsp; 
            m.SHLD,80386新增的双精度左位指令,指令格式:SHLD OPRD1,OPRD2,M<BR>&nbsp; 
            n.SHRD,80386新增的双精度右移指令,指令格式:SHRD,OPRD1,OPRD2,M<BR>&nbsp; 
            o.m,n这两条指令的使用规则是:源操作数OPRD1可以是16位或32位通用寄存器或者16位存储单元或者32位存储单元,源操作数OPRD2必须是16位或32位通寄存器,M表示移位次数,可以是CL寄存器,也可以是8位立即数。功能:SHLD是将源操作数OPRD1移M位,空出的位用OPRD2高端的M位来填补,源操作数OPRD2的内容不变,最后移出的位放在CF中;SHRD将源操作数OPRD1移M位,空出的位用OPRD2低端M位来填补,源操作数OPRD2保持不变,最后移出的位放在CF中,对于这两条指令,当移位位数仅为1的话,移出和移后的符号位不变的话,那么OF=0,如果符号位不一样的话,那OF=1。<BR>&nbsp; 
            p.这两条指令是80386新增的指令,举两个简单的例子加以说明:<BR>&nbsp; p1.SHLD:<BR>&nbsp; MOV 
            AX,8321H<BR>&nbsp; MOV DX,5678H<BR>&nbsp; SHLD AX,DX,1<BR>&nbsp; 
            SHLD AX,DX,2<BR>&nbsp; 分析一下该指令的详细执行过程(用示意图, 
            第一个图画的就是AX的内容):<BR>&nbsp; AX=8321h<BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 
            |1|0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|&nbsp;&nbsp; <BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 根据指令SHLD 
            AX,DX,1,先左移一位,得到AX=0642H:<BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 
            |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|&nbsp;&nbsp;&nbsp; 
            CF=1&nbsp;&nbsp;&nbsp; <BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 
            经过上一步的移位后,AX的最后一位(即bit0)空出来,其值为0;根据指令的用法将用DX的第15位填充,填充后AX的内容为:<BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 
            |0|0|0|0|0|1|1|0|0|1|0|0|0|0|1|0|&nbsp;&nbsp;&nbsp; <BR>&nbsp; 
            |-------------------------------|<BR>&nbsp; 
            同时由于移位后AX的符号位与移位前AX的符号位不同,所以在移位过程中产生了溢出,OF=1,最后结果AX=0642H。<BR>&nbsp; 
            同理,SHLD AX,DX,2,执行完这条指令后,最后结果为AX=0644H<BR>&nbsp; p2.SHRD:<BR>&nbsp; 
            MOV EAX,12345678H<BR>&nbsp; MOV EDX,99994599H<BR>&nbsp; SHRD 
            AX,DX,1<BR>&nbsp; SHRD AX,DX,2<BR>&nbsp; 
            分析一下该指令的详细执行过程(用示意图,第一个图画的是EAX的内容):<BR>&nbsp; 
            EAX=12345678H<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            |0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|0|0|0|<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            根据指令SHRD AX,DX,1,将AX右移一位得到EAX=091A2B3EH:<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            |0|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|1|0|1|1|0|0|1|1|1|1|1|0|<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            经过上一步的移位后,EAX的最高位(第31位)空出来用0填充,根据指令的用法,最EDX的第0位来填充,填充后EAX的内容为:<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            |1|0|0|0|1|0|0|1|0|0|0|1|1|0|1|0|0|0|1|0|0|1|1|0|0|1|1|1|1|0|0|0|<BR>&nbsp; 
            |---------------------------------------------------------------|<BR>&nbsp; 
            即EAX=891A2B3EH,CF=0,OF=0<BR>&nbsp; 同理,指令SHRD 
            AX,DX,2,执行完这条件指令后,最后结果为EAX=048D159C,CF=0,OF=0</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=17346">登陆</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 + -