1、第 三 章 8086/8088 指 令 系 统 1.1 8086/8088寻址方式 1.2 8086/8088指令系统,指令及指令集 计算机能够识别和执行的基本操作命令,指令的作用,告诉CPU干什么?What? 告诉CPU从哪儿取数据?Where? 告诉CPU下一条指令在哪儿?Where?,指令的格式,10111011 00110100 00010010,指令的数量,数值计算 信息处理 多媒体,指令数量取决于CPU的功能,80X86CPU指令数量,8086:133条 整数运算 输入输出 程序控制 扩充: 多媒体指令浮点运算指令 Cache处理指令,指令系统(CISC复杂与 RISC精简),指令
2、数量影响:,程序的执行速度 CPU的复杂程度,指令的通用格式标号:指令助记符 操作数1, 操作数2 ;注释,80X86指令在内存的存放形式,80X86的指令 操作码和操作数由一或多个字节(8位)组成 二进制与助记符(把十六进制数1234送CPU的BX寄存器) 双操作数:操作码 目的操作数,源操作数,低字节在前(34H)高字节在后(12H),指令的助记符格式,标号:指明指令所在地址。 操作码:用来说明该指令所要完成的操作。 操作数1:称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果。 操作数2:常被称为源操作数src,它表示参与指令操作的一个对象。 注释:分
3、号后的内容是对指令的解释。,标号:操作码 操作数1,操作数2 ;注释,操作数类型 按操作数在指令中的所起的作用,可以分为 目的操作数:不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 源操作数:表示参与指令操作的一个对象按操作数的存储位置分,可以分为 立即数。就是在指令中直接给出常数。 寄存器操作数。其书写形式就是寄存器名。 存储器操作数。其书写形式是存储单元的逻辑地址。,指令的操作码和操作数,每种指令的操作码: 用一个助记符表示(指令功能的英文缩写) 对应着机器指令的一个或多个二进制编码 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器
4、地址,3.1 8086/8088 寻址方式,指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址 把寻找操作数的方式叫做(操作数)寻址方式 理解操作数的寻址方式是理解指令功能的前提 操作数采取哪一种寻址方式 一方面,会影响处理器执行指令的速度和效率 另一方面,对程序设计也很重要,MOV指令的功能,3.1.1 立即数寻址方式,指令中的源操作数为常数,称为立即数寻址. 立即数寻址方式常用来给寄存器赋值,多以常量形式出现,MOV AX, 0102H ;AX0102H,例:MOV AX, 1C8FHMOV BYTE PTR2A00H, 8FH错误例: MOV 2A00H, AX ; 错误!
5、,注:立即数不能作目的操作数。以AF打头的数字,前面要加一个0,如 MOV AX,0FF00H,立即数寻址方式,3.1.2 寄存器寻址方式,操作数存放在CPU的内部寄存器中。 源操作数与目的操作数字长要相同 不允许将立即数传送到段寄存器,MOV AX, BX ;AXBX,例: MOV AX, BXMOV CL, AL错误例: MOV AX, BL ; 字长不同,注意:源、目的操作数的长度一致,3.1.3 直接寻址,直接寻址方式的有效地址在指令中直接给出 用中括号包含有效地址,表达存储单元的内容 默认的段地址在DS段寄存器,可使用段超越前缀改变。 偏移地址也可用符号地址来表示,如ADDR、VAR
6、,MOV AX, 2000H ;AXDS:2000H,MOV AX , 2A00HMOV DX , ES: 2A00HMOV ES: 2A00H,DX MOV SI , TABLE_PTR,例 MOV AX,1000H;若 DS=2000H,(21000H)=32H,(21001H)=45H,功能:是将一个有效地址是1000H的存储单元的内容传送到AX。该存储单元的物理地址为:PA=2000H*10H + 1000H =20000H + 1000H = 21000H指令执行结果为:AX = 4532H。,3.1.4 寄存器间接寻址方式,操作数的 偏移地址放在间址寄存器中。 只有SI、DI、BX
7、和BP可作间址寄存器。,1)以SI、DI、BX间址寻址时,操作数在数据段(DS)区域中,即:DX*10H+( SI、DI、BX)中的偏移量=操作数物理地址。2)以BP间址寻址时,操作数在堆栈段(SS)区域中,即:SS*10H+( BP)中的偏移量 =操作数物理地址。,1选择SI、DI、BX作为间址寄存器 操作数在数据段(没有使用段超越时) MOV AX,DI 若已知(DS)=5000H,(DI)=1600H,则操作数的物理地址为:5000H10H+1600H=51600H 执行的结果为(AX)=789AH,2选择BP作为间址寄存器 操作数在堆栈段MOV BP,AX 若已知(SS)=6000H,
8、(BP)=1500H,则操作数的物理地址为:6000H10H+1500H=61500H 若已知(AX)=5566H,则指令的执行结果为:66H送到61500H内存单元,55H送到61501H内存单元,3.1.5 变址寻址 以指定的寄存器内容,加上指令中给出的8位或16位位移量(必须要以一个段寄存器作为基地址),作为操作数的地址。 作为变址寻址的寄存器可以是SI、DI、BX、BP四个寄存器中的任一个. 若用SI、DI和BX作为变址寄存器,操作数在数据段,即段地址在DS寄存器; 若用BP变址,则操作数在堆栈段,即段地址在SS寄存器 例: MOV AX,2000HSI 若(SI)=1200H,(DS
9、)=1500H,则操作数的地址为18200H,MOV AX, SI+06H ;AXDS:SI+06H,MOV AX, 06HSI ;AXDS:SI+06H,3.1.6 基址-变址相对寻址方式 这种寻址方式的有效地址是一个基址寄存器内容和一个变址寄存器内容与由指令中指定的8位或16位偏移量之和。,(1)若用BX作为基地址,则操作数在数据段中。DS10H +BX+ (SI/DI)+(disp8/disp16)(2)若用BP作为基地址,则操作数在堆栈段中。SS10H+BP+(SI/DI)+(disp8/disp16)例 MOV AX,BX+SI+4500H若DS = 3000H,BX = 2000H
10、,SI = 1000H, (37500H)= 56H,(37501H)= 12H,指令执行情况如图所示,执行结果为:AX = 1256H。,基址加变址相对寻址方式也可以表示成几种不同的形式,其中 COUNT为位移量。MOV AX,BX+SI+COUNTMOV AX,COUNT BX SIMOV AX,BX +COUNT SIMOV AX,BX COUNT SIMOV AX,BX+SI COUNTMOV AX,COUNTSI BX注意:上述寻址方式中,除立即寻址和寄存器寻址外,其它寻址方式的操作数都是通过访问存储器取得,对这几种寻址方式的段寄存器的使用情况如下:(1)若不指出段基址,808680
11、88会采用默认的段寄存器。 规则为:偏移量表达式出现BP则使用SS;否则使用DS。(2)可以用“段寄存器名:”的形式指出段基址,此时默认规则不再起作用。如:“MOV AX,DS:BP”中段基址采用DS值,而不是默认的SS的值。在这里将“DS:”称为段超越或段前缀,它超越了默认的访问段。,注意,1.区别立即数寻址和直接寻址MOV AX,126MOV AX,126 2.区别寄存器寻址和寄存器间接寻址MOV AX,BXMOV AX,BX 3.双操作数指令中,不能同为存储器操作数。 4.CS不能为目的寄存器。,3.2 8086/8088指令系统,数据传送(Data transfer)算术运算(Arit
12、hmetic)逻辑运算和移位(Logic)串操作(String manipulation)控制转移(Control transfer)处理器控制(Processor control),1. 通用数据传送指令一般传送指令MOV堆栈操作指令PUSH和POP交换指令XCHG查表转移指令XLAT字位扩展指令,3.2.1 数据传送指令,(1)数据传送指令格式:MOV OPD,OPS 操作: OPD OPS说明:MOV指令将源操作数OPS的内容传送到目的地OPD。指令执行后OPD与OPS的内容相等,即OPD = OPS,源操作数本身不变。, CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指
13、针IP以外)。MOV AL,BL;字节传送MOV CX,BX;字传送MOV DS,BX, 立即数传送至CPU内部的通用寄存器组(即AX、 BX、CX、DX、BP、SP、SI、DI) MOV CL,4 MOV AX,03FFH MOV SI,057BH CPU内部寄存器与存储器之间的数据传送。 MOV AL,2000H MOV AX,SI MOV DI,CX MOV SI,BLOCKBP MOV DS,DATASI+BX MOV DESTBP+DI,ES, 能实现用立即数给存储单元赋值 MOV BYTE PTR 2000H,25H MOV WORD PTR SI,35H 注意: BYTE PTR
14、 指字节单元;WORD PTR指字单元,对于MOV 指令应注意几个问题: MOV传送指令中,不允许对CS和IP进行操作; 两个存储器操作数之间不允许直接进行信息传送;若要将2000H单元的内容,传送至同一段的3000H单元中去,MOV指令不能直接完成这样的传送,必须借助寄存器来完成传送: MOV AL,2000H;MOV 3000H,AL, 两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;(X) MOV DS, 100H; (X) MOV DS, ES; 目的操作数,不能用立即寻址方式。 MOV指令不影响标志位,2.堆栈操作指令。堆栈:按后进先出的原则组织的内存区域即
15、堆栈段。用SS指示段地址。堆栈指针SP总是指向栈顶(最后压入的数的地址)。SP的初值规定了所用堆栈的大小(堆栈的深度),一个栈的深度最大为64kB 。堆栈用途: 临时存放数据、传递参数、保存和恢复寄存器堆栈指令:入栈和出栈,1)入栈指令格式:PUSH OPS 操作:SP SP-2,SP+1 SP OPS操作数类型: OPS可以是存储器、通用寄存器和段寄存器,但不能是立即数。说明:PUSH指令先将SP的内容减2,然后再将操作数OPS的内容送入由SP指出的栈顶即偏移地址为SP和SP+1的两个连续字节中。 例10 PUSH AX ;通用寄存器内容入栈PUSH CS ;段寄存器内容入栈PUSH SI;
16、字存储单元内容入栈,2)出栈指令格式:POP OPD操作:OPD SP+1 SP,SP SP+2操作数类型:OPD可以是存储器、通用寄存器或段寄存器(但不能是CS),同样,不能是立即数。说明:POP指令先将堆栈指针SP所指示的栈顶存储单元的值弹出到操作数OPD中,然后再将SP的内容加2。入栈和出栈操作如图所示。,例: POP AX ;栈顶内容弹出至通用寄存器 POP ES ;栈顶内容弹出段寄存器 POP MEMDI;栈顶内容弹出至字存储单元,(3)数据交换指令格式:XCHG OPD,OPS 操作:OPD OPS操作数类型:可以是寄存器或存储器,但不能二者同时为存储器。说明:XCHG指令将两个操
17、作数内容进行交换。交换的内容可以是一个字节(8位),也可以是一个字(16位), 两个操作数的长度必须一致。(段寄存器不能参加交换) 例 XCHG AL,CL ;8位寄存器间内容交换XCHG AX,DX ;16位寄存器间内容交换XCHG BX,DATASI ;寄存器与存储单元间交换,4累加器专用传送指令 输入输出指令IN , OUT 输入输出指令完成外设与CPU之间的数据传送。 输入指令IN用于从外设端口接收数据,输出指令OUT则向端口发送数据。IN指令一般格式:IN AL,n ; ALnIN AX,n ; AXn+1nIN AL,DX ; ALDXIN AX,DX ; AXDX+1DX功能:从
18、I/O端口输入数据至AL或AX. 输入指令允许把一个字节或一个字由一个输入端口传送到AL或AX中。,输出指令格式:OUT PORT,AL/AX操作:(PORT) AL/AX 操作数类型:同输入指令说明:将累加器AL(8位)或AX(16位)的内容输出到指令指定的I/O端口中。注意:输入输出指令不影响标志位例 OUT 40H,AL ; (40H)AL OUT 20H,AX ; (21H,20H AX) OUT DX,AL; (DX)AL OUT DX,AX; (DX1,DX)AX,(2)查表转换指令格式:XLAT 功能:完成一个字节的查表转换:AL=(DS)16(BX)+(AL)要求:寄存器AL的
19、内容作为一个256字节的表的下标;表的基地址在BX中,转换后的结果存放在AL中。,例:设(DS)=A000H,(BX)=0010H, 表的起始地址为A0010H,表中放数字0-9的ASCII码MOV BX,0010HMOV AL,06HXLAT执行该程序后,(AL)=36H本指令可用在 数制转换、 函数表查表、 代码转换等场合。,A000:0010,30H,31H,A000:0016,36H,3地址传送指令 (1)有效地址送寄存器指令格式:LEA REG ,OPS操作数类型:OPS为存储器操作数,REG为16位通用寄存器。说明:将源操作数OPS的有效地址即16位偏移地址装入到16位通用寄存器R
20、EG中。,例 设DS = 3000H,BX = 2000H,SI = 1000H,LEA AX,BX+SI+1000H执行的结果是:AX = BX + SI + 1000H = 4000H 区别:MOV AX,BX+SI+1000H指令是将偏移地址为BX + SI + 1000H的内存单元的内容送到AX中,结果是AX=1256H。,例 LDS SI,0100H 设:原来DS=3000H, (30100H)= 60H,(30101H)=05H, (30102H)=18H, (30103H)=20H,上述指令执行后,SI = 0560H,DS = 2018H, 执行过程如图3-11所示。,(2)地
21、址指针装入DS指令格式:LDS REG,OPS操作数类型:OPS为存储器操作数,REG为16位通用寄存器。说明:将OPS指定的内存中读取双字存储单元内容,将其中的低字的内容赋给REG,高字内容传赋给DS。,(3)地址指针装入ES指令格式:LES REG,OPS操作数类型:OPS为存储器操作数,REG为16位通用寄存器。这条指令除将地址指针的段地址部分送入ES外,与LDS类似。例如: LES DI,BX,6.标志传送指令 指令格式: LAHF ;AH FLAGS的低8位SAHF ;FLAGS的低8位 AH 说明:LAHF和SAHF指令隐含的操作数为AH寄存器和标志寄存器FLAGS的低半字节。涉及
22、标志寄存器FLAGS中的5个状态标志位为SF、ZF、AF、PF以及CF。,(2)标志入、出栈指令指令格式:PUSHF ;SP SP-2,SP+1SP FLAGS POPF ;FLAGS SP+1SP,SP SP+2 这两条指令可以用来修改标志寄存器中标志位的值。此指令不影响标志位。,3.2.2 算术运算指令,算术运算类指令用来执行二进制的算术运算:加、减、乘、除。 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志 重点掌握 加法指令:ADD、ADC、INC 减法指令:SUB 、SBB、DEC、CMP、NEG,加法和减法指令,加法指令:ADD
23、, ADC和INC 减法指令:SUB, SBB, DEC, NEG和CMP 他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位,1加法指令 (1)加法指令格式:ADD OPD,OPS操作:OPD OPD + OPS说明:ADD指令将OPD与OPS相加,并将结果存回OPD。加法指令影响全部6个状态标志位。操作数类型:OPD可以是寄存器或存储器,OPS可以是寄存器、存储器或立即数。但是OPS和OPD不能同时为存储器。另外,OPD、OPS不能为段寄存器。(段寄存器不能参加、减、乘、除运算)。具体操作数组合见表3-1,适合加、减、乘、除运算。,表3-1
24、加、减、乘、除运算操作数类型组合,例: ADD AL,20;累加器内容与立即数相加ADD DX,SI;寄存器内容相加ADD AX,BX;寄存器与存储器内容相加ADD DATADI,ALADD BYTE PTRBPSI,50H ;存储器内容与立即数相加,例题1 加法,MOV AX,7348H ;AX7348H ADD AL,27H;AL48H27H6FH,AX736FH;OF0,SF0,ZF0,PF1,CF0 ADD AX,3FFFH;AX736FH3FFFHB36EH;OF1,SF1,ZF0,PF0,CF0,(2)带进位加法指令格式:ADC OPD,OPS操作:OPD OPD + OPS +
25、CF说明:ADC指令与ADD指令有些相似,但是它将OPD与OPS相加时,同时还要加上进位标志CF的内容,然后将结果送回OPD。ADC指令也将根据运算结果修改状态标志位。带进位加法指令主要用于数据位数较长、需要分段运算的加法运算。在进行多字加法运算时,低位字用ADD指令相加,高位用ADC指令相加,以接受低位产生的进位。,例2 计算两个四字节长整数之和,数NA = 7A546C08H,NB = 12F0497DH,求NA+NB。分析:这是两个32位二进制数的加法,ADD指令一次只能完成两个16位二进制数的加法,32位数的加法要分两次进行:用ADD指令先加低16位,低16位产生的CF值,通过高16位
26、ADC指令加进去,以保证结果的正确。 解: MOV BX,6C08H ;取加数的低字ADD BX,497DH ;和另一个加数的相应字相加MOV AX,7A54H ;取加数的高字ADC AX,12F0H ;和另一个加数的相应字相加程序段的运行结果:AX中为和的高字,BX中为和的低字。,(3)加1指令格式:INC OPD 操作:OPD OPD + 1说明:INC指令将OPD加1。注意:指令可以是寄存器或存储器,但不能是段寄存器和立即数。INC指令常常用于循环程序中修改地址或者进行加法计数。 例 INC SI ;将SI寄存器内容加1INC BYTE PTRBX ;将存储器字节单元BX内容加1 INC
27、 WORD PTRSI ;将存储器字单元SI内容加1,2减法指令 (1)减法指令格式:SUB OPD ,OPS操作:OPD OPD - OPS 说明:SUB指令用OPD减去OPS,结果送回OPD。SUB指令对状态标志位有影响。对操作数类型组合的要求与加法指令相同,见表3-1。 (2)带借位减法指令格式:SBB OPD ,OPS操作:OPD OPD OPS CF说明:SBB指令将OPD减去OPS,同时减进位标志CF,并将结果送回OPD。该指令主要用于多字节数的分段减法。SBB指令对标志位的影响与SUB指令相同。SBB指令中操作数的类型组合也与SUB指令相同。,例3:SUB SI+14H, 013
28、6H执行前: (DS) = 3000H,(SI)=0040H,(30054H)=4336H执行后: (30054H)=4200H,SF=0,ZF=0,CF=0,OF=0,例4:SBB SI+14H, 0136H执行前: (DS) = 3000H,(SI)=0040H,(30054H)=4336H,CF=1执行后: (30054H)=41FFH,(3)减1指令格式:DEC OPD 操作:OPD OPD - 1说明:DEC指令使OPD减1 例 DEC CX ;寄存器内容减1DEC BYTE PTRDI ;存储单元内容减1(4)求补指令格式:NEG OPD操作:OPD 0 - OPD 说明:NEG指
29、令使操作数求补,即用“0”减去OPD,结果送回OPD。,(5)比较指令格式:CMP OPD ,OPS 操作:OPD - OPS说明:,不保存结果,只影响标志位,用于转移,判断相等:用ZF标志,1表示相等,判断大小,有符号数:用SF与OF的异或结果。1表示小于,无符号数:用CF标志。1表示小于,例: CMP AL,100CMP DX,DI比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。,相等的比较: 若两者相等,相减以后结果为零,ZF标志为1,否则为0。 若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 大小的比较:如果是两个无符号数
30、(如CMP AX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AXBX;若产生了借位(即CF1),则AXBX。,大小的比较:如果是两个符号数(如CMP AX,BX)进行比较,则可以根据OF标志与SF标志的状态判断两数大小。若结果的OF与SF的值相同,则AXBX;反之,则AXBX。,例4:判断寄存器AX与BX的内容是否相等,若相等,使DX=1,否则,使DX=0。 解:程序如下:CMP AX,BX;比较AX与BX的内容JZ EQUAL ;相等,转EQUALMOV DX,0 ;不等,向DX送0JMP NEXT EQUAL:MOV DX,1 ;向DX送1
31、NEXT: HLT,说明:乘法指令中只列出OPS ,OPD是隐含的。两条指令的功能是一样的,但是对同样的数其运算结果是不同的。,3乘法指令 乘法指令有两条,分别用于无符号数和符号数的乘法。格式:MUL OPS ;无符号数乘法IMUL OPS ;带符号数乘法,操作:字节乘法:AX ALOPS 字乘法:(DX ,AX) AXOPS操作数:OPS可以是寄存器或存储器,OPD只能是AL/AX,影响标志,隐含寄存器,MOV AL,20H MOV BL,10H MUL BL,结果默认为(DX)(AX)或(AX),乘数默认为AX或AL,OF、CF,结果超过16位或32位时,CF(OF)=1,4除法指令格式:
32、DIV OPS ;无符号数除法 IDIV OPS ;带符号数除法操作:字节除法:AL AX/OPS的商;AH AX/OPS的余数做字除法:AX (DX,AX)/OPS的商DX (DX,AX)/OPS的余数说明: 除法规定:除数只能是被除数的一半字长。 当被除数为16位时,除数应为8位;被除数为32位时,除数应为16位。被除数为16位时,应存放在AX中。被除数为32位时,应存放在DX(高位)和AX(低位)中。,隐含寄存器,MOV AX,1234H MOV BL,21H DIV BL,商默认为(AL)或(AX),被除数默认为(AX)或(DX)(AX),余数默认为(AH)或(DX),被0除,停止继续
33、执行,产生0号中断,显示“被零除”信息,4.2 符号扩展指令(1)字节扩展指令格式:CBW 操作:把AL中的符号扩展到AH。如果AL80H,则AH00H,否则AH0FFH。(2)字扩展指令格式:CWD 操作:把AX的符号扩展到DX。如果AX8000H,则DX0000H,否则DX0FFFFH。注意:上述两条指令仅限于将扩展数放在AL或AX中进行。,例 若AL = 100,BL = 15,试编写程序段,求出AL除以BL的商和余数分别存放在DL和DH中。 解:程序如下:CBW ;字节扩展到字DIV BL ;除法MOV DL,AL ;存商MOV DH,AH ;存余数HLT,5十进制数(BCD码)运算调
34、整指令 BCD码有两类: 压缩BCD码:就是通常的8421码; 非压缩BCD码:用8个二进制位表示一个十进制位BCD码运算时,应分两步进行:(1)先按二进制数运算规则进行运算,得到中间结果。(2)用十进制调整指令对结果进行修正,得到运算结果。注意: BCD码的运算只能在8位累加器AL中进行; 十进制数的乘、除运算只能用非压缩的BCD格式; 除法运算时,应先调整,后运算。,(1)压缩型BCD码调整指令格式:DAA ;加法调整DAS ;减法调整说明:将加法(ADD或ADC)或减法(SUB或SBC)运算的结果(在AL寄存器中)调整为压缩BCD码。(2)非压缩型BCD码调整指令、加减法调整格式:AAA
35、 ;加法调整AAS ;减法调整说明:将加法(ADD或ADC)或减法(SUB或SBC)运算的结果(在AL寄存器中)调整为非压缩BCD码。调整后的AL寄存器中高4位被清0,如有进位或借位,则在AH中。,、乘法调整格式:AAM说明:把AL中的数值调整为非压缩BCD码,并存入AX中。、除法调整格式:AAD 操作:AL AH10 + AL,AH 0说明:将AH寄存器的内容乘以10并加上AL寄存器的内容,结果送回AL,同时将AH清0。其操作实质是将AX寄存器中的非压缩BCD码转换成二进制数,存放在AL中。,7+5=12 用组合的BCD码表示运算过程:,16进制加法,AAA指令调整为10进制结果,BCD码逢
36、十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时AF=1,CF=1。,3.2.3 逻辑运算和移位指令,1逻辑运算指令 (1)逻辑“非”运算,对一个操作数执行逻辑非运算,NOT OPRD ;OPRD OPRD,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,对两个操作数执行逻辑与运算,结果送目的操作数,AND OPD1, OPD2 ; OPD1OPD1OPD2,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,(2)逻辑“与”运算,对两个操作数执行逻辑或运算,结果送目的操作数,OR OPRD1, OPRD2 ;OPRD1OPRD1O
37、PRD2,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,(3)逻辑“或”运算,对两个操作数执行逻辑异或运算,结果送目的操作数,XOR OPRD1, OPRD1 ; OPRD1OPRD1OPRD1,只有相“异或”的两位不相同,结果才是1;否则,结果为0,(4)逻辑“异或”运算,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志,TEST OPRD1, OPRD1 ;OPRD1OPRD1,AND与TEST指令的关系, 同SUB与CMP指令的关系一样,(5)逻辑测试指令,TEST AL, 01H JNZ P1,; 检验AL最低位是否为1,例 逻辑运算指令的应用,AN
38、D BL,11110110B ;BL中D0和D3清0,其余位不变 OR BL,00001001B ;BL中D0和D3置1,其余位不变 XOR BL,00001001B ;BL中D0和D3求反,其余位不变,AND指令可用于复位某些位(同0相与),不影响其他位,OR指令可用于置位某些位(同1相或),不影响其他位,XOR指令可用于求反某些位(同1相异或),不影响其他位,2移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数: 该操作数为1,表示移动一位 该操作数为CL,CL寄存
39、器值表示移位位数 (移位位数大于1只能CL表示) 按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,(1)逻辑左移/算术左移指令格式:SHL OPD ,M;逻辑左移指令SAL OPD ,M;算术左移指令操作:如图所示。,说明:左移1位时,相当于无符号数乘上2。例 SHL AH,1 ;AH内容左移1位 MOV CL,3SAL SI,CL ;SI内容左移3位,(2)逻辑右移指令格式:SHR OPD ,MT操作:如图所示。说明:SHR指令将OPD顺序向右移1位或移CL寄存器中指定的位数。 无符号数右移1位相当于除以2。例 MOV BL,20H ;BL=20HSHR BL,1 ;BL
40、=10H,(3)算术右移指令格式:SAR OPD ,M操作:如图3-17所示。说明:算术右移一位相当于将该数除以2。例 SAR AL,1SAR DI,CL,(4)循环移位指令ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位RCR OPRD,M ;带进位右循环移位,前两条循环指令,未把标志位CF包含在循环的环中, 后两条把标志位CF包含在循环的环中,相当于9位循环。循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以循环移位一次,也可由CL的内容所决定的次数。 左移一位,只要左移以后的数未超出一个字节或
41、一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2右移位相当于除以2.,利用循环移位指令可以对寄存器/存储器中进行测试。 例 测试AL寄存器中第5位的状态,为“0”时转向ZERO,否则向下继续执行。(用循环移位指令实现)MOV CL,6ROR AL,CL ;将AL的bit5移入CFJNC ZERO ;若CF=0,则转向ZERO处;否则,继续执行 ZERO: ,3.2.4 串操作指令,串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。 源操作数用寄存器SI寻址,默认在数据段DS中。 目的操作数用寄存器DI寻址,默认在附加段ES中。 字串长度默认在CX
42、中,存取或搜索的值默认在AL中。 每执行一次串操作指令,SI和DI将自动修改: 1(对于字节串)或2(对于字串) 执行指令CLD指令后,DF = 0,地址指针增1或2 执行指令STD指令后,DF = 1,地址指针减1或2,重复指令前缀串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见下表:,1串传送指令格式:MOVS 目的串,源串 ;一般格式MOVSB ;字节格式MOVSW ;字格式操作:ES:DI DS:SISI SI1,DI DI 1(字节操作)或SI SI2,DI DI 2(字操作)说明:MOVS指令将由DS:SI作为指针的源串中的一个
43、字节或字内容传送到由ES:DI为指针的目的串单元中,然后自动修改地址指针,指向下一字节/字。MOVS指令可与重复前缀REP联用,实现整个数据块的传送。,例:在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中。其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;MESS2为附加段中用以存放字符串区域的首地址。LEA SI,MESS1 ;置源串偏移地址LEA DI,MESS2 ;置目的串偏移地址MOV CX,17 ;置串长度CLD ;方向标志复位REP MOVSB ;字符串传送,2串比较指令格式:CMPS 源串,目的串 ;一般格式CMPSB ;字
44、节串比较CMPSW ;字串比较操作:DS:SI - ES:DISI SI1,DI DI1(字节操作)或 SI SI2,DI DI2(字操作)说明:将由SI作为指针的源串中的一个字节或字与由DI为指针 的目的串的相应元素相比较(源串减目的串,结果不送回目的串,但影响标志位),然后自动修改地址指针,指向下一元素。,例 试比较两个长度为N的字符串STR1和STR2是否相等。若相等,置DL = 1。否则,DL = 0。 解:比较两字符串相等可采用对应字符逐个比较的方法。LEA SI,STR1LEA DI,STR2MOV CX,NCLDREPZ CMPSB ;未到串尾且对应字符相等时,继续比较JNZ N
45、OEQ ;若串不等,转NOEQMOV DL,1 ;若串相等,DL=1JMP NEXT NOEQ:MOV DL,0 ;串不等,DL=0 NEXT:HLT,3.串扫描指令格式:SCAS 目的串SCASB ;字节操作SCASW ;字操作操作:AL/AX - ES:DIDI DI 1(字节操作)或DI DI 2(字操作)说明:将AL或AX的内容减去由DI作为指针的目的串元素,结果影响标志位,但累加器及目的串的内容不变。 注意:搜索到关键字后,DI内是该字符的下一个字符的地址。,例:在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20
46、H)。 实现上述功能的程序段如下:LEA DI,MESS2 ;装入目的串偏移地址MOV AL,20H ;装入关键字节MOV CX,17 ;装入字符串长度CLDREPNE SCASB 该程序段执行之后,DI的内容即为相匹配字符的下一个字符的地址,CX中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字),则当查完之后(CX)0退出重复操作状态。,4.串存储指令格式:STOS 目的串STOSB ;字节操作STOSW ;字操作功能: 把指令中指定的一个字节/字,传送到附加段中由DI间接寻址的字节/字内存单元中去, 然后,根据方向标志DF及所进行操作的数据类型(字节或字)对DI进行修改操
47、作。 在指令重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。,例: 要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作可用下列程序段实现: LEA DI,MESS2 ;装入目的区域偏移地址MOV AL,00H ;为清零操作准备MOV CX,5 ;设置区域长度CLDREP STOSB,5.串装入指令格式:LODS 源串 ;一般格式LODSB ;字节操作LODSW ;字操作操作:AL/AX DS:SISI SI 1(字节操作)或 SI SI 2(字操作)说明:将由SI作为指针的源串元素传送到AL(字节操作)或AX(字操作),然后自动修改
48、指针,指向下一元素。LODS指令一般不用重复前缀。,3.2.5 程序控制指令,控制转移类指令用于实现程序分支、循环、过程等程序结构,是仅次于传送指令的最常用指令。 控制程序流向的指令分别为:转移指令、循环控制指令、过程调用指令和中断指令。 控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变。,1无条件转移指令 使程序无条件地跳转到指令中指定的目的地址去执行。格式:JMP(1)直接转移格式:JMP 目标标号操作:IP IP + disp16(目标标号所在处的偏移量)说明:该指令将当前IP的内容加上disp16,代码段寄存器CS的内 容不变,从而使控制转移到本程序段内的一个目的地址。相对位移量可正可负,其范围在-32768+32767之间。,例 MOV AX,BXJMP NEXT ;转到NEXT处执行NEXT:MOV AX,0,