




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 8086CPU指令系统 1第4章 8086CPU指令系统4.1 操作数的寻址方式操作数的寻址方式4.2 指令系统指令系统第4章 8086CPU指令系统 24.1 操作数的寻址方式操作数的寻址方式4.1.1 8086CPU指令格式指令格式指令由操作码和操作数两部分构成。操作码也称指令码,表示指令要进行的是什么样的操作,而操作数是参加本指令操作的数据。操作数的表现形式比较复杂,可以是参与操作的数值,也可以是参与操作的数值的“地址”。这里的“地址”是广义的,它既包括平常所理解的存储单元的地址,也包括CPU内部的寄存器。指令格式如图4.1所示。图4.1 8086/8088指令格式图第4章 80
2、86CPU指令系统 34.1.2 8086CPU操作数类型操作数类型 指令的操作数及操作的中间结果可以存放在存储器中或CPU的寄存器中,也可以放在外设端口中。其中存放在寄存器中的数据叫做寄存器操作数;存储器可分为代码段、数据段、堆栈段和附加数据段。代码段通常是用来存放指令的,也可以存放一部分特殊的数据,这部分数据存放在代码段作为指令的一部分,在取指令时,这部分数据与指令一起被取出,不需要单独读取,直接就可以参加指令的操作,这一部分数据通常称为立即数;存放在存储器的数据段、堆栈段和附加数据段中的数据统称为存储器操作数;存放在外设端口中的数据称为端口操作数,CPU使用专用的IN、OUT指令来对端口
3、进行访问。第4章 8086CPU指令系统 4 4.1.3 8086/8088CPU的指令格式的指令格式 8086/8088CPU机器指令格式从一个字节到六个字节不等,主要格式有以下6种:(1)单字节指令,隐含操作数;(2)单字节指令,包含REG操作数;(3)双字节指令;(6)带立即数和位移量的指令(立即数送内存单元) (4)带位移量的指令(寄存器与内存单元之间)(5)带立即数的指令(立即数送寄存器);第4章 8086CPU指令系统 54.1.4 操作数的寻址方式操作数的寻址方式 在指令中,指定操作数或操作数存放位置的方法称为寻址方式。 8086/8088CPU指令系统的操作数的来源有以下4种:
4、立即数、寄存器操作数、存储器操作数、端口操作数。 微机系统中除端口操作数外,有七种基本的操作数寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式,后五种寻址方式是确定存储器操作数有效地址的计算方法。第4章 8086CPU指令系统 6 1. 立即寻址方式(立即寻址方式(Immediate Addressing) 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 立即数可以是8位或16位的,是指令的一部分。立即数总是紧跟在指令操作码之后并和操作码一起存放在代码段中
5、,因而立即数总是和操作码一起被放入总线接口部件BIU中的指令流队列中,在指令执行时不需再到存储器存取该数据。 如:MOV AL,34H第4章 8086CPU指令系统 72. 寄存器寻址(寄存器寻址(Register Addressing) 寄存器寻址是指操作数存放在指令规定的寄存器中寄存器寻址是指操作数存放在指令规定的寄存器中,其中:存放操作数的寄存器可以是16位的通用寄存器AX、BX、CX、DX、SP、BP、DI、SI;8位的寄存器AH、BH、CH、DH、AL、BL、CL、DL;4个16位段寄存器CS、DS、ES、SS。其中SS、DS、ES既可以作为源操作数,也可以作为目的操作数,作为目的操
6、作数时,源操作数不能是立即数,CS只能作为源操作数。第4章 8086CPU指令系统 8 在存储器操作数的五种寻址方式中,数据都存放于存储单元中,在指令操作过程中需要BIU通过一个总线周期的访问,才能获得操作数。因此,存储器操作数的寻址方式是怎么根据给出的操作数地址因子,计算出操作数的有效地址操作数的有效地址EA(Effective Address)。有效地址EA是以下三个地址因子的组合,由CPU的执行单元EU计算出来。第4章 8086CPU指令系统 9(1)位移量因子(Displacement):位移量是指令中直接给出的一个8位或者16位数;(2)基址量因子(Base):由基址寄存器BX或者B
7、P提供的内容;(3)变址量因子(Index):由变址寄存器SI或者DI提供的内容。 EA=基址变址位移量基址变址位移量第4章 8086CPU指令系统 103. 直接寻址直接寻址(Direct Addressing) 在指令格式中直接给出存储器操作数的有效地址在指令格式中直接给出存储器操作数的有效地址,EA=位移量。MOV AX,2000H指令操作示意图如图4.4所示。第4章 8086CPU指令系统 11图4.4 直接寻址示意图第4章 8086CPU指令系统 12 MOV AX,2000H MOV AX,2000H 第一条指令表示将2000H送到AX;第二条指令表示将内存有效地址2000H开始的
8、一个字单元内容送到AX中。在指令中如果没有说明操作数所在的段地址,则默认为数据段,即DS提供段地址与有效地址相加生成该操作数的物理地址。不管是字节数据、字数据还是双字数据都用第一个字节地址(即首地址)来表示存储器操作数的地址。第4章 8086CPU指令系统 134. 寄存器间接寻址(寄存器间接寻址(Register Indirect Addressing) 操作数的有效地址操作数的有效地址EA存放在基址寄存器存放在基址寄存器(BX或或BP)或变址或变址寄存器寄存器(DI或或SI)中中,即: EA=BX/BP/SI/DI MOV AX,BX指令操作示意图如图4.5所示。 在8088指令系统中允许
9、使用间接寻址的寄存器有BX、SI、DI和BP,使用BP时,默认的段地址在SS中;使用BX,SI,DI时,默认的段地址在DS中。第4章 8086CPU指令系统 14图4.5 寄存器间接寻址示意图第4章 8086CPU指令系统 155. 寄存器相对寻址(寄存器相对寻址(Register Relative Addressing) 操作数的有效地址EA 是8位或16位的位移量(DISP8/16)与基址寄存器BX或基址指示器BP或某个变址寄存器(DI或SI)之和,即 EA=(BX或或BP或或SI或或DI)+DISP8/16。 MOV AX,BX+10H指令操作示意图如图4.6所示。 第4章 8086CP
10、U指令系统 16图4.6 寄存器相对寻址示意图第4章 8086CPU指令系统 176. 基址加变址寻址(基址加变址寻址(Base-plus-Index Addressing) 有效地址EA是基址寄存器BX(或基址指示器BP)的内容与变址寄存器(DI或SI)的内容之和。EA=(BX/BP)+(SI/DI),取一个基址因子和一个变址因子。例如MOV AX,BX+SI指令操作示意图如图4.7所示。第4章 8086CPU指令系统 18图4.7 基址加变址寻址示意图第4章 8086CPU指令系统 19 7. 相对的基址加变址寻址(相对的基址加变址寻址(Base Relative -plus-Index
11、Addressing) 操作数的有效地址是一个操作数的有效地址是一个8位或位或16位的位移量和一个基址与位的位移量和一个基址与变址之和构成变址之和构成。即EA=(BX/BP)+(SI/DI)+ DISP8/16,取一个基址因子、一个变址因子和一个位移量因子。 例如MOV AX,BX+SI+10H指令操作示意图如图4.8所示。 第4章 8086CPU指令系统 20图4.8 相对基址加变址寻址示意图第4章 8086CPU指令系统 21 8端口的编址(端口的编址(Port Addressing) Intel系列CPU有专用的I/O指令IN和OUT,对外设的访问都是通过这两条指令来实现的,对字节访问可
12、以用如下形式来实现: IN AL,PORT OUT PORT,AL 对字访问可以用如下形式来实现: IN AX,PORT OUT PORT,AX第4章 8086CPU指令系统 22对20H端口的访问格式:IN AL,20HOUT 20H,AL这种格式叫做端口的直接寻址。对200H端口的访问格式:MOV DX,200HIN AL,DXOUT DX,AL这种格式叫做端口的间接寻址。第4章 8086CPU指令系统 23 80868088的指令系统,按照其功能可以分为以下六个功能组:1数据传送(Data Transfer) 2算术运算(Arithmetic) 3逻辑运算(Logic) 4串操作(Str
13、ing Manipulation) 5程序控制(Program Control) 6处理器控制(Processor Control)4.2 指令系统指令系统第4章 8086CPU指令系统 24 根据不同指令的操作特点,不同指令操作数的数量也不相同,主要有以下三种格式:(1)无操作数指令;(2)单操作数指令;(3)双操作数指令。 在双操作数指令中需要指定两个操作数,一个操作数是源操作数,简称为SRC。另外一个操作数是目的操作数,简称为DEST。第4章 8086CPU指令系统 25 4.2.1 数据传送指令数据传送指令1. 通用数据传送指令 (1) 传送指令传送指令MOV(Move):MOV DE
14、ST,SRC 指令功能:DESTSRC,将源操作数送入指定目的操作数。 该指令不影响标志寄存器状态标志位。其中,SRC:寄存器操作数、存储器操作数、立即数;DEST:寄存器(CS除外)操作数、存储器操作数。 MOV指令中要求SRC和DEST必须类型一致(Byte或者Word数据);两个操作数不能都是存储器操作数;源操作数是立即数时,目的操作数不能是段寄存器。第4章 8086CPU指令系统 26图4.9 数据传送方向示意图第4章 8086CPU指令系统 27 MOV SI,2000H MOV AL,BL MOV BL,20 以下几条指令是错误的: MOV 52,AH MOV CS,AX MOV
15、1000,SI第4章 8086CPU指令系统 28(2)交换指令XCHG(Exchange): XCHG DEST,SRC 指令功能:将DEST操作数与SRC操作数的内容相互交换; 该指令不影响标志寄存器状态标志位;两操作数可以是通用寄存器操作数或者一个存储器操作数和一个寄存器操作数,两操作数不能都是存储器操作数。两操作数类型必须一致。 例:XCHG AX,BX第4章 8086CPU指令系统 29(3)压栈指令PUSH:PUSH SRC 指令功能:SPSP-2,SPSRC,将堆栈的栈顶指针上移两个字节,然后将源操作数压入堆栈。 该指令不影响标志寄存器状态标志位;操作数只能是寄存器或存储单元的1
16、6位字操作数据。 例如,PUSH AX指令执行流程如图4.11所示。第4章 8086CPU指令系统 30图4.11 PUSH AX指令执行过程第4章 8086CPU指令系统 31(4)弹栈指令)弹栈指令POP:POP DEST 指令功能:DESTSP,SPSP+2,将栈顶内容弹到目的操作数中,然后堆栈的栈顶指针下移两个字节。 该指令不影响标志寄存器状态标志位;操作数只能是寄存器(CS除外)或存储单元的16位字操作数据。 例如POP DX指令执行过程如图4.12所示。第4章 8086CPU指令系统 32图4.12 POP DX指令执行过程80020H80022H第4章 8086CPU指令系统 3
17、3A DW 1234H B DW 5678H : PUSH A PUSH B POP A POP B 试回答:上述程序段执行后(A),(B) 设执行前SP2000H,执行后SP 第4章 8086CPU指令系统 34(5)查表指令XLAT(Translate):XLAT 指令功能:ALDS:BX+AL。把数据段中的偏移地址为把数据段中的偏移地址为BXBX和和ALAL之和的存储单元内容送给之和的存储单元内容送给ALAL。有两个隐含操作数BX和AL,示意图如图4.13所示。 该指令不影响标志寄存器状态标志位;该指令用于查询表,使用该指令时,应首先在数据段建立一个长度小于256字节的表格,表的首地址置
18、于BX中,再将相对于表格首地址的位移量存入AL中。第4章 8086CPU指令系统 35图4.13 XLAT指令执行示意图第4章 8086CPU指令系统 36 2. 地址传送指令地址传送指令 地址传送指令包括3条指令:(1)取有效地址指令LEA;(2)将地址指针装入DS和指定的寄存器指令LDS;(3)将地址指针装入ES和指定的寄存器指令LES。 (1)取有效地址指令)取有效地址指令LEA(Load EA): LEA REG,MEM 指令功能:将源操作数的有效地址送指定的寄存器。 该指令不影响标志寄存器状态标志位;目的操作数是16位寄存器,源操作数是存储器操作数。例 LEA BX,DI第4章 80
19、86CPU指令系统 37图4.14 LEA BX,DI指令执行过程第4章 8086CPU指令系统 38 (2)取地址指针指令)取地址指针指令LDS(Load DS) REG,MEM 指令功能:将源操作数的有效地址所对应的双字存储单元数据的高字内容送入DS,低字内容送入指令指定的寄存器。指令不影响标志寄存器状态标志位。 例:设某双字存储单元偏移地址为3000H,双字数据为12345678H,则 LDS BX,3000H 表示将3000H和3001H单元内容送入BX,将3002H和3003H单元内容送入DS,该指令执行后(DS)=1234H,(BX)=5678H。第4章 8086CPU指令系统 3
20、9图4.15 LDS BX,DI指令执行示意图第4章 8086CPU指令系统 40(3)LES REG,MEM 指令功能:将源操作数的有效地址所对应的双字存储单元数据的高字内容送入ES,低字内容送入指令指定的寄存器。操作特点与LDS相同。 LES DI,3000H ;表示将3000H和3001H单元内容送入DI, 将3002H和3003H单元内容送入ES。第4章 8086CPU指令系统 41 3. 标志传送指令标志传送指令 CPU标志寄存器FR(Flags Register)每一位标志了CPU运行的某种状态。标志传送指令共有4条如下:(1)LAHF(Load AH from Flag(Low)
21、指令:标志寄存器低8位送AH;(2)SAHF (Store AH to Flag(Low)指令:AH送标志寄存器低8位; 这两条指令的目的是保护标志寄存器的低8位。第4章 8086CPU指令系统 42(3)标志寄存器内容压栈指令PUSHF(Push Flag):将标志寄存器内容压入栈顶; (4)栈顶内容送标志寄存器指令POPF(Pop Flag):将栈顶内容送标志寄存器。要改变TF标志的值可以用下面的程序段实现:PUSHF;将标志寄存器的内容压栈POPAX;通过堆栈送至AX中ORAH,01H;间接TF位置“1”PUSH AX;修改后的内容压入堆栈POPF;通过堆栈将修改后内容送回标志寄存器第4
22、章 8086CPU指令系统 434. 符号位扩展指令符号位扩展指令 CBW指令(将字节扩展成字的指令)是将AL寄存器中字节数据的符号位扩展到AH中; CWD指令(将字扩展成双字的指令)是将AX寄存器中字数据的符号位扩展到DX中。指令的执行不影响任何标志位。 例如:(AX)=1000H,则执行CWD指令之后,将字数据扩展成双字数据,(DX):(AX)=0000:1000H;如果(AL)=A0H,则执行CBW指令之后,将字节数据扩展成字数据,(AX)=FFA0H。第4章 8086CPU指令系统 44 1. 二进制数据的加法指令二进制数据的加法指令(1)ADD DEST,SRC(不带进位位的加法指令
23、) 指令用于带符号或者无符号数据的字节或字数据的加法运算。实现目的操作数加源操作数,结果存放于目的操作数中。指令的结果影响AF、CF、PF、OF、ZF、SF所有的状态标志位。 两操作数必须类型一致;两操作数不能同时为存储器操作数 如:ADD AL,50H ADD CX,DI ADD BX,AL4.2.2 算术运算类指令算术运算类指令第4章 8086CPU指令系统 45(2)ADC DEST,SRC (带进位位的加法指令) 该指令主要用来实现两个多字节数据相加。该指令实现的是目的操作数加上源操作数再加上CF位,以实现低位数据相加时产生的进位。其余同ADD指令。例:MOV AX, 9886H;(A
24、X)=9886HMOV BX, 6890H ;(BX)=6890HADD AL, BL ; CF=1ADC AH, BH ;CF=1 ADC指令实现了AH和BH内容相加,同时加上了上一条指令对标志位的影响,CF=1相当于低位的进位。第4章 8086CPU指令系统 46(3)INC DEST 该指令实现了目的操作数在自身的基础上加1。指令执行后影响OF、SF、ZF、AF、PF,不影响CF。操作数可以是8位/16位通用寄存器或存储器。INC BLINC SP第4章 8086CPU指令系统 472. 二进制数据的减法指令二进制数据的减法指令(1)SUB DEST,SRC (不考虑借位的减法指令)该指
25、令用于带符号或者无符号数据的字节或字数据的减法运算。实现目的操作数减去源操作数,结果存放于目的操作数中。其余同ADD指令。第4章 8086CPU指令系统 48(2)SBB DEST,SRC(考虑借位的减法指令)(考虑借位的减法指令) 该指令主要用来实现两个多字节数据相减。该指令实现的是目的操作数减去源操作数再减去CF位,其余同SUB指令。例: MOV AX,9886H;(AX)=9886HMOV BX,6890H ;(BX)=6890HSUB AL, BL ;CF=1SBB AH, BH;CF=0第4章 8086CPU指令系统 49(3)DEC DEST 该指令实现了目的操作数在自身的基础上减
26、1。指令执行后影响OF、SF、ZF、AF、PF,不影响CF。操作数可以是8位/16位通用寄存器或存储器操作数。(4)求补指令)求补指令 NEG NEG DEST 对负数求补得到其绝对值;对正数求补得到和其绝对值相等的负数的补码。 指令的执行影响AF、CF、PF、OF、ZF和SF; 操作数可以是8位/16位通用寄存器或存储器操作数。第4章 8086CPU指令系统 50(5)比较指令)比较指令CMP:CMP DEST,SRC 只执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位。 CMP AX,1000H ;表示将AX内容和1000H比较,结果不保留,影响标志位。 CMP AX,BX+
27、DI+100H ;表示将AX的内容和存储单元BX+DI+100H的内容相比较,结果不保留,影响标志位。第4章 8086CPU指令系统 51 3. 乘法指令乘法指令(1)MUL SRC; 无符号数乘法指令无符号数乘法指令 指令中如果源操作数为字节数据,则实现AL内容与SRC指定的操作数相乘,结果存放于AX中;如果源操作数为字数据,则实现AX内容与SRC指定的操作数相乘,结果存放于DX(高16位)和AX(低16位)中。操作数可以是通用寄存器、存储器,不能是立即数。 对标志位的影响:若乘法结果的高半部分为0,则OF=0、CF=0;否则OF=1、CF=1 。第4章 8086CPU指令系统 52(2)I
28、MUL SRC; 带符号数乘法指令带符号数乘法指令 指令功能:除参加运算的数据为有符号数据外,其它操作同MUL指令。 对标志位的影响:若乘法结果AH或DX包含有效值,则OF=1、CF=1;若乘法结果AH或DX只是低半部分的符号扩展,则OF=0、CF=0 。 例:IMUL BL;第4章 8086CPU指令系统 534. 除法指令除法指令 8086/8088CPU指令系统中的除法运算,目的操作数(被除数)都是隐含的, 如果是字节除法运算则隐含在AX累加器中,其运算结果是两个8位的商和余数,商存放在AL中,余数存放于AH中; 如果是字除法运算则隐含在DX(高16位)和AX(低16位)中,其运算结果是
29、两个16位的商和余数,商存放在AX中,余数存放于DX寄存器中。 第4章 8086CPU指令系统 54(1)DIV SRC; 无符号除法指令无符号除法指令 除法运算的操作数可以是通用寄存器操作数、存储器操作数,不能是立即数。若商超过AL(字节除)或AX(字除)所能存放的最大值(FFH或FFFFH)时,系统会自动产生0类中断,且商和余数都不确定。 该指令对标志位的影响不确定,不考虑标志位的变化。 例DIV BX;第4章 8086CPU指令系统 55(2)IDIV SRC; 带符号数除法指令带符号数除法指令 在有符号数的除法指令中,需强调的是余数的符号必须和被除数的符号相同。 当商超过AL或AX所能
30、存放的最大值+127(字节除法)或+32767(字除法),以及所能存放的最小值-127(字节除法)或-32767(字除法)时,系统会自动产生0类中断。 除法运算注意:规定除数必须为被除数的一半字长,当被除法运算注意:规定除数必须为被除数的一半字长,当被除数只有除数只有8 8位或位或1616位时,必须用扩展指令先对被除数进行扩展,位时,必须用扩展指令先对被除数进行扩展,再进行除法运算。再进行除法运算。第4章 8086CPU指令系统 56 5. BCD码的调整指令(码的调整指令(Binary Code Decimal) 在计算机中人们用BCD码表示十进制数,BCD码在计算机中有两种表示方法:一类为
31、压缩BCD码,即每个字节表示两位BCD数;另一类称为非压缩BCD码,即用一个字节表示一位BCD数,该字节的高四位无效。例如,十进制数25D,表示为压缩BCD数时为:25H;表示为非压缩BCD数时为:0205H,用两字节表示。加法、减法、乘法的BCD码运算结果要求调整结果,除法运算要求先调整被除数,然后用乘法运算的调整指令调整结果。相关的BCD转换指令见表4-4所示。第4章 8086CPU指令系统 57指令格式指令格式指令说明指令说明DAA压缩的BCD码加法调整DAS压缩的BCD码减法调整AAA非压缩的BCD码加法调整AAS非压缩的BCD码减法调整AAM乘法后的BCD码调整AAD除法前的BCD码
32、调整表4-4 十进制调整指令第4章 8086CPU指令系统 58 在表4-4中的六条指令,第一个字母表示码制,压缩BCD码用Decimal的第一个字母“D”表示;非压缩BCD码用ASCII的第一个字母“A”表示。第二个字母是Adjust(调整)的第一个字母“A”。最后一个字母表示运算,加法(ADD)、减法(SUB)、乘法(MUL)、除法(DIV)都是取了第一个字母。 下面就以压缩BCD码的加法为例,介绍调整的原理:第4章 8086CPU指令系统 5924H+53H结果为77H,其格式如下:MOV AL, 24HADD AL, 53HDAA因为在本次运算中既没有出现辅助进位也没有出现非法码制,所
33、以本次运算中DAA自动的给结果加00H调整。本次调整结果不变 第4章 8086CPU指令系统 60 28H+53H结果为7BH,其格式如下:MOV AL, 28HADD AL, 53HDAA因为在本次运算中出现非法码制,在本次运算中DAA自动的给结果在出现非法码制的位置加6调整,这样本次运算会自动加06H来调整结果。本次调整结果为81。第4章 8086CPU指令系统 61 91H+85H结果为116H,其格式如下:MOV AL, 91HADD AL, 85HDAA因为在本次运算中出现进位,在本次运算中DAA自动的给结果在出现进位的位置加6调整,这样本次运算会自动加60H来调整结果。本次调整结果
34、为176。第4章 8086CPU指令系统 62 45H+57H结果为9CH,其格式如下:MOV AL, 45HADD AL, 57HDAA因为在本次运算中出现非法码制,在本次运算中DAA自动的给结果在出现非法码制的位置加6调整,调整过程中又在高位又出现非法码制,需要继续进行调整,这样本次运算会自动加66H来调整结果。第4章 8086CPU指令系统 63 4.2.3逻辑运算和移位指令逻辑运算和移位指令 1逻辑运算指令 逻辑运算指令包括AND与操作、OR或操作、NOT非操作、XOR异或操作和TEST测试操作指令。所有的指令都对其操作数按位进行逻辑操作。操作数可以是字节或字数据。目的操作数不能是立即
35、数;当有两个操作数时,不能都是存储器操作数。无论是目的操作数还是源操作数都不能是段寄存器操作数。第4章 8086CPU指令系统 64(1)非指令:)非指令:NOT OPRD功能:对操作数按位求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。 例如:AL=53H,执行“NOT AL”后,AL=?。(2)与指令:)与指令:AND DEST,SCR功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。结果影响CF、PF、ZF、SF、OF标志位。 例如:AND AL,0FH;屏蔽AL寄存器的高4位,低4位保持不变。第4章 8086CPU指令系统 65(3)或指令:)或指
36、令:OR DEST,SCR功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。例如:OR AL,0FH;保持AL寄存器的高4位不变,低4位置1(4)异或指令:)异或指令:XOR DEST,SCR功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。例如:XOR AL,AL ;使AL清0 XOR SI,SI ;使SI清0 XOR CL,0FH ;使低4位取反,高4位不变第4章 8086CPU指令系统 66(5)测试指令:)测试指令:TEST DEST,SCR 功能:完成与AND指令相同的操作,结果反映在标志位上,但并不送回目的操作数。通常使用该指令进行测试。例如:若要检测 A
37、L中的最低位是否为1,为1则转移,可用以下指令实现:TEST AL, 01HJNZ STARSTAR: 逻辑运算类指令中对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。第4章 8086CPU指令系统 672移位指令移位指令(1)算术移位指令)算术移位指令 SAL/SAR DEST,CNT; 算术移位指令适合于有符号数据的移位,CNT由移位的位数决定,可以是1或CL。左移一位相当于数据乘2,右移一位相当于除以2。指令执行后影响CF、PF、ZF、SF、OF标志位。 例如BX和DX内容是有符号数据,要将BX内容变成8*BX
38、,DX内容变成2*DX,则可以用如下指令来实现:MOV CL,3SAL BX,CL ;8*BXSAL DX,1 ;2*DX第4章 8086CPU指令系统 68(2)逻辑移位指令)逻辑移位指令 SHL/SHR DEST,CNT; 逻辑移位指令适合于无符号数据的移位,左移一位相当于数据乘2,右移一位相当于除以2。 指令执行后影响CF、PF、ZF、SF、OF标志位。 算术移位针对有符号数据,逻辑移位针对无符号数据。其移位特点如图4.22所示。第4章 8086CPU指令系统 69图4.22 移位指令的执行特点第4章 8086CPU指令系统 70(3)循环移位指令)循环移位指令ROL DEST,CNT
39、;左循环移位 ROR DEST,CNT ;右循环移位 RCL DEST,CNT ;带进位左循环移位RCR DEST,CNT ;带进位右循环移位前两条循环指令,未把标志位CF包含在循环的环中,后两条把标志位CF包含在循环的环中,作为整个循环的一部分。其格式如图4.23所示。第4章 8086CPU指令系统 71图4.23 循环移位指令的执行特点CFROL 操作数(a)(b)(c)CFROR 操作数RCL 操作数CF(d)RCR 操作数CF第4章 8086CPU指令系统 724.2.4 串操作指令串操作指令 串操作指令指的是用一条指令实现对一串字符或数据的操作。 串操作指令的基本格式如下: (重复前
40、缀)(重复前缀) 串操作码串操作码 DEST(目的操作数),(目的操作数),SRC(源操作数)(源操作数)1.串操作基础知识串操作基础知识: (1)8086/8088指令系统中只有字节串和字串两种串; (2)在所有的串操作指令中,一定要确定指令的串是源串还是目的串,如果指令中有两个串,那肯定一个源串一个目的串;如果只有一个串也需要确定是源串还是目的串,另外一个操作数是累加器(字节串为AL,字串为AX);第4章 8086CPU指令系统 73(3)在所有串操作指令中,SI用于寻址源操作数,提供源串操作数的有效地址,源操作数存于数据段,由DS提供段地址,即源串的地址为(DS)*10H+(SI);DI
41、用于寻址目的操作数,提供目的串操作数的有效地址,目的操作数存放于附加数据段,由ES提供段地址,即源串的地址为(ES)*10H (DI);(4)每执行一次串操作指令后,SI和DI的内容被自动修改,且根据方向标志位DF的值减量或增量。若DF=1,SI、DI减量(字节操作减1,字操作减2);若DF=0,SI、DI增量(字节操作加1,字操作加2)。 (5)串操作的重复次数由计数器CX的内容决定。第4章 8086CPU指令系统 74指令在操作之前必须做好以下初始化工作:把存放于数据段中的源数据串的首地址(如反向传送则应是末地址)存入SI。把将要存放于附加段中的目的数据串的首地址(如反向传送则应是末地址)
42、存入DI。把数据串长度存入CX。设置方向标志位DF的值(CLD指令使DF=0,STD指令使DF=1)。第4章 8086CPU指令系统 752.串操作指令重复前缀串操作指令重复前缀 串操作指令在执行时,其本身没有重复功能。要想指令重复执行,必须在指令前加上一条重复操作前缀。这样就实现了串操作。重复操作前缀有下列三种形式:无条件重复前缀REP;相等重复前缀REPE/REPZ;不相等重复前缀REPNE/REPNZ。它们通常的格式和作用如下:第4章 8086CPU指令系统 76(1)无条件重复前缀REP指令格式:REP MOVS/LODS/STOS 执行的重复操作:如果(CX)=0,则退出重复操作循环
43、;如果(CX)0,则执行指定的串操作一次,(CX)(CX)-1且自动修改SI和DI中的偏移地址; (2)相等重复前缀REPE/REPZ指令格式:REPE/REPZ SCAS/CMPS 执行的重复操作:如果(CX)0,且ZF=1,则执行指定的串操作一次,(CX)(CX)-1且自动修改SI和DI中的偏移地址;如果(CX)=0,或ZF=0(结果不为零,即不相等),则退出重复操作循环.第4章 8086CPU指令系统 77(3)不相等重复前缀REPNE/REPNZ指令格式:REPNE/REPNZ SCAS/CMPS 执行的重复操作:如果(CX)0,且ZF=0,则执行指定的串操作一次,(CX)(CX)-1
44、且自动修改SI和DI中的偏移地址;如果(CX)=0或ZF=1(结果为零,即相等),则退出重复操作循环。第4章 8086CPU指令系统 78 3.串操作指令串操作指令(1)串传送指令MOVS指令格式: MOVSB/MOVSW执行操作:把一个字节或一个字数据由源串传送到目的串。执行完一次操作,根据DF值修改SI和DI中的内容,使之指向下一个字符串元素。指令的执行结果不影响标志位。例如:MOV SI,OFFSET SOURCE;源串MOV DI,OFFSET DESTINATION;目的串MOV CX,100;CX传送次数CLD;置DF=0,地址增加AGAIN: MOVSB;传送一个字节DEC CX
45、;传送次数减1JNZ AGAIN;判断传送次数CX是否为0第4章 8086CPU指令系统 79 如果使用重复前缀REP,则程序可以修改为:MOV SI,OFFSET SOURCE;源串MOV DI,OFFSET DESTINATION;目的串MOV CX,100;CX传送次数CLD;置DF=0,地址增加REP MOVSB;重复传送直至结束第4章 8086CPU指令系统 80(2)串的提取指令LODS指令格式:LODSB/LODSWLODS指令把由SI寻址的源串元素装入到寄存器AL/AX中。并修改SI,使之指向下一个字符串元素。这条指令通常不加重复前缀,否则结果只能存放操作的最后一次结果。指令的
46、执行结果不影响标志位。第4章 8086CPU指令系统 81(3)串的填装指令STOS指令格式:STOSB/STOSW执行的操作:STOS指令把寄存器AL/AX中的内容送至由DI寻址的目的串中。并修改DI,使之指向下一个字符串元素。如果在本指令之前加上重复前缀REP,用STOSB/STOSW指令可使一串内存单元填装相同的数据。指令的执行结果不影响标志位。例,假设BLOCK开始长度为COUNT的字节串,要求将其中的正数放到DPLUS开始的缓冲区,负数放到DMINUS开始的缓冲区。第4章 8086CPU指令系统 82MOV SI,OFFSET BLOCKMOV DI,OFFSET DPLUSMOV
47、BX,OFFSET DMINUSMOV AX,DSMOV ES,AX;数据都在一个段中,所以设置ES=DSMOV CX,COUNT;CX字节数CLDGO_ON: LODSB;从BLOCK取出一个数据TEST AL,80H;检测符号位,判断是正是负JNZ MINUS;符号位为1,是负数,转向MIN 第4章 8086CPU指令系统 83 STOSB;符号位为0,是正数,存入DPLUSJMP AGAIN ;程序转移到AGAIN处继续执行MINUS: XCHG BX,DISTOSB;把负数存入DMINUSXCHG BX,DIAGAIN: LOOP GO_ON;字节数减1第4章 8086CPU指令系统
48、84(4)串比较指令CMPS 指令格式:CMPSB/CMPSW 执行的操作:指令用源串操作数减去目的串操作数内容,结果不回送到目的操作数。本条指令与REPE/REPNE相联合可实现两个数据串的比较。指令的执行结果影响AF、CF、OF、PF、SF和ZF所有的标志位,以反映串元素之间的关系。 例如 对STRING1和STRING2缓冲区的两个长度为COUNT的字节串进行比较。如果有不同字符,RESULT为FFH;否则,RESULT为00H。第4章 8086CPU指令系统 85MOV SI,OFFSET STRING1MOV DI,OFFSET STRING2MOV CX,COUNTCLDMOV A
49、L,0FFH;标记初始为不同AGAIN:CMPSB;比较两个串对应的字符JNZ OUTPUT;有不同字符,转移DEC CXJNZ AGAIN;进行下一个字符比较MOV AL,0;字符串相等,设置00HOUTPUT:MOV RESULT,AL;输出结果标记第4章 8086CPU指令系统 86(5)串的扫描指令SCAS 指令格式:SCASB/SCASW 执行的操作:指令用AL/AX寄存器的内容与DI指向的串元素进行比较,利用结果对标志位的影响,来反映串元素与AL/AX寄存器内容之间的关系。指令的执行结果影响AF、CF、OF、PF、SF和ZF所有的标志位。本指令与REPE/REPNE相联合可实现从一
50、个字符串中查找一个指定的字符的功能。 例 假设有一起始地址为BUFFER,长度为100个字节的存储区,现要对这一存储区进行测试,看其中是否有内容为XXH的存储单元。第4章 8086CPU指令系统 87MOV DI, OFFSET BUFFER CLD MOV CX, 100MOV AL, XXHREPNE SCASBJZ FOUNDFOUND:第4章 8086CPU指令系统 884.2.5 程序控制指令程序控制指令 转移类指令可以间接改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。如果仅通过改变IP的值而改变了指令的执行顺序,这种方式叫做段内转移;如果同时改变了CS与IP的值而改变了
51、指令的执行顺序,这种方式叫做段间转移。第4章 8086CPU指令系统 89 1无条件转移无条件转移 无条件转移指令JMP分为段内转移和段间转移两种。 一般格式: JMP OPRD;OPRD是转移的目的地址。 (1)段内转移。段内转移实质是间接修改IP的内容,以达到程序运行转移的目的,转移形式有3种: 段内短程转移: JMP DISP8;IP=IP+8位位移量 目的地址与JMP指令所处地址的距离应在-128127范围之内。第4章 8086CPU指令系统 90段内近程直接转移: JMP DISP16;IP=IP+16位位移量 目的地址与JMP指令所处地址的距离应在-3276832767范围之内。
52、段内近程间接转移: JMP REG/MEM;IP的内容由寄存器或存储单元内容提供 目的地址与JMP指令所处地址的距离应在-3276832767范围之内。如:JMP AX第4章 8086CPU指令系统 91(2)段间转移。段间转移的目的地址与JMP指令所在地址不在同一段内。段间转移实质是同时间接修改CS和IP的内容,以达到程序运行转移的目的,其主要的转移形式为2种: 段间直接转移: JMP ADDR; 此指令的转移地址作为指令格式的一部分,由指令码的第2、3字节的内容送IP程序计数器;指令码的第4、5字节的内容送CS代码段寄存器。如:JMP 2500H:1000H 段间间接转移: JMP MEM
53、 该指令通过存储器间接寻址,根据寻址方式寻址存储器中的双字数据,指定的双字节的低字单元内容送IP,高字单元内容送CS。第4章 8086CPU指令系统 922. 调用和返回指令调用和返回指令 CALL指令用来调用一个过程或子程序。由于过程或子程序有段间(FAR)和段内(NEAR)调用之分,所以CALL指令也有FAR和NEAR之分。因此RET也分段间与段内返回两种。 调用指令一般格式为: (1)段内调用: CALL NEAR PTR OPRD; 执行的操作:SP=SP-2,将程序断点(IP内容)压入堆栈,同时修改IP内容以实现程序转移。当执行RET指令而返回时,从栈顶弹出一个字放入IP中,以实现程
54、序调用的返回。第4章 8086CPU指令系统 93(2)段间调用:CALL FAR PTR OPRD; 执行的操作:SP=SP-2,将程序断点中的CS内容压入堆栈,SP=SP-2,将程序断点中的IP内容压入堆栈,同时修改CS和IP内容以实现程序转移。当执行RET指令而返回时,从栈顶弹出一个字(偏移地址)放入IP中,然后从堆栈中再弹出第二个字(段地址)放入CS中,作为段间返回地址以实现程序调用的返回。 返回指令格式有: RET:正常弹出断点。 RET n:正常弹出断点后,再从堆栈中弹出n个字节的数据,RET n指令要求n为偶数,当RET正常返回后,再做SP=SP+n操作。第4章 8086CPU指令系统 943条件转移指令条件转移指令 8086/8088指令系统中有19条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贷款公司借款合同模板
- 2025 年农业基础设施建设项目合同书
- 有了爱就有了一切爱的作文(13篇)
- 企业园区智能物业服务协议
- 人才招聘表-公司类型一
- 红楼梦第32回课件
- 红楼梦填空课件
- 诗歌的演变历程
- 2025年互联网广告精准投放算法在智能安防行业的应用效果研究报告
- 2025征兵政策试题及答案
- 通信工程用电登高等高风险作业施工安全操作
- 邮政储汇业务员高级技师理论知识试卷
- 四川雅安市人力资源和社会保障局招考聘用编外工作人员【共500题附答案解析】模拟检测试卷
- 护理服务规范整改措施(共15篇)
- 幼儿园教育活动设计与实践 张琳主编 PPT
- 建筑施工过程中成品保护施工方案
- 西师版三年级上册数学全册教案(完整)
- 整理版第三届宁波国际海报双年展2004获奖作品选
- 关键过程(工序)和特殊过程(工序)管理办法
- 武术校本课程武术基本功
- 机械制造及自动化专业讲座
评论
0/150
提交评论