微机原理第05章2_第1页
微机原理第05章2_第2页
微机原理第05章2_第3页
微机原理第05章2_第4页
微机原理第05章2_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

5.3数据操作类指令

5.3.1算术运算类指令

86系列CPU指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。1.加法指令(1)不带进位位的加法指令:ADD用来执行两个字或两个字节的相加操作,结果放在原来存放目的操作数的地方。例如:1/31/202315.3.1算术运算类指令ADDAL,50H

;AL和50H相加,结果放在AL中ADDCX,1000H;CX中的内容和1000H相加,结果放在CX中ADDDI,SI;

DI和SI的内容相加,结果放在DI中ADD[BX+DI],AX;BX+DI和BX+DI+1两个存储单元的内容和AX中的内容相加,结果放在BX+DI和BX+DI+1所指的存储单元中ADDAX,[BX+2000H];BX+2000H和BX+2001H所指的两单元的内容和AX的内容相加,结果放在AX中1/31/20232ADD例题MOVAL,7EH

;AL7EHADDAL,5BH;ALAL+5BH执行完毕后,AL=?

AL=0D9H各状态标志位的值:AF=1,CF=0,OF=1,PF=0,SF=1,ZF=0.011111100101101111011001+1/31/20233

(2)带进位位的加法指令

ADC在形式和功能上都和ADD指令类似,只有一点区别,就是ADC指令被执行时,将进位标志CF的值加在和中。如:ADCAX,SI;AX和SI中的内容以及CF的值相加,结果放在AX中ADC

DX,[SI];SI和SI+1所指的存储单元的内容和DX的内容以及CF的值相加,结果放在DX中ADC

BX,3000H;BX的内容和立即数3000H以及CF的值相加,结果放在BX中ADCAL,5AL的内容和立即数5以及CF的值相加,结果送AL中ADCAX,BX;(AX)+(BX)+CF→AX1/31/20234

ADC指令为实现多字节的加法运算提供了方便。比如,有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求进行运算后,得到的和放在2000H开始的内存单元中。可以用如下程序段实现这种多字节的加法:1/31/20235CLC

;清进位位CFMOV

SI,2000H;取第一个数的首地址MOV

AX,[SI];

将第一个数的低16位取到AXMOV

DI,3000H;取第二个数的首地址ADD

AX,[DI];

第一个数和第二个数的低16位相加MOV[SI],AX;

低16位相加的结果送到2000H,2001H单元MOV

AX,[SI+2];

取第一个数的高16位送到AX中ADC

AX,[DI+2];

两个数的高16位连同进位位相加MOV[SI+2],AX;

高16位相加的结果送到2002H,2003H单元1/31/20236例

多字节加法编写程序完成两个4字节无符号数加法。0107A379H+10067E4FH=?结果存放在哪里?MOVDX,0107H;第一个数高16位DXMOVAX,0A379H;第一个数低16位AXMOVBX,1006H;第二个数高16位BXMOVCX,7E4FH;第二个数低16位CXCLC;清除进位标志ADDAX,CX;AX+CXAX(低位)ADCDX,BX;DX+BX+CFDX(高位)

结果=110E21C8H存放在DX、AX里。低16位的CF对高16位有贡献,低16位的OF无意义,高16位运算的OF才为整个的OF。1/31/20237

INC只有1个操作数,执行时,操作数内容加1,再送回该操作数。本指令常用在循环程序中修改指针和循环次数。如:INCAL

;将AL中的内容加1INCCX

;将CX中的内容加1

INCBYTEPTR[BX+DI+500];将BX+DI+500所指存储单元的内容加1

注意:INC指令不影响进位标志CF的状态。如一个8位数据从零一直加1,再加1……,直到FE,再加1就变成了FF,再加1则低8位成为了00,同时产生了进位,但CF不等于1。即不能用INC指令来判断是否产生了进位。合成操作符PTR的使用MOVBYTEPTR[BX],1;字节操作数,[BX]←1MOVWORDPTR[BX],1;字操作数,[BX+1、BX]←1即:INC影响标志位ZF、SF、OF、PF和AF,但对进位标志CF没有影响(3)增量指令1/31/20238

ADD,ADC,INC都会影响标志位,其中只有一个例外,即INC指令不影响进位标志CF的状态。状态标志位中最主要的是CF、ZF、SF和OF,分别表示进位、结果为零、符号和溢出的情况。其中ZF、SF位设置比较简单,下面进一步分析CF和OF的设置。执行加法指令时,CF位是根据最高有效位是否有向高位的进位设置的,有进位时CF=1,无进位时CF=0,CF也可以理解为无符号数的溢出。

OF位则是根据操作数的符号及其变化情况来设置的:若两个操作数的符号相同,而结果的符号与之相反时,OF=1,否则OF=0。OF也可以理解为带符号数的溢出。1/31/20239

