第2章 8086的指令系统(二)_第1页
第2章 8086的指令系统(二)_第2页
第2章 8086的指令系统(二)_第3页
第2章 8086的指令系统(二)_第4页
第2章 8086的指令系统(二)_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章8086的指令系统(二)2.2算术运算类指令四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算请注意算术运算类指令对标志的影响掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV理解:CBW/CWD、DAA/DAS、AAA/AAS/AAM/AAD2加法指令ADDADD指令将源与目的操作数相加,结果送到目的操作数ADD指令按状态标志的定义相应设置3ADDreg,imm/reg/mem

;reg←reg+imm/reg/memADDmem,imm/reg

;mem←mem+imm/reg例题2.17amoval,0fbh

;al=0fbh不影响标志位addal,07h

;al=02h标志位设置如下:;11111011;00000111;------------;(1)00000010;CFOFSFPFZFAF;1000014DEBUG演示!5例2.17a:加法运算moval,0fbh

;al=0fbhaddal,07h

;al=02hmovwordptr[200h],4652h

;[200h]=4652hmovbx,1feh

;bx=1fehaddal,bl

;al=00haddwordptr[bx+2],0f0f0h

;[200h]=3742h6ADD注意:标志位的设置,如教材。带进位加法指令ADCADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数ADC指令按状态标志的定义相应设置ADC指令主要与ADD配合,实现多精度加法运算7ADCreg,imm/reg/mem

;reg←reg+imm/reg/mem+CFADCmem,imm/reg

;mem←mem+imm/reg+CF例题2.17b8例2.17b:用ADD、ADC指令执行两个双字加法运算。注:双字表示方法——DX:AX、BX:CX

计算:0002F360H

+0005E020H=0008D380H设执行指令前:

(DX)=0002H,(AX)=F360H,

(BX)=0005H,(CX)=E020HADDAX,CXADCDX,BX

执行第一条指令ADD:

F360H

+E020H(AX)=D380H,SF=1,ZF=0CF=1,OF=0执行第二条指令ADC:

0002H+0005H+1H

(CF)

(DX)=0008H,SF=0,ZF=0CF=0,OF=01←D380H0008H增量指令INC(increment)INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志9INCreg/mem;reg/mem←reg/mem+1例:INCCX设指令执行前:(CX)=0005H

指令执行后:(CX)=0006H

ADDCX,1

(一般不用这种方式)

减法指令SUB(subtract)SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志10SUBreg,imm/reg/mem

;reg←reg-imm/reg/memSUBmem,imm/reg

;mem←mem-imm/reg例题2.18a例2.18a:减法运算moval,0fbh

;al=0fbhsubal,07h

;al=0f4h,CF=0movwordptr[200h],4652h

;[200h]=4652hmovbx,1feh

;bx=1fehsubal,bl

;al=0f6hsubwordptr[bx+2],0f0f0h

;[200h]=5562h,CF=111SUB带借位减法指令SBBSBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。SBB指令按照定义相应设置状态标志SBB指令主要与SUB配合,实现多精度减法运算12SBBreg,imm/reg/mem

;reg←reg-imm/reg/mem-CFSBBmem,imm/reg

;mem←mem-imm/reg-CF例题2.18b例2.18b:双字减法movax,4652h ;ax=4652hsubax,0f0f0h ;ax=5562h,CF=1movdx,0234h ;dx=0234hsbbdx,0f0f0h ;dx=1143h,CF=1;DX.AX=02344652H

-F0F0F0F0H

=11435562H13SBB减量指令DEC(decrement)DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志14DECreg/mem;reg/mem←reg/mem-1INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整求补指令NEG(negative)NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样15NEGreg/mem;reg/mem←0-reg/mem例题2.19

求补运算不等于求负数的补码!例2.19:求补运算movax,0ff64hnegal;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1subal,9dh;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1negax;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1decal;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1negax;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=016NEG比较指令CMP(compare)CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志CMP指令执行的功能与SUB指令,但结果不回送目的操作数17CMPreg,imm/reg/mem ;reg-imm/reg/memCMPmem,imm/reg ;mem-imm/reg例题2.20例2.20:比较AL与100

cmpal,100

;al-100

jbbelow

;al<100,跳转到below执行

subal,100

;al≥100,al←al-100

incah

;ah←ah+1below: ...18

