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

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

📁 80386ASM的程序设计基础教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
			document.write(date);
			// -->
			</SCRIPT>
      </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>&nbsp;&nbsp; 
            在接下来的四篇里将介绍80386的汇编指令及用法,并和8086的指令进行比较。<BR>&nbsp;&nbsp; 
            80386的指令集包含了8086/8088,80186,80286的指令集,可以分为几个大类:数据传送指令,算术运算/逻辑运算指令,移位指令,控制转移指令,串操作指令,高级语言支持的指令,条件字节设置指令,位操作指令,处理器控制指令和保护方式指令。高级语言支持指令始于80186,保护方式指令始于80286,条件字节设置指令和位操作指令是80386新增的。<BR>&nbsp; 
            本篇主要介绍数据传送指令,数据传送指令可以分为:通用数据传送,累加器专用传送,地址传送,标志传送,分别介绍如下:<BR>&nbsp; 
            A.数值传送指令MOV,MOVZX,MOVSX,XCHG,PUSH,PUSHA,PUSHAD,POPA,POPAD,<BR>&nbsp; 
            a.MOV,指令和8086相似,不过它支持32位操作。<BR>&nbsp; b.MOVZX,零扩展传送,格式--MOVZX 
            DST,SRC,表示将源操作送给目的操作数,目的操作数空出的部分用0填补。<BR>&nbsp; 
            c.MOVSX,符号扩展传送,格式--MOVSX 
            DST,SRC,表示将源操作送给目的操作数,目的操作数空出的部分用SRC的符号位来填补,举个简单的例子来演示:<BR>&nbsp; 
            MOV DL,90H;<BR>&nbsp; MOVSX AX,DL;AX=FF90H<BR>&nbsp; MOVZX 
            AX,DL;AX=0090H <BR>&nbsp; MOVSX ESI,DL;ESI=FFFFFF90H<BR>&nbsp; MOVZX 
            ESI,DL;ESI=00000090H<BR>&nbsp; 
            事实上在8086中也有两条指令CBW,CWD可以对操作数进行扩展。MOVSX可以对有符号数进行扩展,MOVZX可以对无符号数进行扩展,看看CBW,CWD的用法:<BR>&nbsp;&nbsp; 
            CBW将字节数据扩展成字,符号位扩展到AH中<BR>&nbsp;&nbsp; 
            CWD将字数据扩展成双字,符号位放到DX中<BR>&nbsp;&nbsp; MOV AL,70H;<BR>&nbsp;&nbsp; 
            CBW;//AX=0070<BR>&nbsp;&nbsp; CWD;//DX=0000,AX=0070<BR>&nbsp; 
            d.XCHG,功能和8080相同,不过它支持8位,16位,32位操作,下面的语句均是合法的。<BR>&nbsp;&nbsp; XCHG 
            AH,AL<BR>&nbsp;&nbsp; XCHG AX,AL<BR>&nbsp;&nbsp; XCHG 
            ESI,EDI<BR>&nbsp;&nbsp; XCHG ESI,[EBX+EDI+1000H]<BR>&nbsp; 
            e.PUSH,和8086不同的是,它支持立即数入栈,8位入栈,当然还有32位入栈,下面的语句均是合法的。<BR>&nbsp;&nbsp; 
            PUSH AL<BR>&nbsp;&nbsp; PUSH BH<BR>&nbsp;&nbsp; PUSH 
            100H<BR>&nbsp;&nbsp; PUSH EAX<BR>&nbsp;&nbsp; PUSH 
            EBX<BR>&nbsp;&nbsp; PUSH DWORD PTR [EAX]<BR>&nbsp; 
            f.POP,功能和用法和8086一样。<BR>&nbsp; 
            g.PUSHA,将8个通用寄存器全部进栈,进栈顺序为:AX,CX,DX,BX,SP,BP,SI,DI,然后SP指针寄存减16,不过SP入栈的内容是PUSHA指令执行前的内容。<BR>&nbsp; 
            h.POPA,8个通用寄存器全部出栈,堆栈指针寄存器不是堆栈中弹出的内容,而是加16而得到的,虽然这样得到的值和从堆栈中弹出来的内容一样,但物理意义不一样。<BR>&nbsp; 
            i.PUSHAD,将8个32位通用寄存器全部入栈,入栈顺序EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,ESP的内容是执行指令PUSHAD之前的内容<BR>&nbsp; 
            j.POPAD,8个32位通寄存器全部出栈,ESP的内容参见h<BR>&nbsp; <BR>&nbsp; 
            B.地址传送指令LEA,LDS,LES,LFS,LGS,LSS<BR>&nbsp; 
            a.LEA,取有效地址,功能,用法与8086相同,不过它支持32位操作。规则:目的操作必须是16位或32位通用寄存器,当目的操作数是16位时,那么只装入有效地址的低16位。事实上LEA指令相当于伪指令OFFSET,看例子:<BR>&nbsp; 
            MOV EAX,12345678H<BR>&nbsp; MOV EBX,56784321H<BR>&nbsp; LEA 
            ECX,[EAX+EBX];ECX=99999999H<BR>&nbsp; 
            b.LDS,装入指针,功能,用法与8086相同,不过它支持32位操作。格式:LDS 
            REG,OPRD。规则,目的寄存器必须是16位或32位的通用寄存器,OPRD必须是内存单元,不可以是立即数。如果目的寄存器是16位,那么源操作数OPRD含32位指针;如果目的寄存器是32位,那么源操作数有48位指针。该指令将目的操作数OPRD所指向的内存单存的4个或6个连续字节的内容送给助记符指令中指定的DS段寄存器和指令中目的寄存器。比如:<BR>&nbsp; 
            LDS 
            EAX,[1000H];这表明将偏移地址为1000,1001H这两个字节单元的内容送给段寄存器DS,将偏移地址1002,1003,1004,1005四个字节单元的内容送往EAX。<BR>&nbsp; 
            LDS 
            AX,[1000H];这表明将偏移地址为1000,1001H这两个字节单元的内容送给段寄存器DS,将偏移地址1002,1003H两个字节单元的内容送往EAX。<BR>&nbsp; 
            c.LES,同LDS,不过段寄存器是ES。<BR>&nbsp; d.LFS,同LDS,不过段寄存器是FS。<BR>&nbsp; 
            e.LGS,同LDS,不过段寄存器是GS。<BR>&nbsp; h.LSS,同LDS,不过段寄存器是SS。<BR>&nbsp; 
            <BR>&nbsp; C.标志传送指令LAHF,SAHF,PUSHF,PUSHFD,POPF,POPFD<BR>&nbsp; 
            a.LAHF,将标志寄存器的低8位送至AH中,包括SF,ZF,ZF,PF,CF。<BR>&nbsp; 
            b.SAHF,与i的过程恰好相反<BR>&nbsp; 
            c.PUSHF,将标志寄存器的EFLAGS低16位内容入栈,和8086相同<BR>&nbsp; 
            d.PUSHFD,将标志寄存器EFLAGS的内容入栈<BR>&nbsp; 
            e.POPF,将栈顶的一个字弹出,并将它送到标志寄存器EFLAGS的低16位<BR>&nbsp; 
            f.POPFD,将栈顶的两个字弹出,并将它送到标志寄存器EFLAGS<BR>&nbsp; <BR>&nbsp; 
            D.累加器传送指令IN,OUT,XLAT<BR>&nbsp; 
            a.IN,和8086相同,但可以输入一个双字节,同样如果端口的范围位于00H-FFH,可以直接用,如果超出这个范围,则先要将端口号送至DX,下面的语句是合法的:<BR>&nbsp; 
            IN AL,20H;从20H端口读入一个字节<BR>&nbsp; IN AX,20H;从20H端口读入一个字<BR>&nbsp; MOV 
            DX,0378H<BR>&nbsp; IN EAX,DX;从20H端口读两个字节<BR>&nbsp; 
            b.OUT,和8086相同,但可以输出一个双字节,同样如果端口的范围位于00H-FFH,可以直接用,如果超出这个范围,则先要将端口号送至DX,下面的语句是合法的:<BR>&nbsp; 
            OUT 20H,AL;从20H端口输出一个字节<BR>&nbsp; IN 20H,AX;从20H端口输出一个字<BR>&nbsp; 
            MOV DX,0378H<BR>&nbsp; IN EAX,DX;从20H端口输出两个字<BR>&nbsp; 
            c.XLAT,查表指令,功能和用法与8086相同,不过基址寄存器用的是EBX,来看看XLAT的实现过程:XLAT以BX作为基址寄存器,以AL作为变址寄存进器对指定的缓冲区进行查表,将AL指定位置的内容送往AL,比如说我们在MS-DOS方式写一个小程序:<BR>&nbsp; 
            C:\&gt;Debug<BR>&nbsp; -A100<BR>&nbsp;&nbsp;&nbsp;&nbsp; MOV 
            BX,0120<BR>&nbsp;&nbsp;&nbsp;&nbsp; SUB 
            AL,AL<BR>&nbsp;&nbsp;&nbsp;&nbsp; MOV 
            DL,AL<BR>&nbsp;&nbsp;&nbsp;&nbsp; MOV 
            AH,2<BR>&nbsp;&nbsp;&nbsp;&nbsp; INT 21<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
            MOV AH,4C<BR>&nbsp;&nbsp;&nbsp;&nbsp; INT 
            21<BR>&nbsp;&nbsp;&nbsp;&nbsp; INT 20<BR>-E120 
            'ABCDEFGHIJKLLMMDDKDJDK'<BR>=G100<BR>&nbsp;&nbsp; 
            屏幕上会显示A,如果AL=3,那么屏幕会显示D</P>
            <P>&nbsp;&nbsp; 
        以上所有的指令均不影响EFLAGS的各标志位。<BR></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=17345">登陆</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 + -