2.减法指令(1)不带借位的减法指令:SUB完成两个字节或两个字的相减.如:SUB

BX,CX;将BX中的内容减去CX中的内容,结果放在BX中SUB[BP+2],CL;将SS段的BP+2所指的单元中的值减去CL中的值,结果放在BP+2所指的堆栈单元中SUB

AL,20

AL中的数减去20,结果放在AL中SUB

SI,5010H;SI中的数减去5010H,结果放在SI中SUB

WORDPTR[DI],1000H;DI和DI+1所指的两单元中的数减去1000H,结果放在DI和DI+1所指的单元中1/31/202310

SBB在形式和功能上都和SUB指令类似,只是SBB指令在执行减法运算时,还要减去CF的值。在减法运算中,CF的值就是两数相减时,向高位产生的借位,所以,SBB在执行减法运算时,是用被减数减去减数,并减去低位字节相减时产生的借位。和带进位位的加法指令类似,SBB主要用在多字节减法运算中。例如:

SBB

AX,2030H;将AX的内容减去立即数2030H,并减去进位;位CF的值

SBB

WORDPTR[DI+2],1000H;将DI+2和DI+3所指的两单元的内容减去立即数1000H,并减去CF的值,结果放在DI+2和DI+3所指的单元中(2)带借位的减法指令1/31/202311

8D347A12-)6437AF36127A348D36AF3764≈≈2000H2001H2002H3000H解:MOVAX,[2000H]SUBAX,[3000H]MOV[2000H],AXMOVAX,[2002H]SBBAX,[3002H]MOV[2002H],AX例多字节减法运算1/31/202312

DEC只有1个操作数,执行时,将操作数的值减1,再将结果送回操作数。例如:DEC

AX;将AX的内容减1,再送回AX中DEC

BL;将BL的内容减1,结果送回BL中DEC

BYTEPTR[DI+2];将DI+2所指的单元的内容;减1,结果送回此单元编写延时程序:

MOVCX,0FFFFHNEXT:DECCXJNZNEXTHLT(3)减量指令1/31/202313

NEG

AL;将AL中的数取补码,送回AL

NEG

CX;将CX中的内容取补码,送回CXNEG指令对操作数执行求补运算,即用零减去操作数,所以NEG指令执行的也是减法操作,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样NEG指令也是一个单操作数指令(4)取补指令NEG1/31/202314MOV AX,0FF64HNEG AL ;AL=0-64H=9CH,(AX)=0FF9CH

;OF=0,SF=1,ZF=0,PF=1,CF=1SUB AL,9DH;AL=9CH-9DH=0FFH,(AX)=0FFFFH

;OF=0,SF=1,ZF=0,PF=1,CF=1NEG AX ;(AX)==0-0FFFFH=0001H

;OF=0,SF=0,ZF=0,PF=0,CF=1DEC AL ;AL=01H-1=0,(AX)=0000H

;OF=0,SF=0,ZF=1,PF=1,CF=1NEG AX ;(AX)=0000H

;OF=0,SF=0,ZF=1,PF=1,CF=0(4)取补指令求补运算,例:1/31/202315

CMP也是执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位。例如:CMP

AX,2000H;将AX的内容和2000H相比较,结果影响标志位CMP

AL,50H;将AL中的数和50H比较,结果影响标志位CMP

AX,[BX+DI+100];将累加器和两个存储单元的数相比,单元地址由BX+DI+100和BX+DI+101指出CMP

DX,DI;将DX和DI的内容相比一般情况,CMP指令后面经常会有一条条件转移指令,用来检查标志位的状态是否满足了某种关系。例:设累加器AX中的内容为4142H,执行指令CMPAX,4041H后,(AX)=

。执行SUBAX,4041H后,(AX)=

。4142H0101H(5)比较指令1/31/202316比较指令说明:CMPA,B(1)A,B为带符号数

①OF=0(即无溢出,结果正常),则SF=0时A>B,SF=1时A<B②OF=1(即有溢出),则SF=0时A<B,SF=1时A>B③所以从①、②可推出,OFSF=0时A>B;OFSF=1时A<B(2)A=B则ZF=1;A=B则ZF=0(3)A,B为无符号数,则CF=1时A<B;CF=0时A≥B

见课本123页表5-4。++1/31/202317(1)若把AL,BL中的内容看作是两个无符号数,比较结果如何?影响哪些标志位?(2)若把AL,BL中的内容看作是两个带符号数,比较结果如何?影响哪些标志位?(注意:对于带符号数,AL、BL中的数是补码形式)

解:(1)若为无符号数,则

AL=67H=01100111B=103,BL=9FH=10011111B=159,