执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等CMP19例:x、y、z均为双精度数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+24-z,并用W,W+2单元存放w。

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元2.2.3乘法指令MULr8/m8;无符号字节乘法;AX←AL×r8/m8MULr16/m16;无符号字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符号字节乘法;AX←AL×r8/m8IMULr16/m16;有符号字乘法;DX.AX←AX×r16/m1620例题2.21说明乘法指令的功能乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX乘法指令利用OF和CF判断乘积的高一半是否具有有效数值21乘法指令对标志的影响乘法指令如下影响OF和CF标志:MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1乘法指令对其他状态标志没有定义22

对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)对标志没有影响:指令执行不改变标志状态例2.21:乘法运算moval,0b4h ;al=b4h=180movbl,11h ;bl=11h=17mulbl ;ax=Obf4h=3060;OF=CF=1,AX高8位不为0moval,0b4h ;al=b4h=-76movbl,11h ;bl=11h=17imulbl ;ax=faf4h=-1292;OF=CF=1,AX高8位含有效数字23分析:如果将上例中BL值改为1,则标志位为?2.2.4除法指令DIVr8/m8 ;无符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数DIVr16/m16

;无符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数24IDIVr8/m8 ;有符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数IDIVr16/m16

;有符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数例题2.22说明除法指令的功能除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX除法指令对标志没有定义除法指令会产生结果溢出25除法错中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内26例2.22:除法运算movax,0400h ;ax=400h=1024movbl,0b4h ;bl=b4h=180divbl ;商al=05h=5

;余数ah=7ch=124movax,0400h

;ax=400h=1024movbl,0b4h ;bl=b4h=-76idivbl ;商al=f3h=-13

;余数ah=24h=3627分析:如果将上例中BL值改为1,有什么问题?2.2.5符号扩展指令CBW ;AL的符号扩展至AH;如AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变CWD ;AX的符号扩展至DX;如AX的最高有效位是0,则DX=00;AX的最高有效位为1,则DX=FFFFH。AX不变28什么是符号扩展符号扩展指令常用于获得倍长的数据例题2.23例题2.24符号扩展的概念符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据FF00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为FFFFFF00H(仍表示有符号数-256)29例2.23:符号扩展moval,80h ;al=80hcbw

;ax=ff80haddal,255

;al=7fhcbw

;ax=007fh30例2.24:AX÷BXcwd ;DX.AX←AXidivbx ;AX←DX.AX÷BX31

对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这就是零位扩展2.2.6十进制调整指令32BCD码有压缩和非压缩两种格式:例:(95)10=(10010101)BCD

压缩的BCD码:用四位二进制数表示一位十进制数非压缩的BCD码:用八位二进制数表示一位十进制数例:(95)10=(0000100100000101)BCD

BCD码

BCD码—>建立了二进制与十进制的联系算术运算指令只能完成二进制运算,十进制数调整指令可二进制运算结果进行调整,得到用BCD码表示的十进制数。33

8位非压缩BCD码的高4位可以是任意值,因此数字字符的ASCII码看成一种非标准的压缩的BCD码例:5的ASCII码为35H(00110101)B

十进制调整指令共有6条指令,分为:

(1)压缩的BCD码调整指令(2)非压缩的BCD码调整指令5

(非压缩的BCD码)34例:十进制计算28+36=64

28H+36H

5EH用指令进行二进制加法运算的结果为:

写成BCD码应为

:(00101000

)BCD+(00110110

)BCD=(01100100

)BCD

问题:逢十六进位解决方法:

5EH+6H

64H

(01100100

)BCD加6补偿加法的调整规则:

以压缩的BCD码加法调整指令为例介绍十进制调整指令的基本思路和方法:35例:十进制计算28+69=97

28H+69H

91H用指令进行二进制加法运算的结果为:

写成BCD码为

:(00101000

)BCD+(01101001

)BCD=(10010111

)BCD

问题:逢十六进位解决方法:

91H+6H

97H

(10010111

)BCD加6补偿根据上述分析,总结加法的调整规则:两个BCD码数位相加后,若产生了进位或和大于9,加6调整。36十进制调整指令DAA:DAA

(AL)

把AL中存放的加法的和调整为压缩的BCD码

若AF=1,或(AL)0~3=A~F若CF=1,或(AL)4~7=A~F则(AL)←(AL)+

60H,CF=1则(AL)←(AL)+

06H,AF=1调整方法

37例:十进制加法计算:28+69=97

设执行指令前:(AL)=(00101000)BCD=28H(=28D)

(CL)=(01101001)BCD=69H(=69D)

执行的指令为:ADDAL,CLDAA执行ADD指令:(AL)=91H,CF=0,AF=1执行DAA指令:(AL)←(AL)+06H=91H+06H=

