1、指令系1.数据传送指令2.算术运算指令3.逻辑运算和移位指令4.串操作指令5.转移指令6.处理器控制指令立即数立即数 格式格式:IN AL,DX ;AL (DX)IN AX,DX ;AX (DX+1,DX)OUT DX,AL ;(DX)AL OUT DX,AX ;(DX+1,DX)AX 在间接输入输出指令之前,需将端口号送入DX寄存器。MOV DX,XXXXH;例例 OUT85H,AL;85H端口AL内容MOVDX,0FF4H;端口地址DX=0FF4HOUTDX,AL;FF4H端口AL内容 MOVDX,300H;DX指向300H OUTDX,AX;300H端口 AL内容,301H端口AH内容l
2、读取标志指令:LAHF(5、3、0为任意值)标志寄存器低8位 AHl设置标志指令:SAHF 标志寄存器低8位 AH,影响影响PSWl把标志寄存器的内容压入堆栈:PUSHFl从堆栈弹出到标志寄存器:POPF,影响影响PSW15 11 10 9 8 7 6 5 4 3 2 1 0 AHD7 D6D4D2D0数据传送指令数据传送指令 LAHF 标志送到标志送到AH指令指令(Load AH from Flag)指令格式:指令格式:LAHF 指令功能指令功能:标志寄存器SF、ZF、AF、PF和和CF AH寄存器的位寄存器的位7、6、4、2和和0。注意注意:位5、3、1的内容未定义未定义,是任意值。执行这
3、条指令后,标志位本身并不受影响标志位本身并不受影响。这5个标志送进AH后,AH便相当于80808085的标志寄存器,从而能对80808085程序进行转换,使它们能运行在80868088系统上。15 11 10 9 8 7 6 5 4 3 2 1 0 AHD7D6D4D2D0数据传送指令数据传送指令 指令格式:指令格式:SAHF 指令功能:指令功能:AH内容内容 标志寄存器标志寄存器。注意:注意:位5、3、1的内容未定义,是任意值。执行这条指令后,高位标志并不受影响高位标志并不受影响。为80808085提供兼容性。15 11 10 9 8 7 6 5 4 3 2 1 0 AHD7D6D4D2D0
4、数据传送指令数据传送指令PUSHF标志入栈指令标志入栈指令(Push Flag onto Stack)指令格式:指令格式:PUSHF 指令功能:指令功能:将标志寄存器PSW中的内容 压入堆栈;并修改堆栈指针,使SPSP2;指令执行后对标志位无影响。指令执行后对标志位无影响。POPF标志出栈指令标志出栈指令(Pop Flag off Stack)指令格式:指令格式:POPF 指令功能:指令功能:将将堆栈指针SP所指的一个字弹入标志寄存器PSW;并修改堆栈指针,使SPSP2。注意:注意:要成对使用PUSHF和POPF,可对标志寄存器进行保存和恢复。常用在:过程(子程序)调用,中断服务程序,对主程序
5、的状态(即标志位)进行保护。也可用来改变追踪标志TF。在8086指令系统中没有直接改变TF(D8位)的指令。算术运算指令算术运算指令二、算术运算指令二、算术运算指令算术运算指令可处理算术运算指令可处理4 4种类型的数:种类型的数:l无符号二进制整数l带符号二进制整数l无符号压缩十进制整数(Packed Decimal)l无符号非压缩十进制整数(Unpacked Decimal)一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。数的表示:数的表示:l二进制数:可以是8位或16位,若是带符号数,则用补码表示。l压缩十进制数:一个字节中存放两个BCD码十进制数。l非压缩十进制数:个字节的低
6、半字节存放十进制数,高半字节为全零。例如,对十进制数字58:压缩十进制数表示:只需一个字节,即 0101 1000B;非压缩十进制数表示:需两个字节,即 0000 0101B 和 0000 1000B。算术运算指令算术运算指令l加、减、乘、除运算指令加、减、乘、除运算指令:处理无符号或带符号的8位/16位二进制数的算术运算;l调整操作指令调整操作指令:进行压缩的或非压缩的十进制数的算术运算;l加法和减法运算指令加法和减法运算指令:带符号数和无符号数的加法和减法的运算可以用同一条加法或减法指令来完成。l乘法和除法运算乘法和除法运算:分别设置无符号数和带符号数的乘、除法指令乘、除法指令。绝大部分算
7、术运算指令都影响状态标志位。绝大部分算术运算指令都影响状态标志位。算术运算指令算术运算指令算术逻辑指令算术逻辑指令(Addition)ADD加法指令加法指令(Addition)指令格式:ADD 目的,目的,源源 指令功能:目的 源 十 目的 ADC带进位的加法指令带进位的加法指令(Addition with Carry)指令格式:ADC 目的,目的,源源 指令功能:目的 源 十 目的 十 CF注意:注意:l源操作数可以是寄存器、存储器、立即数;l目的操作数:只能用寄存器、存储单元。l源、目的操作数不能同时为存储器,且类型必须一致,均为字节或字;l这两条指令影响的标志位为:CF、OF、PF、SF
8、、ZF和AF。算术运算指令算术运算指令算术运算指令算术运算指令例:两种加法指令的实例例:两种加法指令的实例 ADD AL,18H ;AL AL十18H ADC BL,CL ;BL BL十CL十CF ADC AX,DX ;AX AX十DX十CF ADD AL,COSTBX ;AL内容和地址DS:(COST+BX)的存储字节 ;相加,结果送AL ADD COSTBX,BL;将BL与物理地址DS:(COST十BX)的存储字 节相加,结果留在该存储单元中例例:用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。解:MOV AL,5EH ;AL5EH(94)MOV
9、BL,3CH ;BL3CH(60)ADD AL,BL ;结果AL9AH算术运算指令算术运算指令讨论讨论ADD对标志位的影响:对标志位的影响:两个数的相加过程:两个数的相加过程:0101 1110 5EH =94 +0011 1100 即:+3CH =60 1001 1010 9AH =154运算后标志位:ZF0,AF1,CF0,SFl,PF1,OF1。对标志的解释(人为决定):对标志的解释(人为决定):两个加数都看成无符号数无符号数时,运算结果为9AH,即十进制数154。在这种情况下,SF和OF都没有意义没有意义,我们只关心关心ZF和和CF标志,在BCD码运算或奇偶校验时才考虑AF或PF标志。
10、两个加数都当成带符号数带符号数时,符号标志SF和溢出标志OF很重要很重要,而进位标志CF没有意义没有意义。带符号数能表示的范围-128+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,即产生了溢出,OF1算术运算指令算术运算指令 INC增量指令增量指令(Increment)指令格式:INC 目的目的 指令功能:目的 目的 十1 操作数的要求:通用寄存器、内存。注意:注意:这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;指令执行后影响影响AF、OF、PF、SF和和ZF,但不影响进位标志不影响进位标志CF。该指令只有一个操作数时,如果要使内存单元内存单元
11、的内容增增1,程序中必须说说明明该存储单元是字还是字节字还是字节。例 INC BL ;BL寄存器中内容增1 INC CX ;CX寄存器中内容增1 INC BYTE PRRBX ;内存字节单元内容增1 INC WORD PTRBX ;内存字单元内容增1 其中,PTR为类型说明符为类型说明符,前面加BYTE说明操作数类型为字节,加WORD则说明操作数类型为字字。算术运算指令算术运算指令 AAA加法的加法的ASCII调整指令调整指令(ASCII Adjust for Addition)指令格式:AAA 指令功能:在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后,运算结果
12、已存在AL中,用此指令将用此指令将AL寄存器中的运算寄存器中的运算结果调整为一位非压缩十进制数,仍保留在结果调整为一位非压缩十进制数,仍保留在AL中中。如果AF1,表示向高位有进位,则进到AH寄存器中。(注:非压缩十进制数的高4位为全0,低4位为十进制数字09。例如,将9表示成0000 1001)调整过程:若AL低4位9或AF1 则:ALAL十6 用与操作()将AL高4位清0 AF置1,CF置1,AHAH十l 否则,仅将AL寄存器的高4位清0。算术运算指令算术运算指令例例 若ALBCD 9,BLBCD 5,求两数之和。解:设AH0,则运算过程如下:ADD AL,BL ;0000 10019 ;
13、+0000 01015 AAA ;0000 1110低4为9 ;+0000 0110加6调整 ;0001 0100 ;0000 1111清高4位 ;0000 0100AL=4 ;CF=1,AF=1,AH=1 ;结果为AX0104H,表示非压缩十进制数14 算术运算指令算术运算指令例例 求ASCII码表示的数9(39H)与5(35H)之和。设AH0,则运算过程如下:MOV AL,9 ;AL=39HMOV BL,5 ;BL=35HADD AL,BL ;0011 10019 ;+0011 01015 AAA ;0110 1110低4为9 ;+0000 0110加6调整 ;0111 0100 ;000
14、0 1111清高4位 ;0000 0100AL=4 ;CF=1,AF=1,AH=1 ;结果为AX0104H,表示非压缩十进制数14 算术运算指令算术运算指令 DAA加法的十进制调整指令加法的十进制调整指令(Decimal Adjust for Addition)指令格式:DAA 指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。注意:注意:相加后的结果必须在AL中,才能使用DAA指令。调整过程:若AL的低4位9或AF1,则AL AL十6,对低4位进行调整;若此时AL的高4位9或CF1,则AL AL十60H,对高4位进行调整,并使CF置1,否则CF置0。算术运算指令算术运算指令例
15、例 若若ALALBCD 88BCD 88,BLBLBCD 49BCD 49,求两数之和,求两数之和。解 运算过程为:MOV AL,88H ;AL=88HMOV BL,49H ;BL=49HADD AL,BL ;1000 100088 ;+0100 100149 DAA ;1101 0001AF=1 ;+0000 0110加6调整 ;1101 0111调整后高半字节9 ;+0110 0000加60H调整 ;0011 0111结果为ALBCD 37,CF=1 算术运算指令算术运算指令(Subtration)SUB减法指令减法指令(Subraction)指令格式:指令格式:SUB 目的,源目的,源
16、指令功能:指令功能:目的 目的源 例例 SUB AX,BX ;AX AX-BX SUB DX,1850H ;DX DX-1850H SUB BL,BX ;BL中内容减去物理地址DS:(BX)处的字节,结果存入BL SBB带借位的减法指令带借位的减法指令(Subtract with Borrow)指令格式:SBB 目的,源 指令功能:目的 目的源CF (SBB主要用于多字节减法中)例例 SBB AL,CL;AL ALCLCF算术运算指令算术运算指令 DEC减量指令减量指令(Decrement)指令格式:指令格式:DEC 目的目的 指令功能指令功能:目的 目的-l 例例 DEC BX;BX BX-
17、1 DEC WORD PTRBP;堆栈段中位于BP偏置处的字减1 NEG取负指令取负指令(Negate)指令格式:指令格式:NEG 目的目的 指令功能:指令功能:目的 0目的,即对目的操作数取负 例例 NEG AX ;将AX中的数取负 NEG BYTE PTRBX ;对数据段中位于BX偏置处的字节取负 CMP比较指令比较指令(Compare)指令格式:CMP 目的,源目的,源 指令功能:目的源目的源,结果不回送到目的操作数中,仅反映在标志位上。用途:用在比较两个数大小又不破坏原操作数的场合。算术运算指令算术运算指令减法指令小结:减法指令小结:(上述五种指令都做减法运算)对于双操作数指令(对于双
18、操作数指令(SUB、SBB、CMP):):源操作数可以是寄存器、存储器或立即数;目的操作数可以是寄存器、存储器,但不能为立即数;两个操作数不能同时为存储器。对于单操作数指令(对于单操作数指令(DEC、NEG):):目的操作数可以是寄存器、存储器,但不能为立即数;如果是存储器操作数,还必须说明其类型是字节还是字。运算之后,除DEC指令不影响指令不影响CF标志标志外,其它均影响影响OF、SF、ZF、AF、PF和和CF标志标志。在减法操作后,如果源操作数大于目的操作数,需要借位时,进位/借位标志CF将被置1。算术运算指令算术运算指令 例例 设AL1011 0001B,DL0100 1010B,求AL
19、DL。解:SUBAL,DL;与加法操作一样,对结果的解释取决于参与运算的数的性质,运算过程如下:二进制减法 当成无符号数 当成带符号数 1011 0001 177 79 0100 1010 74 )74 0110 0111 103 103 运算后标志位ZF0,AF1,CF0,SF0,PF0,OF1。讨论:讨论:两数为无符号数两数为无符号数:表示177与74的差是103。CF0表示没有借位,SF和OF无意义。两数为带符号数两数为带符号数:表示79(74),结果应为153。但结果却为正数(103),这是由于153溢出造成的。此时,SF和OF有重要意义。算术运算指令算术运算指令 AAS减法的减法的A
20、SCII调整指令调整指令(ASCII Adjust for Subtraction)指令格式:AAS 指令功能:将AL寄存器中的运算结果调整为正确的非压缩十进制数调整为正确的非压缩十进制数之差,仍保留在保留在AL中。使用前提:用SUB或SBB指令对两个非压缩十进制数或ASCII码表示的十进制数作减法,运算结果已存在AL。调整过程:若AL寄存器的低低4位位9或AF1,则:则:AL AL6,AF置1 将AL寄存器高4位清零 AH AHl,CF置l 否则否则,不需要调整算术运算指令算术运算指令 DAS减法的十进制调整指令减法的十进制调整指令(Decimal Adjust for Subtracion
21、)指令格式:DAS 指令功能:将AL中两个压缩BCD数相减后的结果调整为正确的压缩BCD数。高4位和低4位分别进行调整。使用前提:在两个压缩十进制数用SUB或SBB相减后,结果在AL中。调整过程:如果AL寄存器的低低4位位9或AF1 则:则:AL AL6,AF置1 如果此时AL高半字节高半字节9或标志位CFl 则则:AL AL60H,CF置1算术运算指令算术运算指令 例例 设ALBCD 56,CLBCD 98,求两数之差。解:运算过程如下:SUB AL,CL ;0101 0110BCD 56 ;-1001 1000BCD 98 DAS ;1011 1110低4位9,CF=AF=1 ;-0000
22、 0110减6调整 ;1011 1000调整后高半字节9 ;+0110 0000减60H调整 ;0101 1000BCD 58,CF=1 ;结果为AL=BCD 58,CF=1,表示右借位算术运算指令算术运算指令(Multiply)MUL无符号数乘法指令无符号数乘法指令(Multiply)指令格式:MUL 源源 指令功能:把源操作数和累加器中的数都当成无符号数,然后将两个数相乘,操作数可以是字节或字。源操作数是一个字节源操作数是一个字节:原操作数与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。即 AX AL*源源。源操作数是一个字源操作数是一个字:原操作数与累加器
23、AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。即 (DX,AX)AX*源源 操作数要求:操作数要求:l可以是寄存器、存储单元,但不能是立即数不能是立即数;l源操作数是存储单元存储单元时,必须在操作数前加加B或或W说明是字节还是字。算术运算指令算术运算指令例例 MUL DL ;AX AL*DL MUL CX ;(DX,AX)AX*CX MUL BSI ;AX AL*(内存中某字节),B说明字节乘法 MUL WBX ;(DX,AX)AX*(内存中某字),W说明字乘法 注意:注意:MUL指令执行后影响影响CF和和OF标志标志。l如果结果的高半部分高半部分(字节操作为
24、AH、字操作为DX)不为零不为零,表明其内容是结果的有效位,则CF和和OF均置均置1。l否则,CF和和OF均清均清0。据此可检测并去除结果中的无效前导零。据此可检测并去除结果中的无效前导零。乘法指令使AF、PF、SF和和 ZF的状态不定的状态不定。例例 设AL55H,BL14H,计算它们的积。解:MUL BL 结果:AX06A4H。由于AH06H0,高位部分有效,所以置CF1,OF1。算术运算指令算术运算指令例例 试计算FFHFFH。解:用二进制表示成如下形式:1111 1111 1111 1111 1111 1110 0000 0001 作为无符号数:表示25525565025,结果正确。作
25、为带符号数:表示(一1)(一1)一511,显然结果不正确。用MUL指令作带符号数的乘法,会得到错误的结果,必须用IMUL指令,才能使(一1)(一1)得到正确的结果0000 0000 0000 0001。算术运算指令算术运算指令 IMUL整数乘法指令整数乘法指令(Integer Multiply)指令格式:IMUL 源 指令功能:把源操作数和累加器中的数都作为带符号数,进行相乘。存放结果的方式与存放结果的方式与MUL相同:相同:l源操作数为字节:与AL相乘,双倍长结果送到AX中;l源操作数为字:与AX相乘,双倍长结果送到DX和AX中,最后给乘积赋予正确的符号。对标志位的影响:对标志位的影响:l乘
26、积的高半部分高半部分不是低半部分的符号扩展(不是全不是全0或全或全1),则高位部分为有效位,表示它是积的一部分,于是置置CFOF1;l结果的高半部分为全高半部分为全0或全或全1,表明它仅包含了符号位,那么使CF=OF0。lAF、PF、SF和和 ZF不定不定。算术运算指令算术运算指令 AAM乘法的乘法的ASCII调整指令调整指令(ASCII Adjust for Multiply)指令格式:AAM 指令功能:对AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,在AX中得到正确的非压缩十进制数的乘积,高位在AH中,低位在AL中。调整过程:把AL寄存器内容除以10,商放在AH中,余数在AL中。
27、即:AH AL/10所得的商所得的商AL AH/10所得的余数所得的余数 注意:注意:两个ASCII码数相乘之前,先屏蔽掉每个数字的高半字节,使每个字节包含一个非压缩十进制数(BCD数),再用MUL指令相乘,乘积放到AL寄存器中,然后用AAM指令进行调整。标志位的影响:影响影响ZF、SF和和PF,但AF、CF和和OF无定义无定义。8086的指令系统中,十进制乘法运算不允许采用压缩十进制数,故调整指令仅此一条。算术运算指令算术运算指令例例 求两个非压缩十进制数求两个非压缩十进制数0909和和0606之乘积。之乘积。解:MOVAL,09H;置初值MOVBL,06HMULBL;AL09与06之乘积3
28、6HAAM;调整得AH05H(十位),AL04H(个位)结果:AX0504H,即BCD数54。例例 如果如果ALAL和和BLBL中分别存放中分别存放9 9和和6 6的的ASCIIASCII码,求两数之积。码,求两数之积。解:用以下指令实现:ANDAL,0FH;屏蔽高半字节ANDBL,0FHMULBL;相乘AAM;调整如要将结果转换成ASCII码,可用指令ORAX,3030H实现,使AX3534H。算术运算指令算术运算指令(Division)DIV无符号数除法指令无符号数除法指令(Division,unsigned)指令格式:DIV 源源 指令功能:对两个无符号二进制数进行除法操作。源操作数为字
29、节源操作数为字节:16位被除数必须放在AX中,8位除数为源操作数。AL AX源源(字节字节)的的商商 AH AX源源(字节字节)的的余数余数 若被除数只有8位,必须把它放在AL中,并将AH清0。源操作数为字源操作数为字:32位被除数在(DX,AX)中,16位除数作源操作数。AX (DX,AX)源源(字字)的的商商 DX (DX,AX)源源(字字)的的余数余数 若被除数、除数都是16位,则将16位被除数送到AX中,再将DX清0。注意:注意:源操作数可以是寄存器、存储单元;DIV指令执行后,所有标志位均无定义。算术运算指令算术运算指令 IDIV整数除法指令整数除法指令(Integer Divisi
30、on)指令格式:IDIV 源源 指令功能:对两个带符号二进制数进行除法操作(也称为带符号数除法)注意:注意:操作与DIV相同;商和余数都是带符号数,且规定余数的符号和被除数的相同余数的符号和被除数的相同;指令执行后,所有标志位均无定义标志位均无定义。无论对(DIV)还是(IDIV),都要注意溢出问题:字节操作时字节操作时:被除数的高8位绝对值大于除数的绝对值,则产生溢出。(对于无符号数对于无符号数,允许最大商为FFH;对于带符号数对于带符号数,允许商的范围为-127+127,或-81H+7FH);字操作时字操作时:被除数的高16位绝对值大于除数的绝对值,则产生溢出。(对于无符号数,允许最大商为
31、FFFFH;对于带符号数,允许商的范围为-32767+32767,或-8001H7FFFH)。算术运算指令算术运算指令带符号数除法指令,字节操作时要求被除数为16位,字操作时要求被除数为32位,如果被除数不满足这个条件,不能简单地将高位置如果被除数不满足这个条件,不能简单地将高位置0,而应该用符号扩展指令(Sign Extension)将被除数转换成除法指令所要求的格式。例 两个无符号数7A86H和04H相除,商应为多少?解:MOV AX,7A86H MOV BL,04H DIV BL 结果:正确的商应为1EA1H。由于BL中的除数04H为字节,被除数为字,商1EA1H大于AL中能存放的最大无
32、符号数FFH,产生除法错误中断。算术运算指令算术运算指令 CBW把字节转换为字指令把字节转换为字指令(Convert Byte to Word)指令格式:CBW 指令功能:把寄存器AL中字节的符号位扩充到AH的所有位。(AH被称为AL的符号扩充)扩展方法扩展方法:若若AL中的中的D70,则将这个,则将这个0扩展到扩展到AH中,使中,使AH00H,即,即:D7 D0 D7 D0 AH AL AL=正数若若AL中的中的D71,则将这个,则将这个1扩展到扩展到AH中,使中,使AHFFH,即:,即:D7 D0 D7 D0 AH AL AL=负数 注意:注意:CBW指令执行后,不影响标志位。指令执行后,
33、不影响标志位。0 00 1 11算术运算指令算术运算指令 CWD把字转换成双字指令把字转换成双字指令(Convert Word to Double Word)指令格式:CWD 指令功能:把AX中字的符号值扩充到DX寄存器的所有位。扩展方法:若若AX的的D150,则,则DX 0000H;若若AX的的D151,则,则DX FFFFH。注意:CWD指令执行后,也不影响标志位不影响标志位。AAD除法的除法的ASCII调整指令调整指令(ASCII Adjust for Division)指令格式:AAD 指令功能:在做除法前,把BCD码转换成二进制数。调整过程:AL AH10AL;AH 00 注意:注意
34、:AX中的两位非压缩格式的BCD数除以一个非压缩的BCD数前,要先用AAD指令把AX中的被除数调整成二进制数,并存到AL中,才能用DIV指令进行运算。根据AL寄存器结果影响影响SF、ZF、PF,但对OF、CF、AF无定义。算术运算指令算术运算指令 例例 编写程序,计算编写程序,计算75756 6l 23l 23解:该除法运算过程表示如下:(注:75以BCD码的形式存放)算术运算指令算术运算指令程序如下:程序如下:FIRSTDB06H;除数6 SECONDDB75H ;被除数75H THIRDDB2 DUP(0);存商 FOURDB?;存余数 MOVAH,00H;第一个被除数高位AH清0 MOV
35、AL,SECOND;AL被除数75 ANDAL,0F0H;截取高4位 MOVCL,04H ROLAL,CL;移至低4位 DIVFIRST;AX/06,即000706;得结果:AL商为1,AH余数1 MOVTHIRD+1,AL;结果单元第一个商1 算术运算指令算术运算指令 MOVAL,SECOND;AL被除数75 ANDAL,0FH ;AL截低4位,故AX0105H AAD;将AX中内容0105H调整为0FH DIVFIRST;0FH/6,结果:AL商为2,AH余数3 MOVTHIRD,AL;THIRD单元第二个商2 MOV FOUR,AH ;FOUR单元第二个余数3 0675020103FIRSTSECONDTHIRDTHIRD+1FOUR除数被除数商余数数据存放格式数据存放格式