所以AL<BL。而执行CMPAL,BL后,由于最高位产生了借位,所以CF=1,而运算结果不为零,所以ZF=0。例:设AL=67H,BL=9FH,当执行CMPAL,BL后,问:1/31/202318例:设AL=67H,BL=9FH,当执行CMPAL,BL后,问:(2)若把AL,BL中的内容看作是两个带符号数,比较结果如何?影响哪些标志位?

解:(2)若为带符号数,则

AL=67H=01100111B=+103D,BL=9FH=10011111B=-([0011111]求反+1)B=-97D,

所以AL>BL。而执行CMPAL,BL后,运算结果=200D,超出了字节运算范围-128~+127,所以OF=1,由于AL>BL,所以SF与OF相同,即SF=1,而运算结果不为零,所以ZF=0。1/31/202319

3.乘法指令乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。其中的操作数可以是寄存器操作数或存储器操作数,而隐含操作数的为AL或AX。从下图5.8中可以看出,两个8位数相乘,其结果是16位乘积,存放在AX里;两个16位数相乘,其结果是32位乘积,存放在DX和AX,其中DX存放高位字,AX存放低位字。AX操作数(16位)(16位)×)DXAX(32位)AL操作数(8位)(8位)×)AHAL(16位)

图5.8乘法运算规则图8位乘法16位乘法1/31/202320

3.乘法指令

(1)无符号数乘法指令MUL(2)带符号数乘法指令IMUL

执行操作:与MUL指令相同,区别仅在于IMUL指令必须是带符号操作数,而MUL指令为无符号操作数。例:写程序段计算34H×10HMOVAL,34HMOVDL,10HMULDL;(AL)×(DL)→AX1/31/202321例

(1)完成BL×10H解MOVAL,10HMULBL;(AL)×(BL)→AX解1MULWORDPTR[2000H]MOV[2000H],AXMOV[2002H],DX(2)完成(AX)×[2000H]→[2000H]解2MOVCX,[2000H]MULCXMOV[2000H],AXMOV[2002H],DX1/31/202322例

(1)设(AL)=84H,(BL)=11H,求:执行IMULBL后的乘积是多少,

执行MULBL后的乘积又是多少。CF、OF各是多少。解:(AL)=84H为无符号数的132D,带符号数的-124D;

(BL)=11H为无符号数的17D,带符号数的17D。(1)执行IMULBL;AXAL*BL(AX)=0F7C4H=–2108D,CF=OF=1(2)执行MULBL;AXAL*BL(AX)=08C4H=2244D,CF=OF=1

MUL指令只对CF和OF有影响,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF=OF=0;否则,即字节操作的(AH)或字操作的(DX)不为0,则CF=OF=1。而IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF=OF=0,否则就均为1。1/31/202323例:4902H×403AH,结果送0510H~0513H单元。

MOVAX,4902HMOVBX,403AHMULBXMOV[0510H],AXMOV[0512H],DX

1/31/202324

4.除法指令除法运算也是双操作数运算,其中的操作数与乘法指令相同。在除法运算中,如果除数8位的,则要求被除数是16位的且必须先放在AX中;如果除数是16位的,则要求被除数是32位的且必须先放在DX,AX中。图5.9除法运算规则AHALAL商AH余数操作数8位除法DXAXAX商DX余数操作数16位除法字节:被除数隐含在AX中,结果商→AL,余数→AH字:被除数隐含在DX,AX中,结果商→AX,余数→DX1/31/202325

DIV~UnsignedDivide无符号数除法

格式:DIVSRC IDIV~SignedDivide带符号数除法

格式:IDIVSRC

执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。除法指令的寻址方式和乘法指令相同,其目的操作数必须存放在AX或DX中,而其源操作数可以用除立即数以外的任一种寻址方式。

除法指令对所有条件码位均无定义。1/31/202326如果被除数的位数不够,则应在进行除法以前,预先将被除数扩展到所需要的位数。对于带符号数,这种扩展应该保持被扩展数的值(包括符号位)不变,因此应该是带符号位的扩展。例如,01110000B应扩展成0000000001110000B,11110000B应扩展成11111111

11110000B。

CBW和CWD指令就是分别用于这两种扩展的,且CBW和CWD均为无操作数指令。1/31/202327

CBW~ConvertBytetoWord字节转换为字指令