97H

(AL)=(10010111)BCD=97D,CF=0,AF=1压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)DAA;AL←将AL的加和调整为压缩BCD码(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)DAS;AL←将AL的减差调整为压缩BCD码38使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态例题2.25a例题2.25b例题2.26例2.25a:压缩BCD加法moval,68h;al=68h,压缩BCD码表示真值68movbl,28h;bl=28h,压缩BCD码表示真值28addal,bl;二进制加法:al=68h+28h=90hdaa

;十进制调整:al=96h;实现压缩BCD码加法:68+28=9639例2.25b:压缩BCD减法moval,68h;al=68h,压缩BCD码表示真值68movbl,28h;bl=28h,压缩BCD码表示真值28subal,bl;二进制减法:al=68h-28h=40hdas

;十进制调整:al=40h;实现压缩BCD码加法:68-28=4040例2.26:压缩BCD减法movax,1234hmovbx,4612hsubal,bldas

;34-12=22,CF=0xchgal,ahsbbal,bhdas

;12-46=66,CF=1xchgal,ah ;11234-4612=662241非压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)AAA;AL←将AL的加和调整为非压缩BCD码;AH←AH+调整的进位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)AAS;AL←将AL的减差调整为非压缩BCD码;AH←AH-调整的借位42使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无定义例题2.27a例题2.27b例2.27a:非压缩BCD加movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9addal,bl;二进制加法:al=08h+09h=11haaa;十进制调整:ax=0707h;实现非压缩BCD码加法:68+9=7743例2.27b:非压缩BCD减movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9subal,bl;二进制减法:al=08h-09h=ffhaas;十进制调整:ax=0509h;实现非压缩BCD码减法:68-9=5944非压缩BCD码乘、除调整指令(MULr8/m8)AAM;AX←将AX的乘积调整为非压缩BCD码AAD;AX←将AX中非压缩BCD码扩展成二进制数(DIVr8/m8)45AAM指令跟在字节乘MUL之后,将乘积调整为非压缩BCD码AAD指令跟在字节除DIV之前,先将非压缩BCD码的被除数调整为二进制数AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、CF和AF无定义例题2.27c例题2.27d例2.27c:非压缩BCD乘movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9mulbl;二进制乘法:al=08h×09h=0048haam;十进制调整:ax=0702h;实现非压缩BCD码乘法:8×9=7246例2.27d:非压缩BCD除movax,0608h;ax=0608h,非压缩BCD码表示真值68movbl,09h;bl=09h,非压缩BCD码表示真值9aam;二进制扩展:ax=68=0044hdivbl;除法运算:商al=07h,余数ah=05h;实现非压缩BCD码初法:

68÷9=7(余5)47习题2.9设X、Y、Z、V均为16位带符号数,分别存放在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?48VZYX65F3020024E00500习题2.9:算术运算1movax,XimulY ;DX.AX=X×Ymovcx,axmovbx,dx ;BX.CX=X×Ymovax,Zcwdaddcx,axadcbx,dx ;BX.CX=X×Y+Z49习题2.9:算术运算2subcx,540sbbbx,0;BX.CX=X×Y+Z-540movax,Vcwdsubax,cxsbbdx,bx;DX.AX=V-(X×Y+Z-540)idivX;DX.AX=(V-(X×Y+Z-540))÷X50教学提示在正确理解每条指令的功能基础上,可以阅读和编写有实际意义的程序段51多多阅读程序段2.3位操作类指令位操作类指令以二进制位为基本单位进行数据的操作注意这些指令对标志位的影响1、逻辑运算指令ANDORXORNOTTEST2、移位指令SHLSHRSAR3、循环移位指令ROLRORRCLRCR5253逻辑非指令:NOTOPR*OPR不能为立即数

执行操作:(OPR)

(OPR)*不影响标志位

逻辑与指令:ANDDST,SRC执行操作:(DST)(DST)(SRC)逻辑或指令:ORDST,SRC执行操作:(DST)(DST)(SRC)异或指令:XORDST,SRC执行操作:(DST)(DST)(SRC)测试指令:TESTOPR1,OPR2

执行操作:(OPR1)(OPR2)CFOFSFZFPFAF00***无定义

根据运算结果设置2.3.1逻辑运算指令例题:逻辑运算moval,45h

;逻辑与al=01handal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h

;逻辑或al=75horal,31h

;CF=OF=0,SF=0、ZF=0、PF=0moval,45h

;逻辑异或al=74hxoral,31h ;CF=OF=0,SF=0、ZF=0、PF=1moval,45h

