汇编语言与计算机原理第四章.doc
第四章 Intel8086/8088微处理器及其指令系统§4.1 概述微型计算机所使用的微处理器芯片可分为两大类:一类是Intel类型芯片,另一类是非Intel类型的。Intel类型微处理器芯片主要生产厂家是美国Intel公司, IBM PC微型计算机CPU使用的就是Intel类型微处理器。非Intel类型的微处理器芯片是Motorola等公司的产品,主要用于Apple公司的微型计算机和服务器中。自1971年,Intel公司生产第一片微处理器至今的30多年时间,Intel微处理器每3至5年就要更新换代一次,使IBM PC微型计算机的性能不断提高。IBM PC微型计算机使用的微处理器主要变化是:1 Intel 8088微处理器Intel 8088微处理器是Intel公司专门为第一代IBM PC微型计算机设计的。Intel 8088微处理器内部运算和寄存器都是16位,但是外部数据线是8位,因而被称为准16位微处理器。地址线20位,可寻址空间1M;工作频率4.7Mhz。与此同时还推出了Intel 8087浮点运算器,以配合Intel 8088,提高数值运算速度。2 Intel 80286微处理器Intel 80286是IBM PC/AT微型计算机使用的微处理,其内部运算和寄存器同Intel 8088一样,也是16位,但是外部数据线增加到16位,是真正的16位微处理器。地址线24位,可寻址空间16M;工作频率8Mhz。和Intel 80286配合的浮点运算器是Intel80287。3Intel 80386微处理器使用Intel 80386微处理器的有IBM公司的PS/2系列微型计算机,和一些其它厂家生产的386型兼容机。Intel 80386是32位微处理器,其内部运算和寄存器都是32位;外部数据线和地址线32位,可寻址空间4G;增加了页式虚拟存储管理部件;时钟频率32 Mhz。和Intel 80386配合的浮点运算器是Intel 80387。4Intel 80486微处理器Intel 80486是高性能的32位微处理器,其内部运算和寄存器的字长和Intel 80386相同。Intel 80486有多个型号,最高时钟频率可达66 Mhz。Intel 80486内含浮点运算器和8KB的高速缓存器。5Pentium微处理器1993年Intel公司推出了Pentium微处理器。Pentium微处理器芯片集成了310万个晶体管,有64位数据线,36位地址线。Pentium微处理器的内部浮点运算器在Intel 80486的基础上进行了全新的设计。Pentium微处理器使用了超标量技术,有两个独立的整数处理单元,可以同时执行两条整数运算指令。内部高速缓存分为两部分:8KB的指令高速缓存和8KB的数据高速缓存。之后Pentium微处理器推出的几个型号,时钟频率从66Mhz发展到166Mhz。1995年,Intel公司推出了Pentium Pro微处理器。Pentium Pro的整数处理单元增加到3个,时钟频率有150 Mhz、166 Mhz和200 Mhz等几个型号。1997年1月Intel公司推出了Pentium MMX(Multimedia Execution)微处理器,该处理器增加了57条多媒体指令,用于处理音频、视频和图像数据。1997年5月,Intel公司推出了PentiumII微处理器,最高时钟频率PentiumII芯片达366Mhz。1999年,Intel公司推出了Pentium 微处理器。最高时钟频率PentiumII芯片达933Mhz。2000年6月,Intel公司推出了Pentium 微处理器,目前,Pentium 微处理器的时钟频率已高达2.0G Mhz以上。§4.2 8086/8088微处理器一、8086/8088微处理器功能结构8088微处理器是Intel公司专为IBM-PC微型计算机设计的CPU芯片,它仅仅是在8086CPU的基础进行了一些改进。Intel8086和Intel 8088的主要区别是Intel 8086的数据线是16根,而Inetl8088只有8根数据线,但是它们的地址线都是20根,控制线也基本相同。通用寄存器组段寄存器组总线控制标志寄存器执行单元总线接口单元指令队列执行控制部件运算器运算器AHALBHBLCHCLDHDLSPBPSIDIESCSSSDS指令指针地址运算器运算器4321图4.2.1 8086/8088功能结构图Intel8086/8088CPU就功能而言分成两大部分:总线接口单元BIU(Bus Interface unit)和执行单元EU(Execution Unit),如图4.2.1所示。BIU单元的功能主要包括:从存储器取出指令,送入指令流排队机构;访问内存或外部设备;响应外部中断等。EU的功能是执行指令。EU从指令队列取出指令代码,译码后发出相应的执行控制信号。运算器执行运算,运算结果的特征保存在标志寄存器。由于取指令和执行指令部件是分开的,并且相对独立,所以指令执行和取指令可以同时进行,即在一条指令执行过程中,可以取出下一条指令。指令队列可以存储多条指令,BIU取出的指令在指令流排队机构排队,执行单元执行完一条指令后就可以立即从指令队列中取出下一条指令执行。由于执行和取指令可以重叠进行,提高了系统速度。二Intel8086/8088CPU的寄存器 Intel8086/8088CPU内部含有一些寄存器,这些寄存器用于暂存数据和地址等。1数据寄存器组数据寄存器有四个,这四个寄存器都是十六位寄存器,可以按十六位使用,也可以分别使用每个寄存器的高八位和低八位。如果按十六位使用其名称分别为AX,BX,CX和DX,如果按八位使用其名字如图4.2.2所示。四个数据寄存器的通常的名称和用途如下:AX:累加器,用于暂存操作数或运算结果。BX:基址寄存器,除用于存储运算操作数之外,还经常用于地址运算。CX:计数器,初作为一般寄存器使用外,还经常用于循环程序的循环次数计数。DX:数据寄存器,用于存储运算操作数或运算结果。AHALBHBLCHCLDHDL图4.2.2 数据寄存器2. 变址寄存器SI:源变址寄存器,16位,一般用于存储源操作数的偏移地址。DI:目的变址寄存器,16位,一般用于存储目的操作数的偏移地址。3. 堆栈指针和基数指针SP:堆栈指针,16位,用于堆栈操作。BP:基数指针,16位,用于堆栈段指示偏移地址。4段寄存器段寄存器CS、DS、SS、ES是四个十六位寄存器,在段式存储管理中,这四个寄存器用于保存段基址(段开始地址)。由于Intel8086/8088微处理器的地址线有20条,而段寄存器是十六位寄存器,所以只能保存段基址的高十六位,在执行访问内存指令时,将段寄存器左移4位,再加上16位偏移地址得到20位物理地址。四个段寄存器用途如下:CS:代码段寄存器,用于存储程序代码段基址。DS:数据段寄存器,用于存储程序数据段基址。SS:堆栈段寄存器,用于存储程序堆栈段基址。ES:附加数据段寄存器,用于存储程序数据段基址,通常用于字串操作5. IP:指令指针,16位,指向下一条要执行指令的偏移地址。6. 标志寄存器16位寄存器,每一位指示运算指令或其他指令执行后的检验结果,其意义如下:CF:b0位,进位或借位标志位,当加法运算最高位向前有进位,或减法运算最高位向前有借位,本位置1,否则置0;PF:b2位,奇偶标志位,当运算结果低8位有偶数个1,PF置1,否则置0;AF:b4位,辅助进位标志位,当运算时,b3位向b4位有进位AF置1,否则置0;ZF:b6位,零标志位,运算结果等于0时置1,否则置0;SF:b7位,符号标志位,运算结果的最高位等于1时SF=1(负号),等于0时 SF=0(正号);TF:b8位,追踪标志位,当TF=1时使CPU进入单步执行方式,每执行一条指令就暂停,常用于调试程序;IF:b9位,中断标志位,当IF=0时,CPU不响应可屏蔽中断;DF:b10位,方向标志位,当字符串传送时,DF=0时每传送一个字节或一个字,地址自动增加1(字节传送)或增2(字传送),当DF=1时每传送一个字节或一个字,地址自动减1(字节传送)或减2(字传送);OF:b11位,溢出标志位,当带符号数运算的运算结果超出了数的表示范OF置1,否则置0。例如,8位运算时,当运算结果>+127或<128时,超出了8位机器数的表示范围,既产生了溢出。进位和溢出是两个不同的概念,不要混淆,如下例,计算+,计算结果为,并没有向前进位,但是8位带符号机器数的表示范围,OF将置1:+ 除上述标志位外,状态标志寄存器还有一些位没有使用,如图4.2.3所示。b15 b0OFDFIFTFSFZFAFPFCF图4.2.3 标志寄存器§4.3 操作数寻址方式一、指令格式Intel8086/8088微处理器的指令按格式可分为无操作数指令、单操作数指令和双操作数指令三种。指令的一般格式为: 操作码 目的操作数 ,源操作数操作码表示指令的操作类型,源操作数和目的操作数表示指令的操作对象,操作结果存入目的操作数。例如指令:ADD AL,3 ,表示将AL寄存器中的值和常数3相加,结果存入AL寄存器。微处理器实际执行的指令是二进制代码的机器指令,为了编程方便,在编写程序时一般使用机器指令的助记符号,机器指令的助记符号称为汇编指令,例如,上面指令中的ADD就是加法机器指令的助记符。不同指令的操作数个数可能不同,有的指令有两个操作数,有的指令有一个操作数,还有的指令没有操作数,或者其操作数是隐含的,如下面的例子:INC AL ;将AL寄存器值加1,结果存入AL寄存器CLD ;将标志寄存器的DF位置0ADD AL, BL上面第一个指令是单操作数指令;第二个指令的操作数是隐含的(DF标志位),第三个指令是双操作数指令。二、操作数类型:按操作数所在位置,可分为三种类型:1寄存器操作数:操作数在CPU内部寄存器中,例如将AL和BL得值相加,结果存入AL,可用如下指令: ADD AL, BL这里源操作数和目的操作数都是寄存器操作数。2存储器操作数:操作数据在内存单元中,如下例:ADD 2000H, AL该指令的执行将AL的值和偏移地址为2000H的内存单元值相加,结果存入内存单元,该指令的源操作数属于寄存器操作数,而目的操作数是存储器操作数。3立即数:操作数在指令中,例如下面指令的源操作数为立即数:ADD AL,30在指令中目的操作数除了参加运算之外,还要存储运算结果,所以目的操作数不能是立即数,只能是存储器操作数或寄存器操作数。三、寻址方式所谓寻址方式,是CPU在执行指令时,如何确定源操作数或目的操作数所在位置。Intel8088寻址方式有如下几种:1立即寻址操作数为立即数,例如:MOV AL, 3MOV AL,A第一条指令的功能是将数值常数3传送到AL寄存器。第二条指令的功能是将字符A的ASCII码41H传送到AL寄存器。立即数寻址中的操作数(立即数)作为指令的一部分,跟随在操作码之后。如果是16位操作数,低8位在前(低地址),高8位在后(高地址)。例如:MOV AX,4142H指令在内存中的存放如图4.3.1所示,指令执行后,AL=42H,AH=41H。操作码42H41HALAH图4.3.1 16位立即数寻址2寄存器寻址操作数为CPU内部寄存器,上面示例指令的目的操作数即为寄存器寻址,下面指令的源操作数和目的操作数都是寄存器寻址方式:MOV DS,AX ;将AX的值传送给DS寄存器。3直接寻址直接寻址方式指令中,给出的是操作数所在内存单元的段内16位偏移地址,如下面指令:MOV AX,2000H ;将段内相对偏移地址为2000H单元的值传送到AX。这里方括号是地址符号,2000H为十六进制数。执行指令时CPU要根据偏移地址计算实际物理地址,其计算方法是:DS*10H+2000H这里约定段基址的高16位存放在DS段基址寄存器,低4位为0。CPU的地址运算器根据段基址和指令中的偏移地址计算出20位的物理地址,发送到地址总线,将该地址开始存放的一个字(两个字节)的数据传送到寄存器AX,如图4.3.2所示。6000HDS62000H数据段42H41HALAH图4.3.2 直接寻址如果不使用DS作为段基址,在指令中要给出段前缀,指明计算物理地址时使用那一个段寄存器,例如:MOV AX,ES:2000H或:ES:MOV AX,2000H在执行指令时计算物理地址使用ES段寄存器。在汇编语言程序中操作数的偏移地址一般使用符号表示,例如:MOV AX,BUFF指令中的BUFF是偏移地址符号,一般称为变量,其代表的值在程序中应当有相应的定义。4 寄存器间接寻址寄存器间接寻址方式的指令,操作数的段内偏移地址由寄存器的值指出。例如:MOV BX,2000HMOV AX,BX第一条指令将偏移地址存入BX寄存器,第二条指令由BX指定源操作数偏移地址。这里方括号的含义是将BX寄存器的值作为偏移地址,指令是将该地址存储的一个字(两个字节)的数据传送到AX寄存器。寄存器间接寻址操作数的段内偏移地址可以由SI,DI,BX,BP四个寄存器指定。在指令中没有段前缀时,如果使用SI,DI,BX寄存器,指令执行时使用DS寄存器的值作为段基址计算物理地址;如果使用BP寄存器指定,计算物理地址约定使用SS段寄存器。5变址寻址所谓变址寻址就是由规定的变址寄存器的值再加上一个指令中给出的位移量作为操作数的段内偏移地址。Intel 8088CPU有两个变址寄存器SI和DI,位移量可以是8位或16位二进制数。如指令:ADD AX, BUFFSI计算物理地址的方法是:DS*10H+SI +BUFF。指令中BUFF是代表位移量符号。6基址寻址基址寻址与变址寻址类似,只不过使用的寄存器是基址寄存器BX,或基址指针寄存器BP。指令中如果没有段前缀,如果使用BX寄存器,计算物理地址使用DS寄存器;如果使用BP寄存器,计算物理地址使用SS段寄存器。如指令:ADD AX, BUFFBX计算物理地址的方法是:DS*10H+BX +BUFF。7基址-变址寻址指令中将BX或BP作为基址寄存器,将SI或DI作为变址寄存器,偏移地址由基址寄存器值加上变址寄存器值再加上一个位移量得到,如下面指令:MOV AX, MASKBXSI其物理地址为:DS*10H+BX+SI+MASK。这里MASK是一个代表位移量的符号。如果指令使用BX作基址寄存器,使用DS寄存器计算物理地址;使用BP作基址寄存器,计算物理地址使用SS段寄存器。当指令有段前缀时,使用是指定的段寄存器计算计算物理地址。§4.4 Intel8086/8088指令系统指令系统是指CPU所能识别和执行的指令集合。Intel8086/8088指令按功能可分为六组:1数据传送指令2算术逻辑指令3逻辑运算指令4串操作指令5程序控制指令6处理器控制指令我们将分类说明Intel8086/8088指令,并且从每一类选出一到两个常用指令做较详细讨论,其余一些指令在以后章节的程序设计举例中将会使用,届时将会进行详细讨论;有一些指令在本教材中没有做详细讨论,如果需要可以查阅有关参考资料。一、 数据传输指令数据传输指令包括通用传送指令、输入输出指令、目标地址传送和标志传送指令,如表4.4.1所示。指令类型助记符格式操作通用传送指令MOVMOV oprd1,oprd2oprd1oprd2PUSHPUSH oprd 将oprd值压入堆栈POPPOP oprd 将堆栈数据弹出到oprdXCHGXCHG oprd1,oprd2将oprd1和oprd2的值互换XLATXLAT src_table 码表数据传送到AL寄存器输入输出指令ININ acc, portPort端口数据送accOUTOUT port, accacc数据送Port端口目标地址传送LEALEA reg16, oprd16将oprd16偏移地址传送到reg16寄存器LDSLDS reg16, oprd32将oprd32传送reg16和DS寄存器LESLES reg16, oprd32将oprd32传送reg16和ES寄存器标志位传送LAHF无标志寄存器的低8位传送到AH寄存器SAHF无AH寄存器值传送到标志寄存器的低8位PUSHF无标志寄存器值压入堆栈POPF无堆栈数据弹出到标志寄存器表4.4.1 数据传输指令下面讨论MOV指令和交换指令XCHG的使用:1MOV指令指令格式:MOV oprd1,oprd2MOV 是操作码,oprd1是目的操作数,oprd2是源操作数。此指令将一个字节(8位)或一个字(16位)操作数从源传送到目的操作数,例如:MOV AL,2000MOV AX,2000第一条指令是将段内偏移地址为2000的单元数据传送到AL寄存器;第二条指令是将段内偏移地址为2000的单元数据传送到AL寄存器,2001单元数据传送到AH寄存器。使用MOV指令应注意:源操作数可以是立即数、寄存器数或存储器操作数,目的操作数可以是寄存器操作数或存储器操作数,但不可以是立即数;oprd 1和oprd 2不能同时为存储器操作数,即不能使用MOV指令将存储器的一个单元数据传送到另一个单元;MOV指令中的目的操作数不能是CS段寄存器,也就是不能通过传送指令改变CS段寄存器的值,但是CS可以是源操作数;当源操作数是立即数时,目的操作数不能是DS、ES、SS段寄存器。MOV指令执行不影响标志位。2交换指令XCHG指令格式:XCHG oprd 1,oprd 2XCHG指令将oprd 1和oprd 2相互交换,例如:XCHG AL,BL上面指令将AL的值传送到BL,将B L的值传送到AL。使用该指令应注意:oprd1和oprd2不能是段寄存器;oprd1和oprd2不能同时是存储器操作数。XCHG指令执行也不影响标志位。二、 算术运算指令算术运算指令包括加、减、乘、除等运算指令。算术运算指令执行后将影响CF,ZF,SF,AF,PF,OF标志位,例如,加法运算最高位有进位时或减法运算有借位时,CF标志位将值位。算术运算指令如表4.4.2所示。指令类型指令指令格式操作加法ADDADD oprd 1,oprd 2 oprd 1+oprd 2 oprd 1ADCADC oprd 1,oprd 2oprd 1+oprd 2+CF oprd 1(带进位加法)INCINC oprd oprd +1oprdAAA隐含非压缩BCD码加法调整DAA隐含压缩BCD码加法调整减法SUBSUB oprd 1,oprd 2 oprd 1+ oprd 2 oprd 1SBBSUB oprd 1,oprd 2oprd 1-oprd 2-CF oprd 1(带借位减法)DECDEC oprdoprd -1oprdNEGNEG oprd对oprd的求补运算CMPSUB oprd 1,oprd 2oprd 1-oprd2,不存结果,只影响标志位AAS隐含非压缩BCD码减法调整DAS隐含压缩BCD码减法调整乘法MULMUL oprd字节乘法:(AL)* oprdAX字乘法: (AX)* oprd(DX:AX)IMULMUL oprd带符号数乘法AAM隐含非压缩BCD码乘法调整除法DIVDIV oprd字节除法:(AX)/ oprdAL,余数AH字乘法:(DX:AX)/ oprd(AX) ,余数DXIDIVIDIV oprd带符号数除法AAD隐含非压缩BCD码除法调整转换CBW隐含字节(8位)转换为字(16位)CWD隐含字(16位)转换为双字(32位)表4.4.2 算术运算指令1加法指令指令格式:ADD oprd 1,oprd 2 ;oprd 1+ oprd 2 oprd 1ADD指令是不带进位的加法指令,指令源操作数可以是寄存器操作数、存储器操作数、或立即数,目标操作数不可以是立即数,并且源操作数和目标操作数不可以同时为存储器操作数,例如,下面指令是错误的:ADD 2000H,3000H相加数据可以作为带符号数处理,或者作为无符号数处理,由程序设计者根据实际问题考虑,例如:MOV AL,7EHADD AL,5BH相加后(AL)=D9H,此时各标志位的状态为:SF=1,ZF=0,AF=1,PF=0,CF=0,OF=1。如果程序设计中将其作为无符号数处理,只要检查CF标志位,因为其没有置位,说明没有溢出;如果将其作为带符号数处理,要检查OF标志位,因其置位,说明运算结果溢出。2 增1指令:指令格式:INC oprd ;oprd +1 oprdINC指令将目标操作数加1,该指令影响SF、ZF、AF、PF和OF标志位,但是不影响CF标志位。INC指令指令的操作数可以是存储器操作数,或除段寄存器之外的寄存器操作数。但是不能是立即数。例如:INC CX ;16位寄存器CX增1INC CL ;8位寄存器CL增1INC CH ;8位寄存器CH增1INC SI ;源变址寄存器SI增13减法指令指令格式:SUB oprd 1,oprd 2 ; oprd 1-oprd 2 oprd 1SUB指令的使用方法和ADD指令类似,只不过是做减法运算。SUB指令的目的操作数是被减数,SUB指令执行后,影响CF、SF、ZF、AF、PF和OF标志位,当最高位有向前借位时CF标志位置位。例如: SUB BX, 1000H ;寄存器减立即数 SUB BUFBXSI, 37DH ;存储器操作数减立即数4减1指令指令格式:DEC oprd ;oprd -1 oprdDEC指令将目标操作数减1。DEC指令也不影响CF标志位,对其他标志位的影响同SUB指令。例如:DEC CX三、 逻辑指令逻辑指令包括逻辑运算指令、移位指令和循环移位指令,如表4.4.3所示。指令类型助记符格式操作逻辑运算NOTNOT oprd 对oprd按位取反oprdANDAND oprd1,oprd2oprd1和oprd2按位逻辑与oprd1TESToprd1,oprd2oprd1和oprd2按位逻辑与OROR oprd1,oprd2oprd1和oprd2按位逻辑或oprd1XORXOR oprd1,oprd2oprd1和oprd2按位逻辑异或oprd1 移位SHLSHL dest, 1|CL逻辑左移SALSAL dest, 1|CL算术左移SHRSHR dest, 1|CL逻辑右移SARSAR dest, 1|CL算术右移循环移位ROLROL dest, 1|CL循环左移RORROR dest, 1|CL循环右移RCLRCL dest, 1|CL带标志位CF的循环左移RCRRCR dest, 1|CL带标志位CF的循环右移表4.4.3 逻辑指令1逻辑运算指令逻辑运算指令包括指令NOT(逻辑非)、AND(逻辑与)、TEST(逻辑与测试)、OR(逻辑或)和XOR(逻辑异或)。这些指令对操作数按位进行逻辑运算,除了NOT操作不影响标志位外,其余指令对标志位的影响是:根据运算结果影响SF、ZF和PF标志位,例如,运算结果为0时ZF置位;无论运算结果如何,CF和OF标志位都将置0;AF的值不确定。NOT指令指令格式:NOT oprd NOT指令将操作数按位取反,例如,MOV AL,0FHNOT AL 执行后AL的值为F0HAND指令 指令格式: AND oprd 1,oprd 2 将oprd 1和oprd 2按位进行与运算,运算结果存入oprd 1,例如: MOV AL ,0BFHAND AL,0FCH1011 1111 1111 11001011 1100这两条指令的执行结果是AL= 0BCH 使用AND指令可以将某些位清0。如果要将某些位清0,其它位不变,清0位和0相与,不变位和1相与。例如,将数字的ASCII码转换为非压缩的8421-BCD码: MOV AL,8 AND AL,0FHOR指令指令格式:OR oprd 1,oprd 2将oprd D1和oprd2按位进行“或”运算,运算结果存入oprd1 ,例如:MOV AL,43HOR AL,20H上面两条指令执行后AL=63H 0111 0011 0010 0000 0110 0011使用OR指令可以将某些位置为1。如果将某些位置1,其他位不变,置1位和1相或,不变位和0相或。例如,将非压缩的BCD码转换为ASCII码: MOV AL,09H OR AL,30HXOR指令指令格式:XOR oprd1,oprd2将oprd1和 oprd2按位进行异或运算,运算结果存入 oprd1,例如:MOV AL,11HXOR AL,3H指令执行: 0001 0001XOR 0000 0011 0001 0010 结果AL=12H。使用XOR指令可以将某些位取反,要将某位取反,只要和1进行异或,不变位和0进行异或。XOR指令经常用于将寄存器清0,例如:XOR CX,CX使用XOR指令将寄存器清0,同时CF标志位也清0。TEXT指令指令格式:TEST oprd1,oprd2将oprd1和 oprd2 按位进行与运算,不存运算结果,只影响标志位。例如,检测某寄存器中的值是否为负数: TEST AX, 8000H如果AX中的值是负数ZF=0,如果是正数ZF=1。2移位指令移位指令包括逻辑左移、逻辑右移、算术左移和算术右移四条指令。逻辑左移指令指令格式:SHL oprd, 1SHL oprd, CL将操作数左移1位,或左移 CL寄存器指定的位数,最低位移入0,最高位移出到CF标志位。如图4.4.1所示。逻辑右移指令指令格式:SHR oprd, 1SHR oprd, CL将操作数oprd右移1 位,或右移CL寄存器指定的位数,最高位移入0,最低位移出到CF标志位,如图4.4.1所示。算术左移指令指令格式:SAL oprd, 1 SAL oprd, CL和SHL指令操作相同。算术右移指令指令格式:SAR oprd, 1SAR oprd , CL将操作数oprd右移1 位,或右移CL寄存器指定的位数,最高位不变,如图4.4.1所示。CF0CF 逻辑左移算术左移CF0CF 逻辑右移CFCF 算术右移图4.4.1 移位指令逻辑移位则用于无符号数乘二或除二运算运算:SHL用来乘二,SHR用来除二;算术移位指令使用于带符号数乘二或除二运算:SAL用来乘二,SAR用来除二。由于移位指令比乘法指令执行的速度要快得多,因此,在程序设计中经常使用移位代替乘法指令。例1:计算AX/2。SHR AX,1如执行前AX=0064H,执行后AX=32H。例2:计算AX*4。MOV CL,2 SHL AX,CL如执行前AX=16D,执行后AX=64D。例3:计算AX*10。SHL AX,1MOV BX, AXMOV CL, 2SHL AX, CLADD AX, BX如执行前AX=0020D,执行后AX=0200D。3,循环移位指令循环移位指令有循环左移和循环右移两条指令。循环左移指令指令格式:ROL LPRD,1ROL LPRD,CL将操作数oprd左移一位,或左移CL寄存器指定的位数,最高位移入到最低位移入,并且移到CF标志位,如图4.4.2所示。循环右移指令指令格式:ROR PORD,1ROR PORD,CL将操作数oprd右移一位,或右移CL寄存器指定的位数,最低位移出到最高位,并且移到CF标志位,如图4.4.2所示。带CF的循环左移指令指令格式:RCL oprd,1RCL oprd,CL将操作数oprd左移一位,或左移CL寄存器指定的位数,CF标志位值移入最低位,最高位移出到CF标志位,如图4.4.2所示。带CF的循环右移指令指令格式:RCR oprd,1RCR oprd,CL将操作数oprd右移一位,或右移CL 寄存器指定的位数,CF标志位值移入最高位,最低位移出到CF标志位,如图4.4.2所示。例:假如AL和BL寄存器分别有非压缩8421-BCD码,AL=03H,BL=09H,要将其转换为压缩8421-BCD码39H存入AL,可用如下指令序列实现:MOV CL,4ROL AL,CLOR AL,BL这里将AL左移4位,再和BL值进行“或”运算。由于移位次数大于一,所以要将移位次数置CL寄存器。CFCFCFCF图 4.4.2 循环移位指令四、串操作指令串操作指令包括:MOVS串传送指令、CMPS串比较、SCAS串扫描、STOS存入串和LODS取串,如表4.4.4所示。指令类型助记符格式操作串操作MOVSMOVS dest,src数据块传送CMPSCMPS dest,src数据块比较SCASSCAS dest字符串扫描LODSLODS src字符串装入STOSSTOS dest字符串存储表4.4.4 串操作指令上面串操作指令应用于内存数据快的操作,例如MOVS指令应用于将内存某一个或多个数据传送到内存的另一位置。串操作指令的源数据串的段基址由DS段寄存器指定,偏移地址由SI寄存器指定;目的数据串的段基址由ES段寄存器指定,偏移地址由DI寄存器指定。每移动一个字或一个字节,DS:SI指向源串的下一个数据,ES:DI指向目的串的下一个数据。串操作指令可以是按字节(8位)操作或按 字(16位)操作,当字节操作时串操作指令执行后SI和DI分别增1或减1;当字操作时出操作指令执行后SI和DI分别增2或减2。增减取决于DF标志位,当 DF= 0时增,当DF= 1时减 。例 :将地址FB254HFB264H十六个字节数据传送到地址B2A4HFB2B4可用下面指令完成: MOV AX, 0FB25 MOV DS, AX MOV ES, AX MOV SI, 04HMOV DI, 50HCLDMOV CX, 16LI: MOVSBLOOP L1串操作指令可以加重复前缀,如:REP MOVS等价于:LI: MOVSBLOOP L1重复前缀REP的含义是当CX0重复执行串操作指令。除了REP重复前缀,另外两个重复前缀是:REPE/REPZ ;当CX0并且ZF=1时重复。REPNE/REPNZ ;当CX0并且ZF=0时重复。这里仅介绍了MOVS指令,其它串操作指令在后面章节结合实例再作再做介绍。五、程序控制指令控制转移指令可以改变程序执行的顺序,从一条指令转移到前面或者后面的指令继续执行。控制转移指令可分为下面五类:无条件转移指令JMP;条件转移指令;迭代循环指令;过程调用指令;中断指令。下面介绍无条件转移指令JMP和迭代循环指令LOOP,其余指令将在以后章节讨论。1无条件转移指令JMP指令格式: JMP 目的地址由前面对指令执行过程讨论我们知道,CPU执行指令先要从主存储器读取指令,读取指令过程是根据代码段寄存器CS的值和指令指针IP的值计算指令的物理地址,然后将该地址存放的指令取到CPU内部的指令寄存器。因此,让CPU执行哪条指令,只要将指令所在程序段的段基址装入CS,偏移地址装入IP即可。对于一般指令,一条指令取出后,指令指针IP自动改变为下一条指令的偏移地址。但是对于无条件转移指令,指令本身操作就是强制修改IP的值,有时甚至还要修改代码段寄存器CS的值。这样就改变了原来顺序执行指令的状况。无条件转移指令的助记符号为JMP,但是根据目标地址的不同属性对应的操作是不同的。如果目标地址是同一段内地址,称为段内无条件转移,或段内跳转。段内跳转由于目标地址和转移执行指令在同一段内,所以无条件转移