执行的操作:AL的内容符号扩展到AH,形成AX中的字。即如(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH。如:

将24H扩展为一个字,即

MOVAL,24HCBW;AX=0024H

将84H扩展为一个字,即

MOVAL,84HCBW;AX=0FF84H24H=00100100B,最高有效位为084H=10000100B,最高有效位为11/31/202328CWD~ConvertWordtoDoubleWord字转换为双字指令

执行的操作:AX的内容符号扩展到DX,形成DX:AX中的字。即如(AX)的最高有效位为0,则(DX)=0000;如(AX)的最高有效位为1,则(DX)=0FFFFH。这两条指令都不影响条件码。1/31/202329

(1)执行DIVBL的结果是什么?(2)执行IDIVBL的结果又是什么?解:(AX)=0400H为无符号数的1024D,带符号数的1024D;

(BL)=94H为无符号数的148D,带符号数的–108D。(1)执行DIVBL的结果是余数:(AH)=88H=136D,商:(AL)=06H=6D(2)执行IDIVBL的结果是余数:(AH)=34H=52D,商:(AL)=0F7H=–9D例设(AX)=0400H,(BL)=94H,问:1/31/202330例

写程序

计算390AH÷1024H并将商和余数顺序存放到数据段[2000H]开始的内存单元。

MOVAX,390AHCWD;把字换成双字,390AH→0000390AH,隐含操作数AXMOVBX,1024HDIVBXMOV[2000H],AXMOV[2002H],DX1/31/202331例

计算

7324

890AH÷1024H并将商和余数顺序存放到数据段3000H开始的内存单元。

MOVDX,7234HMOVAX,890AHMOVBX,1024HDIVBXMOV[3000H],AXMOV[3002H],DX1/31/202332例设X,Y,Z和V在数据段分别定义为16位带符号数,分别装入X,Y,Z,V单元中(符号地址),计算[v-(x*y+z-540)]/x

MOVAX,X

MOVSI,YIMULSI;DX乘积高16位,AX乘积低16位X*YMOVCX,AX;CX

AX乘积低16位

MOVBX,DX;BX

DX乘积高16位

MOVAX,ZCWD;把带符号数Z符号位扩展到32位带符号数

ADDCX,AX;CX[(X*Y乘积低16位在CX内)+AX中Z低16位]ADCBX,DX;BX[(X*Y乘积高16位在BX内)+DX中Z高16位]SUBCX,540;x*y+z-540,低16位相减

SBBBX,0;x*y+z-540,高16位相减

MOVAX,VCWD;16位带符号数v扩展到32位带符号数

SUBAX,CX;低16位相减

v-(x*y+z-540)SBBDX,BX;高16位相减

v-(x*y+z-540)

MOVDI,XIDIVDI;32位被除数,16位除数,(v-(x*y+z-540))/x,AX商,DX余数XYZV65F3020024E00500加减乘除综合练习1/31/2023335.3.2逻辑运算和移位指令

1.逻辑运算指令:8086的逻辑运算指令包括AND(与),OR(或),NOT(非),XOR(异或)指令和TEST(测试)指令。

源目的ANDORXOR000000101110011111101/31/2023345.3.2逻辑运算和移位指令

1.逻辑运算指令

8086的逻辑运算指令包括AND(与),OR(或),NOT(非),XOR(异或)指令和TEST(测试)指令。

AND,OR和XOR指令的使用形式很相似,它们都是双操作数指令,既可以对8位数操作,也可以对16位数操作。例如:AND

AL,0FH

;AL中的内容和0FH相与,结果在AL中AND

AX,1000H;AX中的16位数和1000H相与,结果在AX中AND

AX,BX

AX和BX中的内容相与,结果在AX中1/31/202335AND

DX,[BX+SI];DX和两个存储单元的内容相与,单元地址由BX+SI和BX+SI+1指出,结果在DX中OR

AL,30H

AL和30H相或,结果在AL中OR

AX,00F0H

AX和00F0相或,结果在AX中XOR

AL,0FH

AL和0FH相异或,结果在AL中XOR

AX,AX

AX的内容本身进行异或,结果AX清零XOR

CX,1000H;CX的内容和1000H异或,结果在CX中1/31/202336

TEST指令和AND指令执行同样的操作,但TEST指令不送回操作结果,而仅仅影响标志位。例如:TEST

AX,8000H;如AX的最高位为1,则ZF=0,否则ZF=1TEST

AL,01

;如AL的最低位为1,则ZF=0,否则ZF=11/31/202337

NOT指令的操作数只有一个,它求出指令所给的操作数的反码,再送回。例如:NOT

AL;AL中内容求反码,结果在AL中NOT

BX;BX中内容求反码,结果在BX中NOT

WORDPTR[1000H];将1000H和1001H两单元中的内容求反码,再送回这两单元中在程序设计中,一般用AND指令对一个数据的指定位清0。例如,ANDAL,0FH指令就实现将高4位清0。1/31/202338

OR指令常常用来对一些指定位置1.例如,指令ORAL,02实现对累加器中的D1位置1。

XOR指令常常用在一些程序的开头使某个寄存器清0,以配合初始化工作的完成。例如,XORAX,AX,使累加器清0.NOT指令常用来将某个数据取成反码,再加上1,便得到补码.ANDBL,11110110B ;BL中D0和D3清0,其余位不变ORBL,00001001B ;BL中D0和D3置1,其余位不变XORBL,00001001B ;BL中D0和D3求反,其余位不变1/31/202339MOVAL,75h ;AL=75HANDAL,32h ;AL=30H

;CF=OF=0,SF=0,ZF=0,PF=1ORAL,71h ;AL=71H

;CF=OF=0,SF=0,ZF=0,PF=1XORAL,0F1h ;AL=80H

;CF=OF=0,SF=1,ZF=0,PF=0NOTAL

;AL=7FH,标志不变逻辑运算指令举例1/31/202340例:要求屏蔽D0、D1两位,可用AND指令并设置常数0FCH。

MOVAL,0BFH

ANDAL,0FCH

这两条指令执行的结果使(AL)=0BCH10111111

AND11111100101111001/31/202341(1)把AX的低字节清零,高字节不变

ANDAX,0FF00H(2)将BX的低字节置成全“1”,高字节不变

ORBX,00FFH(3)将CX的低字节变反,高字节不变

XORCX,00FFH

(4)设AL=25H,执行指令后,AL=0A5H。

ORAL,80H

00100101OR10000000

10100101例1:用一条指令完成下述要求。1/31/202342①将43H的D5位置1MOVAL,43HORAL,20H②

将43H的D6位清零MOVAL,43HANDAL,0BFH③将43H的D3位取反MOVAL,43HXORAL,08H例2④将AL寄存器中D3位和D7位置1MOV AL,0OR AL,88H⑤将AL中D3位和D7位清零。

MOV AL,0FFH AND AL,77H

1/31/202343例:设(AX)=1FFFH,如果执行指令TESTAX,8000H,则(AX)=

;如果执行指令ANDAX,8000H,则(AX)=

。设(BX)=7FFFH,如果执行指令TESTBX,8000H,则(BX)=

;如果执行指令ANDBX,8000H,则(BX)=

。1FFFH0000H7FFFH0000H1/31/202344例

试编制将AX的最高4位(D15~D12),BX的最低4位(D3~D0),CX的中间8位(D11~D4),拼成一个新字送DX的程序段。ANDAH,0F0H;取AX的高4位,AH←AX的D15~D120000ANDBL,0FH;取BX的后4位,BL

←0000BX的D3~D0ANDCX,0FF0H;取CX中间8位,CX←0000CX的D11~D40000ORCH,AH;拼装高8位,CH←AX的D15~D12,CX的D11~D8ORCL,BL;拼装低8位,CL←CX的D7~D4,BX的D3~D0MOVDX,CX;DX←CX

1/31/2023452.移位指令循环移位移位类

算术左移SAL

算术右移SAR

逻辑左移SHL

逻辑右移SHR

循环左移ROL

循环右移ROR

循环左移RCL

循环右移RCR移位算术移位逻辑移位不带进位带进位1/31/202346

2.移位指令(1)非循环移位指令:8086指令系统中有4条移位指令,即算术左移指令SAL(shiftarithmeticleft)

逻辑左移指令SHL(shiftlogicleft)

算术右移指令SAR(shiftarithmeticright)

逻辑右移指令SHR(shiftlogicright)。通过这些指令,可以对寄存器或者内存单元中的8位或16位操作数进行移位。4条非循环移位指令所执行的操作如图5.10所示。1/31/202347逻辑移位指令在执行时,实际上是把操作数看成无符号数来进行移位,所以右移时,最高位添0;算术移位指令在执行时,则将操作数看成有符号数来进行移位,所以,右移时保持最高位的值不变,这里的最高位就是符号位。图5.10非循环移位指令的功能1/31/202348

SHL和SAL这两条指令的功能完全一样,因为对一个无符号数乘以2和对一个有符号数乘以2没有什么区别,每移一次,最低位补0,最高位进入CF。在左移位数为1的情况下,移位后,如果最高位和CF不同,则溢出标志OF置1,这样,对有符号数来说,可以由此判断移位后的符号位和移位前的符号位不同;反过来,如果移位后的最高位和CF相同,则OF为0,这表示移位前后符号位没有变。1/31/202349例:将AL的内容算术左移5位

MOVAL,0AAH

MOVCL,5 SALAX,CL

播放时单击一次即左移一位,连续单击五次即左移5位。1/31/202350SHL和SAL指令的功能SHL

reg/mem,1/CL;reg/mem左移1或CL位

;最低位补0,最高位进入CFSAL

reg/mem,1/CL

;与SHL是同一条指令微机原理及应用吴丽娟1/31/202351

SAR和SHR的功能不同。SAR指令在执行时最高位保持不变,因为算术移位指令将最高位看成符号位,而SHR指令在执行时最高位补0。所有的移位指令在执行时,都会影响标志位CF,OF,PF,SF和ZF。1/31/202352SHR指令的功能SHR

reg/mem,1/CL ;reg/mem右移1/CL位

;最高位补0,最低位进入CF微机原理及应用吴丽娟1/31/202353SAR指令的功能SAR

reg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不变,最低位进入CF微机原理及应用吴丽娟1/31/202354

SAL,SHL,SAR和SHR指令形式类似,下面以SAL指令为例来说明这些指令的使用格式。SAL

DX,1

;将DX中的值左移1位,最低位补0

SAL

AX,CL;将AX中的值左移若干位,CL中指出所移的位数,比如CL中为4,则AX的值左移4位SAL

AL,CL;AL中值左移若干位,CL中指出所移位数上述4条移位指令使用时要注意:如果只移1位,则指令中直接用1指出移动位数;如果左移或右移若干位,那么必须用CL寄存器预先指定所移的位数。1/31/2023551.左移指令(逻辑左移、算术左移:一条指令)SHL操作数左移1位或CL规定的位数,最低位补0,最高位进CFSAL同SHL2.右移指令(逻辑右移SHR;算术右移SAR)SHR操作数右移1位或CL规定的位数,最高位补0,最低位进CFSAR操作数右移1位或CL规定的位数,最高位不变,最低位进CFSHLSALSHRSAR小结1/31/202356操作数的初值执行的指令执行后操作数的内容(AH)=12HSHLAH,1(AH)=24H(BL)=0A9HSHLBL,1(BL)=52H(AH)=12HSHRAH,1(AH)=09H(BL)=0A9HSHRBL,1(BL)=54H例:已知(AH)=12H,(BL)=0A9H,试给出分别用逻辑左移和右移指令移动1位后,寄存器AH和BL的内容。解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。1/31/202357例:设(AL)=10101001B,将AL的内容算术/逻辑右移3位算术右移3位:

MOVCL,3SARAL,CL;逻辑右移3位:

MOVCL,3SHRAL,CL;(AL)=11110101B(AL)=00010101B1/31/202358例设定(DS)=F800H,(DI)=180AH,(F980AH)=0064H.则执行指令MOVCL,4SAR[DI],CL后,(F980AH)=

,CF=

。0006H0

算术右移运算。

MOVBH,0F4H ;(BH)=0F4HMOVCL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH,(CF)=0

该例语句“SAR

BH,CL”实际上完成了(BH)/4→BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。1/31/202359

8086指令系统中有4条循环移位指令,即不带进位位的循环左移指令ROL(rotateleft),不带进位位的循环右移指令ROR(rotateright),带进位位的循环左移指令RCL(rotatethroughCFleft)和带进位位的循环右移指令RCR(rotatethroughCFright)。图5.11循环移位指令的功能(2)循环移位指令1/31/202360从图上可以看到,ROL和ROR指令在执行时,没有把CF套在循环中,而RCL和RCR指令在执行时,则连同CF一起循环移位.

这4条循环移位指令可以对字节进行操作,也可以对字进行操作,操作数可以是寄存器,也可以是存储单元。和非循环移位指令一样,如果循环移位指令只移动1位,则在指令中直接指出,如果要移动若干位,则必须在CL中指定移动位数。例如:1/31/202361例如:ROL

BX,1;BX中的内容不带进位位循环左移1位

ROL

WORDPTR[DI],CL;DI和DI+1所指单元中的数不带进位位循环左移几位,CL中为移动次数。

ROL和RCL指令在执行一次左移后,如果操作数的最高位和CF不等,则OF置1。因为CF是由最高位移入的,而对有符号数来说,最高位即符号位,所以CF代表了数据原来的符号。即,如果一个有符号数在左移之后,新的符号位和原来的符号不同了,则会使OF为1,于是,可以根据OF的值判断循环左移操作是否造成了溢出。1/31/202362

ROR和RCR指令在执行一位右移时,如果使操作数的最高位和次高位不等,则表示移位后的数据符号和原来的符号不同了,此时也会使OF为1。因此,循环移位指令在执行后,标志位OF表示数据的符号是否有了改变.用移位指令时,左移1位相当于将操作数乘2,右移1位相当于将操作数除2。用乘法指令和除法指令来直接执行乘、除运算,一般所需时间较长,如果用移位指令来编制一些常用的乘、除法程序,由于移位指令执行速度快,所以常常可以将计算速度提高很多。1/31/202363ROL不带进位循环左移的功能微机原理及应用吴丽娟1/31/202364ROR不带进位循环右移的功能微机原理及应用吴丽娟1/31/202365RCL带进位循环左移的功能微机原理及应用吴丽娟1/31/202366RCR带进位循环右移的功能微机原理及应用吴丽娟1/31/202367请用两种方法,将AL中的数x乘以10。SAL

AL,1,

;将AL中数左移1位,得2x

MOV

BL,AL;2x保存在BL中MOV

CL,2

移位次数置入CL中SAL

AL,CL

2x左移2位,得8xADD

AL,BL

2x加上8x,所以AL中为10xMOVBL,ALSALBL,1MOVCL,3SALAL,CLADDAL,BL1/31/202368例:(AX)=0012H,(BX)=0034H,把它们装配成(AX)=1234H

MOVCL,8ROLAX,CLADDAX,BX例:(BX)=84F0H(1)(BX)为无符号数,求(BX)/2

SHRBX,1

;(BX)=4278H(2)(BX)为带符号数,求(BX)/2

SARBX,1

;(BX)=0C278H1/31/202369SHL(shiftlogicalleft) 逻辑左移SAL(shiftarithmeticleft)

算术左移(乘2n)SHR(shiftlogicalright) 逻辑右移SAR(shiftarithmeticright)算术右移(除2n)ROL(rotateleft) 不带进位循环左移ROR(rotateright) 不带进位循环右移RCL(rotateleftcarry) 带进位循环左移RCR(rotaterightthroughcarry) 带进位循环右移移位指令举例1/31/202370不带进位循环移位指令指令操作数的初值指令执行后的结果ROLAX,1(AX)=6789HMOVCL,3ROLAX,CL(AX)=6789HMOVCL,2RORAX,CL(AX)=6789HMOVCL,4RORAX,CL(AX)=6789H(AX)=0CF12H(AX)=3C4BH(AX)=59E2H(AX)=9678H练习1/31/202371带进位移位指令指令操作数的初值指令执行后的结果RCLAX,1CF=0,(AX)=0ABCDHRCLAX,1CF=1,(AX)=0ABCDHMOVCL,2RCRAX,2CF=0,(AX)=0ABCDHMOVCL,2RCRAX,2CF=1,(AX)=0ABCDH(AX)=579AH(AX)=579BH(AX)=AAF3H(AX)=EAF3H练习1/31/202372设(DX)=00B9H,(CL=3),(CF=1),确定下列指令单独执行后DX中的值.(1)SHRDX,1;(DX)=

H(2)SARDX,CL;(DX)=

H(3)SHLDX,CL;(DX)=

H(4)SHLDL,1;(DX)=

H(5)RORDX,CL;(DX)=

H(6)ROLDL,CL;(DX)=

H(7)SALDH,1;(DX)=

H(8)RCLDX,CL;(DX)=

H(9)RCRDL,1;(DX)=

H005C001705C80072201700CD00B905CC00DC移位指令综合练习1/31/2023735.4串操作指令串操作指令就是用一条指令实现对一串字符或数据的操作。图5.12字符串传送方向示意图1/31/202374基本概念和说明:1、串(String):占用一片连续存储区域的数据块。如:高级语言中的字符串、数组、结构等。2、串的操作类型:传送(或称复制MOVSB,MOVSW)

比较(CMPSB,CMPSW)

扫描(或称搜索SCASB,SCASW)

读(LODSB,LODSW)

写(STOSB,STOSW)等。1/31/2023758086的串操作指令有如下特点:(1)通过加重复前缀来实现串操作。(2)可以对字节串进行操作,也可以对字串进行操作。(3)所有的串操作指令都用寄存器SI对源操作数进行间接寻址,并且假定是在DS段中;此外,所有的串操作指令都用寄存器DI为目的操作数进行间接寻址,并且假定是在ES段中。串操作指令是唯一的一组源操作数和目的操作数都在存储单元的指令。1/31/202376(4)串操作时,地址的修改往往与方向标志DF有关,当DF=1时,SI和DI作自动减量修改,当DF=0时,SI和DI作自动增量修改.

设置方向标志DF的值:若SI、DI是起始地址,使DF=0(CLD),地址加1(对于字节串)或加2(对于字串)修改;若SI、DI是末地址,使DF=1(STD)地址减1(对于字节串)或减2(对于字串)修改。(5)在同一个段内传送字符串时,应将数据段基址和附加段基址设置成同一数值,即(DS)=(ES),此时,仍由SI和DI分别指出源串操作数和目的操作数的偏移地址。一条带重复前缀的串操作指令的执行过程相当于一个循环程序的运行。每次重复后,地址指针SI和DI都会受到修改,不过指令指针IP保持指向重复前缀(前缀本身也是一条指令)的偏移地址。1/31/202377字符串指令有许多参数是隐含约定的,如下表5.8所示源字符串的起始地址DS:SI目的字符串的起始地址ES:DI重复次数CXSCAS指令的扫描值AL/AXLODS指令的目的操作数AL/AXSTOS指令的源操作数AL/AX传送方向DF=0,SI、DI自动增量DF=1,SI、DI自动减量1/31/2023785.4.1字符串的传送在使用MOVS指令进行字符串传送时,要注意传送方向。如果源字符串与目标字符串不重迭(图

a),则传送方向没有任何影响。如果源字符串与目标字符串部分重迭(图b和c),则传送方向要特别注意。如果源字符串的地址低于目标字符串的地址,则应该自动减量(DF=1);如果源字符串的地址高于目标字符串的地址,则应该自动增量(DF=0)1/31/2023795.4.1字符串的传送

在执行MOVS指令时,应该先做好以下准备工作:⑴DS段中源串首地址(或反向传送末地址)存入SI寄存器中。⑵ES段中目的串首地址(或反向传送末地址)存入DI寄存器中。⑶数据串长度存入CX。⑷建立方向标志DF。串传送指令有3种格式:

⑴MOVSdest,src

:((ES):(DI))←((DS):(SI))⑵MOVSB(字节):(SI)←(SI)±1,(DI)←(DI)±1⑶MOVSW(字):(SI)←(SI)±2,(DI)←(DI)±2

当方向标志(CLD)DF=0时,用“+”;(STD)DF=1时,用“-”;

1/31/202380例:字节传送MOVSI,1000HMOVDI,2000HCLDMOVSB正向,DF=01/31/202381REPMOVSB

(正向DF=0)1/31/202382例:字传送MOVSI,1049HMOVDI,2049HSTDMOVSW负向,DF=11/31/202383例:在数据段中有一字符串,偏移地址为1000H,长度为4,要求把它们传送到偏移地址为2000H附加段中。

MOV SI,1000H;源串偏移地址放SIMOV DI,2000H;目的串偏移地址放DIMOV CX,4 ;设置重复操作次数

CLD ;设置方向标志位DF=0MOVSB;传送串DS→ES→…………存储器低地址高地址7856341278563412≈≈…(SI)←(SI)+1(SI)=1000H(DI)=2000H(DI)←(DI)+11/31/202384例:将内存的数据段中以AREA1为首地址的100个数据,传送到附加段中的AREA2为首地址的区域。(用MOV及MOVS分别完成,并加以比较)

用MOVS串操作指令编程:

MOVAX,SEGAREA1 MOVDS,AX MOVAX,SEGAREA2MOVES,AX MOVSI,OFFSETAREA1 MOVDI,OFFSETAREA2 MOVCX,100 CLD ;DF=0,增址传送

LOOP1:MOVSAREA2,AREA1 DECCX JNZLOOP11/31/202385

MOVAX,SEGAREA1 MOVDS,AX MOVAX,SEGAREA2 MOVES,AX MOVSI,OFFSETAREA1;将ARE1偏移地址→SI

MOVDI,OFFSETAREA2

MOVCX,100LOOP1:MOVAL,[SI] ;(AL)←((DS):((SI))MOVES:[DI],AL;((ES):(DI))←(AL)INCSIINCDIDECCXJNZLOOP1用MOV指令编程:1/31/2023865.4.2字符串的存和取

STOS指令是把累加器AL/AX中的内容存到内存中去,如果使用了重复前缀,则可以使内存的某一区域初始化为某一数值(以字节或字为单位),即完成块的填充。例如,使0404H开始的256个单元清0。程序如下:

CLD

清除方向标志DFLEA

DI,[0404];将目的地址0404H送DI

MOV

CX,0080H

共有128个字

XOR

AX,AX

AX清0REP

STOSW

将256个字节清0LODS指令是把内存中的值取到累加器AL/AX中去的。因为目标只是一个累加器,所以LODS指令前没必要加重复前缀。1/31/2023875.4.3字符串的扫描和比较

SCAS指令是用来从目标串中查找某个关键字,要求查找的关键字应事先置入AX或AL寄存器中。SCAS指令的操作是将AX/AL寄存器中的关键字减去由DI所指向的目标串中一个元素,不传送结果,只根据结果置标志位,修改DI寄存器内容指向下一元素。通常在SCAS指令之前加重复前缀REPNE/REPNZ,用来从目标串中寻找关键字,操作一直进行到ZF=1或(CX)=0为止。1/31/202388例:在某字符串中查找是否存在“$”字符。若存在,则将“$”字符所在地址送入BX寄存器中,否则将BX寄存器清“0”。程序如下:

CLD

;清除方向标志DF

MOV

DI,0100H

;送目标串首元素偏移地址

MOV

AL,′$′;关键字→AL

REPNE

SCASB

;找关键字

AND

CX,0FFH

JZ

ZER

DEC

DI

MOV

BX,DI;关键字所在地址→BX

JMP

ST0ZER:MOV

BX,0;未找到,0→BX

ST0:HLT微机原理及应用吴丽娟1/31/202389

CMPS指令是用来将源串的一个元素减去目标串中相对应的一个元素,不回送结果,只根据结果特征置标志,并修改SI和DI内容指向下一元素。通常在CMPS指令前加重复前缀REPE/REPZ,用来寻找两个串中的第一个不相同数据。例检

温馨提示

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

评论

0/150

提交评论