资源描述
<p>单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,本教案内容,第3章 8086CPU指令系统,汇编语言指令,8086指令分类,数据与转移地址的寻址方式,数据传送类指令,算术运算类指令,逻辑运算类指令,移位类指令,标志位操作指令,转移指令,循环控制指令,子程序调用返回指令,中断调用返回指令,字符串操作指令,I/O输入输出指令,其它指令,宏指令,1,3.5 算术运算类指令,只要ALU涉及到运算,其,运算结果会影响6个状态标志位,。,2,3.5 算术运算类指令,一、加减法指令,(一)加法指令(ADD、ADC),(Add byte or word/with carry),格式:,ADD DST,SRC,;(DST)(SRC)+(DST),ADC DST,SRC,;(DST)(SRC)+(DST)(CF),SRC可以取立即数、通用寄存器和存储单元,DST可以取通用寄存器和存储单元,但SRC和DST不能同时取存储单元。,3,3.5 算术运算类指令,例如,设变量VAR1为字型变量,VAR2为字节变量,则有,ADD AX,56A0H,;(AX)(AX)+56A0H,ADC VAR1,127FH,;(VAR1)(VAR1)127FH(CF),ADD BL,VAR2,;(BL)(BL)+(VAR2),ADD BYTE PTR VAR1,AL,;(VAR1的低字节)(VAR1的低字节)(AL),4,3.5 算术运算类指令,ADD和ADC指令会影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。,例:(AX)125AH,执行ADD AX,78C6H后,(AX)8B20H,CF=0,AF=1,OF=1,SF=1,ZF=0,PF=0。,5,3.5 算术运算类指令,例3.2 设在DVAR开始的连续8字节中分别存放着两个数A和B(每个数为32位),求C=A+B,并将结果C放到DVARC开始的内存中。,解:设这两个数分别为A=00127654H、B=00049821H,则在数据段中有变量定义语句:,DVAR DD00127654H,DD 00049821H,DVARC DD?,6,3.5 算术运算类指令,LEA DI,DVAR,MOV AX,4DI;取低位字到(AX),ADD AX,DI;低位字相加,MOV WORD PTR DVARC,AX,MOV AX,6DI;取高位字到(AX),ADC AX,2DI;高位字相加(带进位),MOV WORD PTR DVARC+2,AX,7,3.5 算术运算类指令,(二)减法指令(SUB、SBB),Subtract byte or word/with borrow,格式:,SUB DST,SRC;,(DST)(DST)(SRC),SBB DST,SRC,;(DST)(DST)(SRC)(CF),指令中DST、SRC的说明与ADD指令相同。,8,3.5 算术运算类指令,例如,设VAR1为字型变量,VAR2为字节变量,则有,SUB AL,2CH,;(AL)(AL)2CH,SUB VAR1,2184H,;(VAR1)(VAR1)2184H,SBB DL,VAR2SI,;(DL)(DL)-(OFFSET VAR2)(SI)-(CF),9,3.5 算术运算类指令,减法指令SUB和SBB会影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。,例如:MOV AX,1734H,SUB AX,5566H,执行后有,(AX)=0C1CEH,CF=1,AF=1,OF=0,SF=1,ZF=0,PF=0,10,3.5 算术运算类指令,例3.3 设DVAR1和DVAR2保存有双字数,求DVAR1DVAR2,并将结果保存在双字变量DVARR中。,解:设在数据段中有变量定义语句:,DVAR1DD78127654H,DVAR2DD 12349821H,DVARRDD?,11,3.5 算术运算类指令,MOV AX,WORD PTR DVAR1,SUB AX,WORD PTR DVAR2,MOV WORD PTR DVARR,AX,MOV AX,WORD PTR DVAR12,SBB AX,WORD PTR DVAR22,MOV WORD PTR DVARR+2,AX,12,3.5 算术运算类指令,(三)取负指令(NEG),Negate byte or word,格式:,NEG DST,;(DST)0(DST),说明:,DST可以取通用寄存器和存储单元。,NEG指令影响PSW中的6个状态标志位.,13,3.5 算术运算类指令,例如,设(AL)=01H,则执行指令 NEG AL 后,(AL)=0FFH,14,3.5 算术运算类指令,二、比较指令,CMP Compare byte or word,格式:,CMP DST,SRC;(DST)(SRC),并,设置PSW中的状态标志位,说明:,CMP指令与减法指令类似,只是其结果不保存到DST。,15,3.5 算术运算类指令,CMP指令将正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。,对两个数进行CMP运算,其主要目的是为了比较两数的大小、相等关系:,(1)若两数相减结果为0,即两数相等,则ZF1;,(2)SF等同于最高位;,(3)CF,OF视具体情况而定,。,16,3.5 算术运算类指令,当两个无符号数进行比较时,如果CF0、ZF0,则表示(DST)(SRC);如果CF1,则表示(DST)(SRC),,当OF SF1时,(DST)28H。,如果采用CMP BL,AL语句,则CF1,说明28H113。,如果采用CMP BL,AL语句,则OF0,SF1,这说明113113。,如果采用CMP BL,AL语句,则OF1,SF0,这说明11357。,20,3.5 算术运算类指令,三、增量减量指令,格式:,INC DST ;(DST)(DST)1,DEC DST ;(DST)(DST)1,说明:,INC和DEC指令可以正常影响PSW中的5个标志位:AF、OF、SF、ZF和PF,但它们不会影响CF位。,21,3.5 算术运算类指令,四、乘法和除法指令,(一)乘法指令,MUL SRC;无符号数相乘,IMUL SRC;有符号数相乘,说明:,指令的目的操作数隐含在AX(或AL)中,,,SRC可以取通用寄存器和存储单元,它必须有类型,,而且只能是字节和字,它们决定了乘法操作的类型。,22,3.5 算术运算类指令,乘法操作的类型:,当SRC为字节时,表示将AL中的数与(SRC)相乘,其结果放入(AX)中;,AX,(AL)(SRC),积,字节乘法,SRC(乘数,),DST(被乘数),23,3.5 算术运算类指令,乘法操作的类型:,当SRC为字时,表示将AX中的数与(SRC)相乘,其结果的高16位保存在(DX),低16位保存在(AX)。,DX:AX,(AX)(SRC),积,字乘法,24,3.5 算术运算类指令,MUL和IMUL指令只对PSW的CF、OF位有影响,其规则为:,即 CF=0,OF=0表示,字节字节字节,字 字 字,对MUL指令,字运算时,若结果的高字为0,则CF=0,OF0;,字节运算时,若结果的AH为0,则CF=0,OF0;否则CF=1,OF1。,25,3.5 算术运算类指令,对IMUL指令,字运算时,若结果的DX为符号扩展,则CF=0,OF0;否则CF=1,OF1。,字节运算时,若结果的AH为符号扩展,则CF=0,OF0;否则CF=1,OF1。,26,例1.下列指令是,合法,的。,MUL CX;,(DX:AX)(AX)*(CX),为字操作,IMUL CL;,(AX)(AL)*(CL),为字节操作,3.5 算术运算类指令,下列指令是,非法,的。,MUL AL,BL,IMUL 05H,DST(被乘数)应为隐含寻址,SRC(乘数)不能为立即数寻址,27,3.5 算术运算类指令,例3.7 乘法的字节运算。要计算两个无符号数2CH、42H的乘积,结果保存在AX中。,程序段如下:,MOV AL,2CH,MOV BL,42H,MUL BL,结果(AX)0B58H,CF1,OF1。,28,3.5 算术运算类指令,例3.9 字节字运算。要计算两个有符号数15H、FB78H的乘积。,有符号数FB78H为负数(-1160)。程序段为:,MOVAL,15H,CBW,MOV BX,0FB78H,IMULBX,执行得到结果(DX)FFFFH,(AX)A0D8H,CF0,OF0。,29,3.5 算术运算类指令,(二)除法指令,格式:,DIV SRC;无符号数的除法,IDIV SRC;有符号数的除法,说明:,指令的目的操作数隐含,在DX:AX(或AX)中,,SRC可以取通用寄存器和存储单元,它必须有类型,,而且只能是字节和字,它们决定了除法操作的类型。,30,3.5 算术运算类指令,除法操作类型:,当SRC为字节时,表示将AX中的16位二进制数除以8位二进制数(SRC),其结果的商保存在(AL)中,余数保存在(AH)中;,(AX)/(SRC),AL,商,字节除法,余数,AH,31,3.5 算术运算类指令,当SRC为字时,表示将DX与AX联合构成的32位二进制数除以16位二进制数(SRC),其结果的商保存在(AX)中,余数保存在(DX)中。,(DX:AX)/(SRC),AX,字除法,DX,商,余数,32,3.5 算术运算类指令,DIV和IDIV指令不影响PSW中的标志位.,除法不允许出现除数为0或商溢出,,若发生除数为0或商溢出则其结果没有意义,并引起中断。,33,例1.下列指令是,合法,的。,DIV BL,IDIV CX,DIV WORD PTR BXSI,3.5 算术运算类指令,下列指令是,非法,的。,DIV 12,DIV SI+02H,IDIV AX,BL,SRC(除数)不能为立即数寻址,SRC类型不明确,DST(被除数)应为隐含寻址,34,3.5 算术运算类指令,例3.10 字字节的除法运算。设要完成除法运算12345156。,解:被除数12345可以用一个字表示,除数156可以用一个字节表示,因此可以直接采用除法的字节运算。程序段为:,执行结果商(AL)4FH,余数(AH)15H,MOVAX,12345,MOVBL,156,DIVBL,35,3.5 算术运算类指令,例3.12 完成无符号除法运算00011240H0A0H。,解:被除数可以用一个双字表示,除数本身可以用一个字节表示,但除法运算只能采用双字字,因此除数应该变换成字。对无符号数来说,由字节变换成字只需要将高位字节填0。程序段为:,MOVAX,1240H,MOVDX,0001H,MOVBL,0A0H,MOVBH,0,DIVBX,执行结果商(AX)01B6H,余数(DX)0080H。,36,3.5 算术运算类指令,五、符号扩展指令,格式:,CBW,;将AL中的符号扩展到AH中,,形成一个字AX,CWD,;将AX中的符号扩展到DX中,,形成双字(DX:AX),37,3.5 算术运算类指令,CBW(Convert byte to word)为字节到字的符号扩展指令,将AL中的符号位D7扩展到AH:,当D70时,AH00H,当D71时,AHFFH,CWD(Convert word to doubleword)为字到双字的符号扩展指令,将AX中的符号位D15扩展到DX:,当D150时,DX0000H,当D151时,DXFFFFH,38,应用场合:,当两个长度不等的数进行加、减、乘法运算时,应将长度短的数的位数扩展,以使两数的长度一致。,3.5 算术运算类指令,对于无符号数来说,这种扩展只要将其高位补“0”就可以;但对带符号数来说高位扩展时应该补符号位。,39,例:设在数据段定义变量如下:,DAT1 DB 34H ;34H为变量a的一个设定值,DAT2 DB 56H ;56H为变量b的一个设定值,DAT3 DB 0E7H;0E7H为变量c的一个设定值,DATY DW?;DATY单元存放结果,3.5 算术运算类指令,试写出计算Y=a*b+c-18的程序,40,MOV AL,DAT1 ;取a,MOV BL,DAT2 ;取b,IMUL BL ;(AL)*(BL)(AX),MOV BX,AX ;(AX)(BX),MOV AL,DAT3 ;取c,CBW ;扩展AL AX,ADD AX,BX ;(AX)+(BX)(AX),SUB AX,18,MOV DATY,AX,Y=a*b+c-18,3.5 算术运算类指令,41,例:设X、Y、Z、V均为16位带符号数的地,址,试写出完成以下计算的指令序列:,(V-(X*Y+Z-540)X,3.5 算术运算类指令,MOV AX,X,IMUL Y,MOV CX,AX,MOV BX,DX,MOV AX,Z,CWD,42,ADD CX,AX,ADC BX,DX,SUB CX,540,SBB BX,0,MOV AX,V,CWD,SUB AX,CX,SBB DX,BX,IDIV X,3.5 算术运算类指令,(V-(X*Y+Z-540)X,43,</p>
展开阅读全文