1、第三章 80,x86,指 令 系 统,主 要 内 容,8086指令格式和寻址方式,操作数的寻址方式,转移地址的寻址方式,8086指令系统,数据传送指令,算术运算指令,位操作指令,串操作指令,控制转移指令,处理器控制指令,115,一条指令对应一种规定操作,设计微处理器时已经设计好!,3,.1 8086/8088指令系统的寻址方式,1.操作数的种类,指令中操作的对象,数据操作数,地址操作数,立即数操作数:指令中要操作的数据在指令中。,寄存器操作数:指令中要操作的数据在指定的寄存器中。,存储器操作数:指令中要操作的数据存放在指定的存储单元中。,I/O,操作数:指令中要操作的数据来自或送到,I/O,端
2、口。,:程序要转移的目标地址,立即数操作数,寄存器操作数,存储器操作数,有的指令有2个操作数,分别为,源操作数,和,目的操作数,;有的指令有1个操作数,或没有操作数。,指令只有一个,目的操作数,地址,2.寻址方式,所谓寻址方式是指指令中给出的,寻找操作数,(包括数据操作数和地址操作数)的方法。,1)数据寻址方式,(1)立即数寻址方式,所提供的操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分。,立即数可以是8位;也可以为16位,高位字节存放在高地址存储单元,低位字节存放在低地址单元,MOV BL,80H,MOV AX,1090H,只适用于双操作数指令中的源操作数寻址,而且多用来为寄存器
3、赋初值或者目的操作数与一个常数运算。,80,H,AH,10H,AL,90H,(2)寄存器寻址方式,操作数存放在指令规定的寄存器中,,寄存器的名字,在指令中给出。,16,位操作数,寄存器为,AX、BX、CX、DX、SI、DI、SP、BP,8,为操作数,寄存器为,AH、AL、BH、BL、CH、CL、DH、DL,MOV CL,DL,MOV AX,BX,假设,(,DL)=50H,(BX)=1234H,50,H,AH,12H,AL,34H,若指令的,源操作数,和,目的操作数,都采用寄存器寻址方式,由于除取指操作外,不需要访问存储器,因而指令执行的速度快。,寄存器数量越多,程序的执行速度越快。,(3)存储
4、器寻址方式,操作数存放在存储单元中。,唯一性?,由段地址左移4位与操作数在段内的偏移地址相加得到的。,存储器操作数在段内的偏移地址(,EA),位移量(,Displacement):,存放在指令中的一个8位或16位的数,,但不是立即数,而是一个地址。,基址(,Base Address):,存放在基址寄存器,BX,或,BP,中的内容。,变址(,Index Address):,存放在变址寄存器,SI,或,DI,中的内容。,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,基址变址相对寻址方式,直接寻址方式(,Direct Addressing,),操作数位于存储器中,指令中给出
5、存储器的地址,且为段内偏移(有效地址)。,操作数的完整地址还应包含段地址,若无特殊说明,隐含的段地址由,DS,寄存器提供。,EA,位移量,例:,MOV AL,1064H,表示地址时,必须加上方括号,若(,DS)2000H,,执行情况如图所示:,45,H,8086/8088允许段超越,MOV AL,ES:1064H,ES:,MOV 1064H,AX,在汇编语言指令中,可以用符号地址表示位移量:,MOV AL,Value,或,MOV AL,value,寄存器间接寻址方式,操作数位于存储器中,该存储器的地址存放于指令指定的寄存器中,,指令对存储器中的内容进行运算。若无特殊说明,隐含的段地址由,DS,
6、提供,只有做间接寻址的时候,隐含的段地址为。,EA=,(SI),源变址寄存器,(,DI),目的变址寄存器,(,BX),基址寄存器,(,BP),基地址指针寄存器,用作间址的寄存,器必须加上方括号,存储器,50,H,40,H,30000,H,32000,H,AX,(,DS)10H30000H,(,SI)2000H,32000,H,存储器,30000,H,31000,H,AL,50,H,(,DS)10H30000H,(,BX)1000H,31000,H,例:,MOV AX,SI,MOV BX,AL,若(,DS)=3000H,(SI)=2000H,,(BX)=1000H,(AL)=64H,AH,40H
7、,AL,50H,50H,执行结果,(,AX)=4050H,执行结果(31000),H=50H,寄存器间接寻址允许段超越:,MOV ES:DI,AX,EA=,(,SI),源变址寄存器,(,DI),目的变址寄存器,(,BX),基址寄存器,(,BP),基址地址指针寄存器,+,disp-8/disp-16,寄存器相对寻址方式,操作数位于内存单元中,,若指令中规定的寄存器为,SI、DI、BX,,,则操作数默认存在,数据段,中;,若指令中规定的寄存器是,BP,,,则操作数默认存在,堆栈段,中。,指令书写形式:,MOV AL,BP+TABLE,MOV AL,BP+TABLE,MOV AL,TABLEBP,其
8、中,TABLE,是一个8位或16位的位移量。,此方式常用于访问一维表格和数组的元素,用表格和数组首地址(是一个具,体的地址值,表明数组或表格第一个元素在数据段中的段内偏移)作偏移量,,基址寄存器存放数组元素的下标,指明被访问元素在表格或数组中的位置。,允许段超越,CX,操作码,50,H,10,H,存储器,30,H,30000,H,32050,H,操作码,40,H,(,DS)10H30000H,(,BX)1000H,COUNT 1050H,32050,H,50,H,AX,操作码,10,H,存储器,30000,H,32010,H,操作码,(,D,S,)10H30000H,(,SI)2000H,10
9、,H,32010,H,40,H,MOV SI+10H,AX,MOV CX,BX+COUNT,若(,DS)=3000H,(SI)=2000H,,(BX)=1000H,COUNT=1050H,,(AX)=4050H,50,H,40,H,CH,40H,CL,30H,执行结果,:(,32010,H)=4050H,执行结果,(,CX)=4030H,基址变址寻址方式,操作数位于内存单元中,EA=,(,SI),源变址寄存器,(DI),目的变址寄存器,+,(,BX),基址寄存器,(,BP),基址指针寄存器,一般情况下,由基址寄存器决定操作数在哪个段中:,BX,的内容作为基址,操作数在数据段中,BP,的内容作为
10、基址,操作数在堆栈段中,此寻址方式可用于处理一维表格或数组,基址寄存器存放数组首址,变址寄存器存放欲访问元素在数组中的位置(下标);,也可用于处理二维表格或数组,要求二维数组位于指令规定的段的开始,基址寄存器和变址寄存器分别存放数组元素的行列下标。,指令书写形式:,MOV AX,BP+SI,MOV AX,BPSI,允许,段超越,MOV BX+DI,AX,MOV AH,BPSI,若(,DS)=3000H,(SS)=4000H,,(BX)=1000H,(DI)=1100H,,(AX)=0050H,(BP)=2000H,(SI)=1200H,存储器,56,H,40000,H,43200,H,AH,(
11、,SS)10H40000H,(,BP)2000H,(,SI)1200H,43200,H,存储器,30000,H,32100,H,00,H,AX,50,H,(,DS)10H30000H,(,BX)1000H,(,DI)1100H,32100,H,50,H,00,H,56,H,执行结果:,(32100,H)=0050H,执行结果,(,AH)=56H,基址变址相对寻址方式,操作数位于内存单元中,EA=,(,SI),源变址寄存器,(,DI),目的变址寄存器,+,(,BX),基址寄存器,(,BP),基地址指针寄存器,+,disp-8/disp-16,基址寄存器为,BX,时,操作数在数据段中,基址寄存器为
12、,BP,时,操作数在堆栈段中,此寻址方式常用于处理二维表格或数组。表格或数组的首址作偏移量,,基址寄存器和变址寄存器存放数组的行、列下标,指明元素在数组中的位置。,指令书写形式:,MOV AX,BX+SI+COUNT,MOV AX,BXSI+COUNT,MOV AX,BX+SICOUNT,MOV AX,BXSICOUNT,MOV AX,COUNTBXSI,允许段超越,MOV AH,BX+DI+1234H,MOV BP+SI+DATA,CX,若(,DS)=4000H,(SS)=5000H,,(BX)=1000H,(DI)=1500H,,(BP)=2000H,(SI)=1050H,,(CX)=20
13、50H,DATA=10H,存储器,64,H,40000,H,43734,H,AH,(,DS)10H40000H,(,BX)1000H,(,DI),1500H,1234,H,43734,H,存储器,50000,H,53060,H,20,H,CX,50,H,(,SS)10H50000H,(,BP)2000H,(,SI)1050H,DATA 10H,53060,H,64,H,50,H,20,H,执行结果:,(,AH)=64H,执行结果:,(53060,H)=2050H,寻址方式,源操作数格式,使用段寄存器,指令举例,立即数寻址,data,(CS),MOV AX,1064H,寄存器寻址,r,无,MOV
14、 AH,AL,直接寻址,data,DS,MOV AX,1064H,存储器寻址,寄存器间接寻址,SI、DI、BX,BP,DS,SS,MOV AX,SI,寄存器相对寻址,BX+disp,SI+disp,DI+disp,BP+disp,DS,DS,DS,SS,MOV AX,BX+1064H,基址变址寻址,BX+SI,BX+DI,BP+SI,BP+DI,DS,DS,SS,SS,MOV AX,BXSI,基址变址相对寻址,BX+SI+disp,BX+DI+disp,BP+SI+disp,BP+DI+disp,DS,DS,SS,SS,MOV AX,BXDI+1064H,(4),I/O,端口寻址方式,端口直接
15、寻址方式,端口间接寻址方式,端口直接寻址方式,端口地址用8位(0255)立即数,IN AL,21H,7,FH,端口间接寻址方式,当端口地址大于,FFH,时,必须事先将端口地址放在,DX,寄存器,MOV DX,120H,OUT DX,AX,10,F0H,2)地址寻址方式,找出程序转移的地址。转移地址可以在段内(段内转移);,转移地址也可以跨段(段间转移)。仅更改,IP,的内容。,(1)段内直接寻址方式(相对寻址方式),指令内含有目标地址距本转移指令的偏移量。该偏移量是8位或16位的,有符号数,,正数表明要向前转移,常用于跳过一段程序;负数表明要向回转移,常用于构成循环!,当位移量是8位时,称为短
16、转移,转移范围为-128+127;位移量是16位时,称为近转移,转移范围为-32768+32767。,此寻址方式适用于无条件转移或条件转移,JMP NEAR PTR PROGIA,如果位移量为16位,目标地址前加操作符,NEAR PTR,JMP SHORT QUEST,如果位移量为8位,目标地址前加操作符,SHORT,如果目标地址标号已经定义,可不写,SHORT,(2)段内间接寻址,程序转移地址存放在寄存器或存储单元中,存储器可用各种数据寻址方式表示,仅更改,IP,的内容。,指令格式:,JMP BX,JMP WORD PTR BP+TABLE,WORD PTR,为操作符,用以指出其后的寻址方式
17、所取得的目标地址是一个字的有效地址。,(3)段间直接寻址方式,指令中直接给出16位的段地址和16位的偏移地址用来更新当前的,CS,和,IP,的内容。,指令格式:,JMP LABEL_NAME,JMP FAR PTR NEXTROUTINT,(4)段间间接寻址,由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是将存储器的前两个单元的内容送给,IP,,后两个单元的内容送给,CS。,指令格式:,JMP VAR_DOUBLE,WORD,JMP DWORD PTRBPDI,此三种方式都不可用于条件转移指令,转移范围,寻址方式,段内转移,(段内偏移送入,IP),段间转移,(
18、段地址送,CS,,段内偏移送,IP),直接方式,(指令中直接给出,目标地址,或目标地址距当前,IP,的,偏移量,),段内直接寻址,(相对寻址),Eg:JMP 0136,JMP 1000,段间直接寻址,Eg:JMP FFFF:0000,间接方式,(指令中给出存放目标地址的,寄存器,或存放目标地址的,存储单元的地址,),段内间接寻址,Eg:JMP BX,JMP BX,JMP 0136,段间间接寻址,Eg:JMP FAR BX,JMP FAR 0136,转移指令目标地址的寻址方式,寻址方式,数据寻址方式,地址寻址方式,立即数寻址方式,寄存器寻址方式,存储器寻址方式,I/O,端口寻址方式,直接寻址方式
19、,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,基址变址相对寻址方式,端口直接寻址方式,端口间接寻址方式,段内直接寻址方式,段内间接寻址方式,段间直接寻址方式,段间间接寻址方式,3,.,2 8086/8088,指令系统,数据传送类指令,算术运算类指令,位操作指令,串操作指令,程序控制指令,处理器控制指令,通用数据传送指令,输入输出指令,目标地址传送指令,标志传送指令,对状态标志位不发生影响!,1、数据传送指令,数据传送指令,MOV,堆栈操作指令,数据交换指令,XCHG,字节转换指令,XLAT,压入堆栈指令,PUSH,弹出堆栈指令,POP,输入指令,IN,输出指令,OUT,取有效地址
20、指令,LEA,地址指针装入,DS,指令,LDS,地址指针装入,ES,指令,LES,取标志指令,LAHF,置标志指令,SAHF,标志压入堆栈指令,PUSHF,标志弹出堆栈指令,POPF,通用数据传送指令,输入输出指令,目标地址传送指令,标志传送指令,1、数据传送指令,1)通用数据传送指令,(1)数据传送指令,MOV (MOVement),指令格式及操作:,MOV dst,src ;(dst),(src),dst,表示目的操作数,,src,表示源操作数,源操作数,可以是:,立即数,、,寄存器,以及各种寻址的,内存单元内容,。,源操作数和目的操作数不能同时为内存单元。,目的操作数,可以是,寄存器,或
21、者各种寻址的,内存单元,。不可以是立即数、,IP、CS。,正确的指令举例:,MOV AL,BL ;BL,中的8位数送,AL,MOV DS,AX ;AX,中的16位数送,DS,MOV DI,AX ;,累加器内容送,DI,和,DI+1,所指的两个单元(数据段),MOV CX,1000H ;,将数据段1000和1001两单元内容送,CX,MOV BL,20H ;,将立即数20,H,送,BL,MOV DX,5020H ;,将立即数5020,H,送,DX,MOV AX,BP+SI+04H ;,将(,BP+SI+4),和(,BP+SI+5),两单元(堆栈段),;内容送,AX,以下的指令是错误的:,MOV
22、52H,AH,MOV CS,AX,MOV DI,SI,MOV 1000,SI,MOV IP,BX,;立即数不能作为目的操作数,;,CS,不能作为目的操作数,;内存单元之间不能直接传送,;,内存单元之间不能直接传送,;,IP,不能作为目的操作数,(2)堆栈操作指令,堆栈是按照“后进先出”原则使用的一片内存区域。数据装入堆栈的过程称为“压入(,PUSH)”,,从堆栈中取出数据的过程称为“弹出(,POP)”。,顺序:先压入堆栈的数据后弹出堆栈;后压入堆栈的数据将先弹出堆栈!,堆 栈,SP,栈底,栈顶,低地址,高地址,PUSH,POP,8086的堆栈建立在内存的堆栈段中。堆栈的开辟和使用是借助于堆栈指
23、针寄存器,SP,及相关硬件实现的。,SP,的内容指向栈顶内存单元的地址,,SP,初值指向的内存称为栈底。(用,MOV,指令更改,SP,的值,实际上就是从新设置栈底,开辟新的堆栈)。程序执行时,,SP,的值始终指向栈顶,当有数据压入堆栈时,,SP,的值向远离栈底的方向变化,,SP,值减小;当有数据弹出堆栈时,,SP,值向靠近栈底的方向变化,,SP,值增大。,堆栈操作中的操作数类型必须是字操作数,即16位操作数。,压入堆栈指令,PUSH(PUSH word onto stack),PUSH src ;(SP),(SP)2,(SP)+1:,(,SP),(src),先将堆栈指针,SP,减2,使,SP,
24、始终指向栈顶,然后再将操作数,src,压入(,SP)+1,和(,SP),两个存储单元,PUSH AX;(SP),(SP)2,(SP)+1,(AH),(SP),(AL),PUSH CS,PUSH SI,源操作数可以为通用,寄存器,、,段寄存器,、某种寻址方式所指示的,存储单元,,,但是,不能为立即数,!,弹出堆栈指令,POP(POP word off stack),POP dst;(dst)(SP)+1,(SP),(SP)(SP)+2,POP BX,POP ES,目的操作数可以为,存储器,、,通用寄存器,或,段寄存器,(但不能为,CS,),,不能为立即数,!,在子程序的开头,保护,寄存器的顺序为
25、:,PUSH AX,PUSH BX,PUSH CX,PUSH DX,则子程序返回前,应按如下顺序,恢复,寄存器值:,POP DX,POP CX,POP BX,POP AX,(3)数据交换指令,XCHG(eXCHanGe),XCHG dst,src;(dst),(src),源操作数和目的操作数均,可以是寄存器或存储器,,,但,不能同时为存储器,,而且,,段寄存器的内容不能参加交换,。,交换的内容可以是一个字节,也可以是一个字!,XCHG AL,BL;AL,和,BL,之间进行字节交换,XCHG BX,CX ;BX,和,CX,之间进行字交换,XCHG 2500H,DX ;DX,和2500,H、,25
26、01两个单元内容交换(数据段,),(4)字节查表转换指令,XLAT(transLATe),XLAT src_table ;(AL),(BX)+(AL),字节查表转换指令,根据表中元素的序号,查出表中相应元素的内容。为了实现查表转换,预先应将表的首地址,即表头地址传送到,BX,寄存器,元素的序号即位移量送,AL,,表中第一个元素的序号为0,然后依次是1,2,3,。执行,XLAT,指令后,表中指定序号的元素存于,AL,AL,中的内容被取代。这是一种特殊的基址变址寻址方式,基址寄存器为,BX,,变址寄存器为,AL。,利用,XLAT,指令实现不同数制或编码系统之间的转换。,被寻址表的最大长度为255个
27、字节,MOV BX,OFFSET Hex_table,MOV AX,0AH,XLAT Hex_table,偏移地址,XLAT,XLAT src_table,XLAT ES:src_table ;,重设段寄,存器,ES,,必须写操作数,(,AL)=41H,2)输入输出指令,输入指令从外设端口读入数据,输出指令向端口发送数据。无论是读入的数据或是准备发送的数据必须放在寄存器,AL(,字节)或,AX(,字)中。,端口,直接寻址,的输入输出指令,可寻址,256,个端口(0255),端口通过,DX,寄存器,间接寻址,的输入输出指令,可寻址,64,K,个,端口(065535),(1)输入指令,IN(Inp
28、ut byte or word),口地址为8位时,口地址直接出现在指令中。,格式:,IN AX/AL,PORT,8位口地址既可以传送8位数据,也可以传送16位数据,取决于具体设备的接口芯片。,功能:从,PORT,口输入8位或16位数据到,AL,或,AX,寄存器。,口地址为16位时,口地址存放在,DX,寄存器中。,格式:,IN AX/AL,DX,功能:从以,DX,内容为口地址的接口输入8位或16位数据到,AL,或,AX,寄存器。,从,DX,和,DX+1,所指出的两个端口读一个字,较低地址端口中的值读到,AL,中,较高地址,端口中的值读到,AH,中。,(2)输出指令,口地址为8位时,口地址直接出现
29、在指令中。,格式:,OUT PORT,AX/AL,功能:将,AL,或,AX,寄存器中的8位或16位数据输出到,PORT,口。,口地址为16位时,口地址存放在,DX,寄存器中。,格式:,OUT DX,AX/AL,功能:将,AL/AX,寄存器中的8位或16位数据输出到以,DX,内容为口地址的接口。,将,AL,中的字节输出到,DX,所指的端口中,将,AH,中的字节输出到,DX+1,所指的,端口 中。,3)目标地址传送指令,(1)取有效地址指令,LEA(Load Effective Address),指令格式:,LEA reg16,mem,将近地址指针写入到指定的寄存器。,目的操作数必须为16位通用寄
30、存器,源操作数必须是一个存储器操作数。结果是把源操作数的有效地址传送到目标寄存器。,LEA BX,BUFFER;(BX),OFFSET BUFFER,LEA AX,BPDI;(AX),(BP)+(DI),LEA DX,BETABXSI ;(DX),(BX)+(SI)+BETA,LEA BX,BUFFER,MOV BX,BUFFER,前者将,BUFFER,的偏移地址送到,BX;,后者将存储器变量,BUFFER,的内容传送到,BX。,LEA BX,BUFFER,MOV BX,OFFSET BUFFER,(2)地址指针装入,DS,指令,LDS(Load pointer DS),指令格式:,LDS r
31、eg16,mem32,用于写入远地址指针。,源操作数是存储器操作数,目的操作数可以是任一个16位通用寄存器,把一个存放在4个存储单元中共计32位的目标地址(段地址和偏移量)传送到两个目的寄存器,其中,后两个字节,(,高地址,)内容,即,段地址送到,DS,;,前两个字节(,低地址,)内容,即,偏移量送到指令中所出现的目的寄存器中,。,设当前(,DS)=C000H,,有关,的存储单元的内容为,(,C0010H)=80H,,(C0011H)=01H,,(C0012H)=00H,,(C0013H)=20H,执行,LDS SI,0010H,C0010H,C0011H,C0012H,C0013H,20H,
32、80H,01H,00H,送入,SI,送入,DS,执行完后,(,DS)=2000H,(SI)=0180H,(3)地址指针装入,ES,指令,LES(Load pointer into ES,),指令格式:,LES reg16,mem32,与,LDS,类似,装入一个,32位,的远地址指针,,位移地址,送指定,寄存器,,,段地址,送附加段寄存器,ES,。,mem,内存单元内容(四个字节)分别赋值给,reg,寄存器和,ES,寄存器,低两字节送入,reg,寄存器,高两字节送入,ES,寄存器。,LES reg,mem,mem,内存单元内容(四个字节)分别赋值给,reg,寄存器和,DS,寄存器,低两字节送入,
33、reg,寄存器,高两字节送入,DS,寄存器,LDS reg,mem,mem,内存单元的地址的段内偏移部分赋值给,reg,寄存器,LEA reg,mem,功 能,格 式,目 标 地 址 传 送 指 令,4)标志传送指令,FLAGS,,其中包括6个状态标志位和3个控制标志位。,共有,4条,标志传送指令,都为,单字节,指令,指令的,操作数为隐含,形式。,(1)取标志指令,LAHF(Load AH from Flags),指令格式:,LAHF,AH,OF,DF,IF,TF,SF,ZF,AF,PF,CF,FLAGS,SF,ZF,AF,PF,CF,(2)置标志指令,SAHF(Store AH into F
34、lags),指令格式:,SAHF,AH,SF,ZF,AF,PF,CF,OF,DF,IF,TF,SF,ZF,AF,PF,CF,FLAGS,SAHF,将影响标志寄存器,(3)标志压入堆栈指令,PUSHF(PUSH Flags onto stack),指令格式:,PUSHF ;(SP)(SP)2,(SP)+1):(SP)(FLAGS),(4)标志弹出堆栈指令,POPF(POP Flags off stack),指令格式:,POPF ;(FLAGS)(SP)+1:(SP),(SP)(SP)+2,LAHF,SAHF,修改,AH,寄存器,如何修改标志寄存器的高8位或者低8位呢,先用,LAHF,指令把标志寄
35、存器的低8位赋值给,AH,寄存器,然后用程序修改,AH,寄存器,最后再用,SAHF,指令把修改后的,AH,寄存器的内容传送回标志寄存器的低8位。,PUSHF,POP AX;,借助堆栈,将,FLAG,赋值给,AX,PUSH AX;,借助堆栈,将,AX,赋值给,FLAG,POPF,修改,AX,内容,长度可以为8位或16位,若为带符号数,用补码表示,2、算术运算指令,1)算术运算的数据类型,无符号的二进制数,带符号的二进制数,压缩型十进制数(压缩型,BCD,码),非压缩型十进制数(非压缩型,BCD,码),只有加/减运算,压缩型,BCD,码,每个字节存两位数,即两位,BCD,码,,对于一个字节来说,压
36、缩型,BCD,码的范围是099;,非压缩型,BCD,码,每个字节存一位数,即由字节的低4位决定存放的数字,对于高四位,进行乘/除运算时必须全为0,加/减运算时可以为任意值。,2)算术运算指令对标志位的影响,标志位中的绝大多数可由跟在算术指令后的条件转移指令进行测试,改变程序的流程。,算术运算类指令共有20条:,加法指令,带进位加法指令,加一指令,减法指令,带借位减法指令,减一指令,求补指令,比较指令,无符号数乘法指令,带符号数乘法指令,无符号数除法指令 带符号数除法指令,字节扩展指令 字扩展指令,非压缩型,BCD,码加法调整指令 压缩型,BCD,码加法调整指令,非压缩型,BCD,码减法调整指令
37、 压缩型,BCD,码减法调整指令,非压缩型,BCD,码乘法调整指令 非压缩型,BCD,码除法调整指令,段寄存器不能参加加、减、乘、除运算,加法指令,ADD(ADDition),指令格式及操作:,ADD dst,src ;(dst),(dst)+(src),ADD,指令将目的操作数与源操作数相加,并将,结果,送给,目的操作数,。,加法指令将影响状态标志位,。,目的操作数:寄存器、存储器,源操作数:寄存器、存储器、立即数,两者不能同时为存储器,ADD CL,10H,ADD DX,SI,ADD AX,MEM,ADD DATABX,AL,ADD ALPHADI,30H,数据可以为8位,也可以为16位。
38、,数据类型若为无符号数,结果超出范围,,则,CF,位为1;,若为带符号数,超出补码表示范围,,则,OF,位为1。,(1)加法指令:不带进位加法指令、带进位加法指令、加1指令,带进位加法指令,ADC(ADdition with Carry),操作格式及操作:,ADC dst,src ;(dst)(dst)+(src)+(CF),影响状态,标志位,目的操作数:寄存器、存储器,源操作数:寄存器、存储器、立即数,两者不能同时为存储器,带进位加法指令主要用于,多字节数据的加法运算,,如果低字节相加时,产生进位,则在下一次高字节相加时将这个进位加进去。,加1指令,INC(INCrement by 1),指
39、令格式及操作:,INC dst ;(dst)(dst)+1,INC,将目的操作数,加1,并将结果送回,目的操作数。影响,SF、ZF、AF、PF、,OF,,不影响,CF,。,目的操作数:寄存器、存储器,,不能为段寄存器,和,立即数,。,INC DL,INC SI,INC BYTE PTRBXSI,INC WORD PTRDI,BYTE PTR,指定随后的存储,器操作数的类型是字节型,WORD PTR,指定随后的存储器操作数是字型,常用于循环,程序中修改地址,(2)减法指令:不带借位减法指令、带借位减法指令、减1指令、求补指令、比较指令,减法指令,SUB(SUBtraction),指令格式及操作:
40、,SUB dst,src ;(dst)(dst)(src),用目的操作数减源操作数,结果送回目的操作数,目的操作数:寄存器、存储器,源操作数:立即数、寄存器、存储器,允许字节相减,也允许字相减,两者不能同时为存储器,SUB AL,37H,SUB DX,BX,SUB CX,VARE1,SUB ARRAYDI,AX,SUB BETABXDI,512H,当无符号数的较小数减较大数时,因不够减而,产生借位,此时进位标志,CF,置1。当带符号数,的较小数减较大数时,将得到负的结果,则符,号标志,SF,置1。带符号数相减如果结果溢出,,则,OF,置1。,带借位减法指令,SBB(SuBtraction wi
41、th Borrow),指令格式及操作:,SBB dst,src ;(dst)(dst)(src)(CF),对,标志位,影响同,SUB,目的操作数:寄存器、存储器,源操作数:立即数、寄存器、存储器,允许字节相减,也允许字相减,两者不能同时为存储器,SBB BX,1000H SBB CX,DX,SBB AL,DATASI SBB DISPBP,BL,SBB BYTE PTR SI+6,97H,主要用于多字节减法,可以考虑进位。,减1指令,DEC(DECrement by 1),指令格式及操作:,DEC dst ;(dst)(dst)1,操作数可以为寄存器或者是存储器,但,不能,为,立即数,和,段寄
42、存器,影响,SF、ZF、AF、PF、OF,,不影响,CF,DEC BL,DEC CX,DEC BYTE PTR BX,DEC WORD PTR BPDI,MOV AX,0FFFFH,CYC:DEC AX,JNZ CYC,HLT,延时!,计算两个多字节十六进制数之和:3,B74AC60F8H+20D59E36C1H=?,程序如下:,MOV CX,5 ;,设置循环次数,MOV SI,0 ;,置位移量初值,CLC ;,清进位,CF,LOOPER:MOV AL,DATA2SI,;,取一个加数,ADC DATA1SI,AL,;,和一个被加数相加,INC SI ;,位移量加1,DEC CX ;,循环次数减
43、1,JNZ LOOPER ;,加完否,若没完,,;转,LOOPER,,继续相加,HLT ;,程序暂停,求补指令,NEG(NEGate),指令格式及操作:,NEG dst ;(dst)0(dst),只有一个目的操作数,,存放运算的最终结果。,操作数可以为寄存器、存储器,对8位数或16位数求补。,NEGBL,NEGAX,NEGBYTE PTRBPSI,NEGWORD PTRDI+20,用,NEG,可以得到,负数的绝对值!,比较指令,CMP(CoMPare)。,指令格式及操作:,CMP dst,src ;(dst)(src),比较指令后两个操作数内容均不变,比较结果反映在状态标志位上,目的操作数:寄
44、存器、存储器,源操作数:立即数、寄存器、存储器,两者不能同时为存储器!,CMP AL,0AH ;,寄存器与立即数比较,CMP CX,DI ;,寄存器之间比较,CMP AH,AREA1 ;,寄存器与存储器比较,CMP BX+5,SI;,存储器与寄存器比较,内存数据段存放了200个带符号数,首地址为,TAB1,,要求将各数取绝对值后存入以,TAB2,为首址的内存区。,开 始,传送源地址,目标地址,设置循环次数,判断符号位,符号位为1?,为1,求补,存入目标地址,源地址加,1,,目标地址加1,循环次数减1,循环次数到?,不为1,到,结 束,LEA SI,TAB1;(SI),源地址指针,LEA DI,
45、TAB2 ;(DI),目标地址指针,MOV CX,200 ;(CX),循环次数,CHECK:MOV AL,SI ;,取一个带符号数到,AL,OR AL,AL ;AL,内容不变,但使之影响标志,JNS NEXT ;,若(,SF)=0,,则转,NEXT,NEG AL ;,否则求补,NEXT:MOV DI,AL ;,传送到目标地址,INC SI ;,源地址加1,INC DI ;,目标地址加1,DEC CX ;,循环次数减1,JNZ CHECK ;,如不等于零,则转,CHECK,HLT ;,停止,在数据段从,MYDATA,开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到,M
46、AX,单元。,LEABX,MYDATA;MYDATA,偏移地址送,BX,MOVAL,BX ;,第一个无符号数送,AL,INCBX ;BX,指向第二个无符号数,CMP AL,BX ;,两个数比较,JNC DONE ;,如,CF=0,,则转,DONE,,即无借位,MOV AL,BX ;,否则,第二个无符号数送,AL,DONE:MOV MAX,AL ;,较大的无符号数送,MAX,单元,HLT ;,停止,格 式,功 能,影 响 标 志 位,INC dst,加1送入目的操作数,AF、OF、ZF、SF、PF,DEC dst,减1送入目的操作数,AF、OF、ZF、SF、PF,(3)乘法指令,只有一个源操作数
47、,另外一个操作数在累加器中,目的操作数隐含!可以进行字或字节的乘法运算,无符号数乘法指令,带符号数乘法指令,无符号,数乘法指令,MUL(,MUL,tiplication unsigned)。,指令格式及操作:,MUL src ;(,AX,)(AL),(src)(,字节乘法),;(,DX:AX,)(AX),(src)(,字乘法),一个操作数(乘数)在累加器中,8位乘法时乘数在,AL,中,16位乘法时乘数在,AX,中,src,必须在寄存器或存储单元中,范围:,0255;065535,MULAL,MULBX,MULBYTE PTR DI+6,MUL WORD PTR ALPHA,源操作数是存储器时,
48、应说明数据长度,MOVAL,14H,MOVCL,05H,MULCL ;(AX)=0064H,(CF)=(OF)=0,高半部分(,AH,或,DX,)为零,则状态标志位(,CF)=(OF)=0;,若高半部分(,AH,或,DX),包含乘积的有效数字,状态标志位(,CF)=(OF)=1,执行速度慢!,带符号数,的乘法,IMUL(,I,nteger,MUL,tiplication),指令格式如下:,IMULsrc;(AX)(AL),(src)(,字节乘法),;(,DX:AX)(AX),(src)(,字乘法),8位带符号数的取值范围:-128+127;,16,位带符号数的取值范围:-32768+32767
49、,乘积的高半部分仅是,低半部分符号位,的扩展:,状态标志位,(,CF)=(OF)=0,乘积的高半部分包含乘积的,有效数字而不仅是符号的扩展:,状态标志位(,CF)=(OF)=1,乘积为正时:符,号位为0,,AH,或,DX,的高半部分为,8位全零或16位全0,乘积为负时:符,号位为1,,AH,或,DX,的高半部分为,8位全零或16位全1,MOV AX,04E8H,MOV BX,4E20H,IMUL BX ;(DX:AX)=(AX),(BX),执行结果为:,(,DX)=017FH,(AX)=4D00H,,且(,CF)=(OF)=1。,(4)除法指令,除数只能是被除数的一半,被除数为16位时,除数应
50、该为8位;,被除数为32位时,除数应该为16位。,AL,AH,商,余数,AX,操作数,(8位),除数,被除数,(16位),(,a,),AX,DX,商,余数,AX,操作数,(16位),除数,被除数,(32位),(,b,),DX,被除数为16位,存放于,AX,中。,除数为8位,可存放于寄存器/存储器中。,8位商放在,AL,中,8位余数放在,AH,中。,被除数为32位,存放于,DX:AX,中。,除数为16位,可存放于寄存器/存储器中。,16位商放在,AX,中,16位余数放在,DX,中。,除法指令对状态标志位,SF,、,ZF,、,AF,、,PF,、,CF,和,OF,的影响不确定。,要求:,无符号数,除