;逻辑非al=0bahnotal

;标志不变54例2.32:测试为0或1testal,01h ;测试AL的最低位D0jnzthere

;标志ZF=0,即D0=1

;则程序转移到there...;否则ZF=1,即D0=0,顺序执行there:...55TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况TEST逻辑运算指令的妙用56源操作数1—保留原值

0—置0特点:

1010

0

011

目的操作数源操作数(1)逻辑与操作保留清00010

何时该用何种逻辑操作?逻辑运算指令的妙用57源操作数1—置10—保留原值特点:

10100

011

目的操作数源操作数(2)逻辑或操作置1保留1011

源操作数1—取反0—保留原值特点:10100011

目的操作数源操作数(3)异或操作求反保留1001逻辑运算指令的妙用58

如何确定源操作数?

例:将AL的D0位和D1位清0。

设(AL)=BFH,指令为AND AL,

?分析:10111111B

11111100B

(FCH)10111100B应将源操作数取为立即数FCH,指令为:

ANDAL,0FCH

执行指令后:(AL)=BCH

根据上述操作的特点,可以确定该用什么操作实现需要的功能:保留某些位(其他位清0)用逻辑与操作某位置1

用逻辑或操作,某位求反用异或操作

逻辑运算指令的妙用59例:将AL中的大写字母转换为小写字母(AL)=41H即41H61H指令为:ORAL,?分析:01000001B(41H)

00100000B(20H)20H执行指令后:(AL)=61H小写转换为大写的指令为:

ANDAL,?0DFH∧

110

11111B

(DFH)执行指令后:(AL)=41H

01100001B(61H)

0100

0001B(41H)

根据需要的功能,先确定逻辑运算指令,再利用逻辑运算指令的特点确定源操作数。

逻辑运算方法:2.3.2移位指令(shift)601)逻辑左移指令

SHLopr,count2)算术左移指令SAL opr,countoprCF补0SHL/SAL移位例:将BL中的值逻辑左移1位,设(BL)=AFHSHL BL,1101011110指令执行前010

1111

01指令执行后执行指令后:(BL)=5EH(分为逻辑移位、算术移位和循环移位三类)2.3.2移位指令(shift)613)逻辑右移指令

SHRopr,count4)算术右移指令SAR opr,countoprCF补0SHR移位S保持符号SAR移位例:将BL中的值逻辑右移1位,设(BL)=AFH

SHR BL,1

1010

11110指令执行前0

1010

1111指令执行后执行指令后:

(BL)=57H2.3.2移位指令(shift)62例:将BL中的值算术右移1位,设(BL)=AFHSAR BL,11

010

11110指令执行前执行指令后:(BL)=D7H1

10101111指令执行后

逻辑移位总是补0

,算术移位保持符号。注意:

*OPR可用立即数以外的任何寻址方式*count

=1,SHLOPR,1

count

>1,MOVCL,count

SHLOPR,CL;以SHL为例*条件标志位:

CF=移入的数值

OF=1count

=1时,最高有效位的值发生变化

OF=0count

=1时,最高有效位的值不变移位指令:

SF、ZF、PF根据移位结果设置

AF无定义63例2.33:移位指令movcl,4moval,0f0h

;al=f0hshlal,1

;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shral,1

;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1saral,1

;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0saral,cl

;al=03h;CF=1,SF=0、ZF=0、PF=164移位指令的妙用注意

逻辑左移一位相当于无符号数乘以2

逻辑右移一位相当于无符号数除以2算术左移一位相当于有符号数乘以2算术右移一位相当于有符号数除以265MOVAL,15SHRAL,1;(AL)=7,相当于AL←(AL)÷2,CF=166PUSH BX ;保护BX寄存器的原来的值

SHL AX,1;左移一位,AX←(原AX)×2MOV BX,AX;BX←2(原AX)

SHL AX,1;左移一位,AX←4(原AX)

SHL AX,1 ;左移一位,AX←8(原AX)

ADD AX,BX;AX←原(8AX)+原(2AX)

POP BX ;恢复BX寄存器的原来的值[例]用移位指令实现AX←(AX)×10例2.34:移位实现乘实现:DX=3*AX+7*BXmovsi,axshlsi,1 ;si←2×axaddsi,ax ;si←3×axmovdx,bxmovcl,03hshldx,cl ;dx←8×bxsubdx,bx ;dx←7×bxadddx,si ;dx←7×bx+3×ax6768例:已知:(BX)=84F0H,请写一条指令完成以下要求:(1)(BX)为无

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论