80888086指令系统课件_第1页
80888086指令系统课件_第2页
80888086指令系统课件_第3页
80888086指令系统课件_第4页
80888086指令系统课件_第5页
已阅读5页,还剩181页未读 继续免费阅读

下载本文档

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

文档简介

1

8088/8086指令系统

23.1概述指令——控制计算机完成指定操作的命令机器指令——指令的二进制代码形式。例如:CD21H汇编指令——助记符形式的指令。例如:MOVAX,21H指令系统——CPU所有指令及其使用规则的集合8088/8086指令系统指令向后兼容(x86系列)3指令按功能分为六大类(92种)(1)数据传送类;(2)算术运算类;(3)逻辑运算和移位;(4)串操作;(5)控制转移类;(6)处理器控制。4部分8088常用指令P94指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET5一.

指令的基本构成操作码[目的操作数],[源操作数]要执行的操作操作的对象0个、1个或2个6ADDAX,[SI]MOVAL,BLINCBX例7三类操作数立即操作数寄存器操作数存储器操作数81.立即数操作数具有固定数值的数,即常数。表3-28位16位无符号数00H-FFH(0-255)0000H-FFFFH(0-65535)带符号数80H-7FH(-128~127)8000H-7FFFH(-32768~32767)立即数只能用作源操作数,如:MOV AX,0FA00H ;正确MOV 8000H,DX ;错误92.寄存器操作数放在8个通用寄存器或4个段寄存器中的操作数既可以作为源操作数,也可以用作目的操作数通用寄存器可存放字节操作数(如AH),也可存放字操作数(AX)SI,DI,BP及SP只能存放字操作数段寄存器只能存放当前操作数的段基地址不允许将立即数传送到段寄存器103.存储器操作数存储器操作数字节字双字124类型存储单元个数一般不允许两个操作数同时为存储器操作数寻找存储器操作数:所在段+偏移地址段寄存器寻址方式11若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。表3.3段寄存器使用的一些基本约定P9612一条指令的执行时间:二.

指令的执行时间(时钟周期数)取指令取操作数执行指令传送结果表3.4常用指令执行时间P96结论:

1)尽量使用寄存器作为操作数

2)若有可能,用移位代替乘除法

3)尽量使用简单的寻址方式13——寻找操作数地址的方法

寻找操作数的地址(一般指源操作数)

寻找要执行的下一条指令的地址在8086指令系统中,寻址方式可分为8种:

①立即寻址⑤寄存器相对寻址

②直接寻址⑥基址-变址寻址

③寄存器寻址⑦相对的基址-变址寻址

④寄存器间接寻址⑧隐含寻址3.28086的寻址方式14

操作数直接由指令给出——立即数立即寻址只能用于源操作数例:

MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH

MOV2A00H,AX;错误!

一.

立即寻址15立即数操作码低8位高8位代码段立即寻址指令在存储器中的存放形式存储器MOV操作码02H31HAHAL代码段AX例3-1MOVAX,3102H;AX3102H

执行后,(AH)=31H,(AL)=02H16二.直接寻址

指令中直接给出操作数的16位偏移地址

偏移地址也称为有效地址(EA,EffectiveAddress)

默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀偏移地址也可用符号地址来表示,如ADDR

例:

MOVAX,[2A00H]MOVDX,ES:[2A00H]

MOVSI,TABLE_PTR17例3-2MOVAX,[3102H]AL(3102H),AH(3103H)如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH则操作数的物理地址为:

20000H+3102H=23102H指令执行后:(AX)=ABCDHMOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..18三.

寄存器寻址

操作数在寄存器中源操作数与目的操作数字长要相同寄存器寻址与段地址无关例:

MOVAX,BXMOV[3F00H],AXMOVCL,AL×MOVAX,BL

;×MOVES:AX,DX;字长不同寄存器与段无关19AXSI2233H2233H例3-4MOVSI,AX;SI(AX)

指令执行前:(AX)=2233H

指令执行后:(AX)=2233H,(SI)=2233H20四.

寄存器间接寻址

操作数的偏移地址(EA)放在间址寄存器中只有SI、DI、BX和BP可作间址寄存器物理地址=(DS)左移四位+(BX)或(SI)或(DI)物理地址=(SS)左移四位+(BP)例:MOV

AX,[BX]MOVCL,CS:[DI]×MOVAX,[DX]×MOVCL,[AX]EA=(BX)(BP)(SI)(DI)21例3-5MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H则指令执行后,(AX)=44H33H60001200DSSI6000061200

61200HAX存储器数据段

+)120044H33H334422EA=间址寄存器的内容加上一个8/16位的位移量寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)EA=(BX)(BP)(SI)(DI)+8位16位位移量(相对值)

五.

寄存器相对寻址23物理地址=(DS)左移四位+(BX)或(SI)或

(DI)+位移量物理地址=(SS)左移四位+(BP)+位移量例:MOVAX,[BX]XYZMOVAX,XYZ[BX]MOVAX,[BX+XYZ]MOVAX,[SI]40HMOVAX,40H[SI]MOVAX,[SI+40H]24

例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP];默认段寄存器为SS例3-7MOVAX,DATA[BX]

若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H

则物理地址=60000H+1000H+2A00H=63A00H指令执行后:(AX)=5566H25操作码00偏移量低2A偏移量高DS6000BX1000+DATA2A0063A0063A00HAHALAX代码段数据段.........66H55HMOVAX,DATA[BX]26六.

基址-变址寻址

若操作数的偏移地址:由基址寄存器(BX或BP)给出——

基址寻址方式由变址寄存器(SI或DI)给出——

变址寻址方式

由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。EA=(BX)(BP)+(SI)(DI)

同一组内的寄存器不能同时出现。27若基址寄存器用BX,则段寄存器用DS物理地址=(DS)左移四位+(BX)+(SI)或(DI)若基址寄存器用BP,则段寄存器用SS物理地址=(SS)左移四位+(BP)+(SI)或(DI)28例:

MOVAX,[BX][SI]MOVAX,[BX+SI]MOVAX,DS:[BP][DI]×MOVAX,[BX][BP]

×

MOVAX,[DI][SI]2983000操作码DS

8000BX

2000+SI

100083000HAHALAX代码段数据段.........YYXX例3-9MOVAX,[BX][SI]假定:(DS)=8000H,(BX)=2000H,SI=1000H则物理地址=指令执行后:(AL)=(AH)=80000H+2000H+1000H=83000H[83000H][83001H]30七.相对的基址-变址寻址

在基址-变址寻址的基础上再加上一个相对位移量注意事项同基址-变址寻址EA=(BX)(BP)+(SI)(DI)+8位16位位移量

例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE31例3-10MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H则指令执行后(AH)=[83201H],(AL)=[83200H]8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS

8000BX

2000

DI

100032使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)33八.

隐含寻址

指令中的操作数是隐含的例:MULBL

指令隐含了被乘数AL及乘积AX

类似的指令还有:DIV、CBW、MOVS等(AL)×(BL)→AX34小结指令由()和()构成如何取得操作数——称为()操作码操作数寻址35寻址方式可分为立即寻址直接寻址寄存器相对寻址寄存器寻址基址-变址寻址基址-变址相对寻址寄存器间接寻址隐含寻址36寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:

寻址方式指令操作数形式

寄存器间接——只有一个寄存器(BX/BP/SI/DI之一)寄存器相对——一个寄存器加上位移量基址—变址——两个不同类别的寄存器相对基址-变址——两不同类别的寄存器加上位移量37本节习题P1523.2383.38086指令系统6类指令系统:数据传送指令算术运算指令

逻辑运算和移位指令

串操作指令

程序控制指令

处理器控制指令39一.数据传送类指令

存储器寄存器I/O

数据传送类指令又可分为如下四种:

通用数据传送

输入输出

地址传送

标志传送401.通用数据传送指令(1)

MOVdest,src;dest←src

传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。具体来说可实现:

①MOVmem/reg1,mem/reg2

指令中两操作数中至少有一个为寄存器

MOV CL,DLMOV AX,BX MOV [SI],CX MOV CL,[BX+5]41②MOVreg,data;立即数送寄存器

MOVAX,1000HMOVBH,12H③MOVmem,data;立即数送存储单元

MOV

[SI],0F932HMOVAPR[BP],5CH④MOVacc,mem;存储单元送累加器

MOVAX,[BX]4MOVAL,[BP][DI]⑤MOVmem,acc;累加器送存储单元

MOV[SI][BP]4,AXMOV[1000H],AL⑥MOVsegreg,mem/reg;存储单元/寄存器送段寄存器

MOVDS,XYZMOVES,AX⑦MOVmem/reg,segreg;段寄存器送存储单元/寄存器

MOV[SI],SSMOVCX,ES

42MOV指令使用规则:1)IP和CS不能作目的寄存器2)不允许mem←mem3)不允许segreg←segreg4)立即数不允许作为目的操作数5)不允许segreg←立即数6)源操作数与目的操作数类型要一致43几个不能传送的解决办法:用AX作桥梁

存储器←存储器:

MOVAX,MEM1 MOVMEM2,AX段寄存器←段寄存器:

MOVAX,DS MOVES,AX段寄存器←立即数:

MOVAX,DATA MOVDS,AXP107–10844应用举例MOVAL,CLMOVDL,CH若(CX)=2233H,则(AL)=?(DL)=?DEBUG的使用45例:把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域中

MOVSI,OFFSETMEM1

MOVDI,OFFSETMEM2MOVCX,200NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZNEXTHLT46堆栈按“后进先出(LIFO)”方式工作的存储区域堆栈以字为单位进行压入弹出操作。为什么要设置堆栈为什么要按“后进先出”方式工作?(2)堆栈操作指令47转子程序2(a)(b)子程序调用示意图(a)主程序调子程序;(b)子程序嵌套示意图主程序IP继续执行主程序执行子程序转子程序压栈弹出返回主程序主程序IPIP(下)继续执行主程序转子程序1返回主程序IP’执行子程序2返回子程序1IP’(下)执行子程序1继续执行子程序1压栈弹出IP(下)48SS指示堆栈段的段基址堆栈指针SP始终指向堆栈的顶部SP的初值规定了所用堆栈区的大小堆栈的最高地址叫栈底。SPSS堆栈段进栈方向退栈方向栈底栈顶一个字49

①压栈指令

PUSHsrc ;src为16位的寄存器或存储器操作数例:PUSH AX ;将AX内容压栈执行操作:(SP)←(SP)-2

(SP)+1←高字节AH

(SP)←低字节AL

50设(AX)=1020H低地址存储区(SS段)执行前(AX)=1020(SP)存储区(SS段)进栈方向执行后2010(AL)(AH)PUSHAX指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)-151

②弹出指令

POP dest例:POP BX ;将栈顶内容弹至BX

执行操作:(BL)←(SP)

(BH)←(SP)+1

(SP)←(SP)+252低地址存储区(SS段)出栈方向执行前2010POPBX指令执行示意图(SP)存储区(SS段)执行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址53堆栈指令使用时应注意几点:①堆栈操作总是按字进行②不能从栈顶弹出一个字给CS③堆栈指针为SS:SP,SP永远指向栈顶④SP自动进行增减量(-2,+2)54格式:XCHGreg,mem/reg功能:交换两操作数的内容。要求:两操作数中必须有一个在寄存器中;操作数不能为段寄存器和立即数;源和目地操作数类型要一致。举例:

XCHG AX,BXXCHG [2000],CL(3)交换指令XCHG55(4)查表转换指令XLAT功能:AL←[(BX)+(AL)]根据表项序号查出表中对应代码的内容表的首地址(偏移地址)送到BX中表项序号存于AL中。

例3-15:内存数据段有一张16进制数的ASCII码表,设首地址为2000H,如欲查出表中第11个代码(代码序号从0开始)即十六进制数B的ASCII码。ASCII表在DS段中,并假设首地址为HEX。‘’56303132...394142...4546...HEX+0HEX+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’十六进制数ASCII码表存储器57可用如下几条指令实现:LEABX,HEX;(BX)←表首地址MOVAL,0BH;(AL)←序号XALT;查表转换执行后得到:(AL)=42H=’B’注意:转换表长度最大为256个表项(字节)。58(5)字位扩展指令格式:CBW;把AL的符号位复制到AHCWD;把AX的符号位复制到DX用途:用于有符号数的除法。说明:CBW(1)当(AL)为正时,则(AH)=00H(2)当(AL)为负时,则(AH)=FFHCWD(1)当(AX)为正时,则(DX)=0000H(2)当(AX)为负时,则(DX)=FFFFH例:(AL)=A7H,则执行CBW后,AH的内容为FFH。592.输入输出(I/O)指令例:INAL,80H;(AL)←(80H端口)

MOVDX,1234H

INAL,DX;(AL)←(1234H端口)只限于用累加器AL或AX来传送信息。功能:(累加器)←→I/O端口(1)输入指令IN

INAL,n;从8位的端口号输入一个字节给ALINAX,n;从8位的端口号输入一个字给AXINAL,DX;从16位的端口号输入一字节给ALINAX,DX;从16位的端口号输入一个字给AX60在使用间接寻址的IN/OUT指令时,要事先用传送指令把I/O端口号设置到DX寄存器,如:

MOVDX,220HINAL,DX;将220H端口内容读入AL(2)输出指令OUT

OUTn,AL;将一个字节输出到8位的端口地址

OUTn,AX;将一个字输出到8位的端口地址

OUTDX,AL;将一个字节输出到16位的端口地址

OUTDX,AX;将一个字输出到16位的端口地址例:OUT68H,AX;(69H,68H)←(AX)

OUTDX,AL;((DX))←(AL)61要求:

1)源操作数必须是一个存储器操作数;

2)目的操作数必须是一个16位的通用(间址)寄存器。3.地址传送指令用途:用于传送操作数的地址传送偏移地址格式:LEAreg,mem;将指定内存单元的偏移地址送到指定寄存器传送地址指针格式:LDSreg,mem32;DS:reg←(mem开始的四个内存单元的内容)

LESreg,mem32;同上,但DS改为ES62注意以下二条指令差别:

LEABX,BUFFER

MOVBX,BUFFER前者表示将符号地址为BUFFER的存储单元的偏移地址取到

BX中;后者表示将BUFFER存储单元中的内容取到

BX中.例3-22LEA BX,[BX+50H]

MOV

BX,[BX+50H]63下面两条指令等效:

LEABX,BUFFERMOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存储器单元BUFFER的偏移地址。二者都可用于取存储器单元的偏移地址,但LEA指令可以取动态的地址,OFFSET只能取静态的地址。644.标志传送指令(1)读标志指令LAHF

LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位:OFDFIFTFSFZFAFPFCFAHFLAG65(2)设置标志指令SAHF

SAHF的功能与LAHF的功能相反:OFDFIFTFSFZFAFPFCFAHFLAG66

执行的操作:(SP)-1←标志寄存器高8位

(SP)-2←标志寄存器低8位

(SP)←(SP)-2(4)从栈顶弹出标志寄存器指令POPF

执行的操作:标志寄存器低8位←(SP)

标志寄存器高8位←(SP)+1

(SP)←(SP)+2PUSHF和POPF指令用于保护和恢复标志寄存器内容。(3)把标志寄存器推入栈顶指令PUSHF67例如:

PUSH AXPUSH CX

PUSHF;保护标志寄存器内容

;这段程序要用到AX,CX以及标志位

POPF ;恢复标志寄存器内容

POP CXPOP AX...68数据传送指令中,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。69二.算术运算指令1.加法指令2.减法指令

3.乘法指令4.除法指令70算术运算的溢出问题

算术运算涉及两种类型数据:无符号数和有符号数。对加减法指令,并不区分无符号数和有符号数,但:参加的操作数必须同是无符号数或同是有符号数。无符号数和有符号数的运算结果是否溢出,判断方法是不同的。71CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。有符号数的溢出是一种出错状态,在运算过程中应当避免。72(1)不带进位的加法指令ADD

格式:ADD OPD1,OPD2

操作:(OPD1)(OPD1)+(OPD2)

说明:两操作数不能同时为mem且不能是段寄存器

实例:

ADD AL,30HADD SI,[BX+20H] ADD CX,SI ADD [DI],200H1.加法指令73

7EH=01111110

+5BH=01011011

11011001

结果:CF=0,ZF=0,PF=0,AF=1,OF=1,SF=1ADD指令对6个状态标志均产生影响例3-24:MOVAL,7EH

ADDAL,5BH74(2)带进位位的加法指令ADC格式:ADCOPD1,OPD2操作:(OPD1)(OPD1)+(OPD2)+CF相加时要包括进位标志CF的内容,例如:

ADCAL,68H;AL←(AL)+68H+(CF) ADCAX,CX;AX←(AX)+(CX)+(CF)ADCBX,[DI];BX←(BX)+[DI+1][DI]+(CF)75例3-26求两个4字节的无符号数的和

0107A379H+10067E4FH=?设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区。(与书方法不同,见下页图)

因CPU只能进行8位或16位的加法运算,为此可将两数分成低字和高字分别相加。ADC指令用于多字节加法运算中76多字节加法示意图A3H79H10H06HBUFFER1BUFFER201H07H7EH4FH被加数加数数据段......77程序段如下:

MOVAX,BUFFER2 ADDBUFFER1,AX

;低字相加

MOVAX,BUFFER2+2 ADCBUFFER1+2,AX;高字相加,

;包括低字的进位78格式:INCreg/mem功能:类似于C语言中的++操作:对指定的操作数加1例:INCALINCSIINCBYTEPTR[BX+4]注:本指令不影响CF标志。(3)加1指令INC(单操作数指令)79ADD/ADC对条件标志位的影响CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=80例:

SUBAL,60HSUB[BX+20H],DXSUBAX,CX2.减法指令(1)不考虑借位的减法指令SUB

格式:

SUB

OPD1,OPD2

操作:OPD1←(OPD1)-(OPD2)1.源和目的操作数不能同时为存储器操作数2.立即数不能作为目的操作数81SBB指令主要用于多字节的减法格式:

SBBOPD1,OPD2操作:OPD1←(OPD1)-(OPD2)-CF例:

SBBAX,CXSBBWORDPTR[SI],2080HSBB[SI],DX(2)考虑借位的减法指令SBB82例:x、y、z均为32位数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现w

x+y+24-z,结果放在W,W+2单元中。

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24

SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;结果存入W,W+2单元83作用类似于C语言中的子“--”操作符。格式:DECopr 操作:opr←(opr)-1例:

DECCLDECBYTEPTR[DI+2]DECSI(3)减1指令DEC84例:若(AL)=0FCH,则执行NEGAL 后,

(AL)=04H,CF=10FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。(4)求补指令NEG格式:NEGopr操作:opr←0-(opr)对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。85SUB/SBB对标志位(CF/OF/ZF/SF)的影响

CF=1表示无符号数减法溢出。

OF=1表示带符号数减法溢出。NEG指令对CF/OF的影响:

CF:操作数为0时,求补的结果使CF=0,否则CF=1。

OF:字节运算对-128求补或字运算对-32768求补时OF=1,

否则OF=0。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=86例:

CMPAL,0AHCMPCX,SICMPDI,[BX+03](5)比较指令CMP格式:CMPdest,src操作:(dest)-(src)结果不送目标操作数,其结果只反映在标志位上。比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。87根据标志位来判断比较的结果②比较的是两个有符号数若OF⊕SF=0,则dest>src;

若OF⊕SF=1,则dest<src。1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若两个数不相等,则分两种情况考虑:①比较的是两个无符号数若CF=0,则dest>src;

若CF=1,则dest<src。88例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。

CMPAL,BL;AL和BL比较

JNG

BBB

;若AL≤BL,则转

XCHGAL,BL;若AL>BL,则交换

BBB:CMPAL,CL;AL和CL比较

JNG

CCC;若AL≤CL,则转

XCHGAL,CL;若AL>CL,则交换

CCC:HLT89(1)无符号数的乘法指令MUL(MEM/REG)格式:MULsrc操作:字节操作数(AX)

(AL)×(src)

字操作数(DX,AX)

(AX)×(src)3.乘法指令8位*8位→16位乘积 16位*16位→32位乘积MULBL;(AL)×(BL),乘积在AX中

MULCX;(AX)×(CX),乘积在DX,AX中

MULBYTEPTR[BX]MULAX;错90格式与MUL指令类似,只是要求两操作数均为有符号数。例:

IMULBL;(AX)←(AL)×(BL)IMULWORDPTR[SI]

;(DX,AX)←(AX)×([SI+1][SI])

(2)有符号数乘法指令IMUL注意:MUL/IMUL指令中

●AL(AX)为隐含的乘数寄存器;

●AX(DX,AX)为隐含的乘积寄存器;

SRC不能为立即数;

●除CF和OF外,对其它标志位无定义。91乘法指令对CF/OF的影响:00乘积的高一半为零11否则MUL指令:CF/OF=00乘积的高一半是低一半的符号扩展11否则

IMUL指令:CF/OF=924.除法指令

被除数 商 余数字节除法AX AL AH

字除法 DX:AX AX DX16位/8位→8位商 32位/16位→16位商93格式:DIVsrc操作:字节操作(AL)

(AX)/(SRC)的商

(AH)

(AX)/(SRC)的余数字操作(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余数例:

DIVCLDIVWORDPTR[BX]注:若除数为零或AL中商大于FFH,(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。(1)无符号数除法指令DIV94(2)有符号数除法指令IDIV注意:对于DIV/IDIV指令

AX(DX,AX)为隐含的被除数寄存器。

AL(AX)为隐含的商寄存器。

AH(DX)为隐含的余数寄存器。

src不能为立即数。

对所有条件标志位均无定义。格式:IDIVsrc操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。95除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。对于无符号数除法扩展,只需将AH或DX清零即可。对有符号数而言,则是符号位的扩展。可使用前面介绍过的符号扩展指令CBW和CWD关于除法操作中的字长扩展问题96例:写出34H÷25H的程序段。

MOVAL,34HMOVBL,25HCBW;AL的符号扩展到AHDIVBL;0034H÷25H,结果为

;(AH)=0FH,(AL)=01HP123例3-29975.BCD码运算的十进制调整指令专用于对BCD码运算的结果进行调整DAA、AAA、DAS、AAS、AAM、AAD均为隐含寻址,隐含的操作数为AL和AH为何要对BCD码的运算结果进行调整?

BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。981)加法的十进制调整指令(1)非压缩BCD码加法调整AAAAAA指令只影响AF和CF,其余标志无定义AAA指令应紧跟在ADD或ADC指令之后。如果AL的低4位>9∨AF=1,则:

①AL←(AL)+6,(AH)←(AH)+1,AF←1②AL←((AL)∧0FH)③CF←AF

否则AL←(AL)∧0FH99调整原理:计算8+900001000

+0000100100010001=11

这个1代表了16,而实际上仅应为10,即多进了6,个位就会少6,这就要进行加6调正。当低4位的结果>9(即A~F之间)时,也应进行加6调正。原因是逢十没有进位,故用加6的方法强行产生进位。100例2:有两个字符串形式的十进制数,2658和

3619,求二者之和。即2658+3619=?由题意知,被加数和加数的每一位都以ASCII码形式存放在内存中。假定二数在内存中均是低位在前,高位在后,另留出5个单元存放相加的结果。内存中数据存放形式:10136H32H39H31HSTRING1STRING238H35H36H33H被加数加数数据段‘8’‘5’‘6’‘2’‘9’‘1’‘6’‘3’SUM结果......102程序段为:

LEASI,STRING1;STRING1偏移地址送SILEADI,STRING2;STRING2偏移地址送DI

LEABX,SUM;SUM偏移地址送BXMOVCX,4;循环4次

CLC

;清进位标志AGAIN:MOVAL,[SI]ADCAL,[DI];带进位加

AAA

;未压缩BCD码调正

MOV[BX],AL

;结果存入SUMINCSI;调整指针

INCDIINCBXDECCX;循环计数器减1

JNZAGAIN;若未处理完,则转AGAIN103用AAA指令也可对字符串形式的十进制数加法进行调整,所以它又被称为加法的ASCII调正指令。为什么AAA指令既可对非压缩BCD码加法进行调整,也可对ASCII码形式的十进制数进行调整?AAA指令的第②步104(2)压缩BCD码加法调整DAA两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码.指令操作(调整方法):若AL的低4位>9∨AF=1

则(AL)←(AL)+6,AF←1

若AL的高4位>9∨CF=1

则(AL)←(AL)+60H,CF←1除OF外,DAA指令影响所有其它标志。DAA指令应紧跟在ADD或ADC指令之后。105例3-30

0100100048H

MOVAL,48H

+00100111

27H

MOVBL,27H011011116FHADDAL,BL

+00000110

06H

DAA

01110101

75H106(1)非压缩BCD码减法的十进制调正指令AAS对AL中由两个非压缩的BCD码相减的结果进行调整。调整操作为:若AL的低4位>9或AF=1,则:

①AL←(AL)-6,AH←(AH)-1,AF←1②AL←(AL)∧0FH③CF←AF

否则:AL←(AL)∧0FH2)减法的十进制调整指令107(2)压缩BCD码减法的十进制调正指令DAS

对AL中由两个压缩BCD码相减的结果进行调整。调整操作为:

若AL的低4位>9∨AF=1,则:

AL←(AL)-6,且AF←1

若AL的高4位>9∨CF=1,则:

AL←(AL)-60H,且CF←1

DAS对OF无定义,但影响其余标志位。DAS指令要求跟在减法指令之后。1083)乘法的十进制调正指令AAM对AX中由两个非压缩BCD码相乘的结果进行调整。调整操作为:

(AL)/0AH,(AH)←商,(AL)←余数隐含的操作寄存器为AL和AH;AAM跟在MUL指令之后使用;影响标志位PF、SF、ZF,其它无定义;用AAM可实现≤99的二-十进制转换。109例3-32按十进制乘法计算7×9=?

MOV AL,07H ;(AL)=07H MOV BL,09H ;(BL)=09H MUL BL ;(AX)=003FH AAM ;(AH)=06H,(AL)=03H

所得结果为非压缩的BCD码。例:把3AH转换成等值的十进制数。

MOVAL,3AH;58AAM;(AH)=05H,(AL)=08H1104)除法的十进制调正指令AAD对非压缩BCD除法运算进行调整。调整操作为:

(AL)←(AH)×0AH+(AL)AH←0隐含的操作寄存器为AH,AL;AAD要在DIV指令之前使用;影响标志位PF、SF、ZF,其它无定义;用AAD可实现≤99的十-二进制转换。111例3-33按十进制除法计算55÷7=?

MOV AX,0505H ;(AX)=55BCD MOV CL,07H ;(CL)=7 AAD ;(AX)=0037H DIV CL ;(AH)=6,(AL)=7

所得结果为非压缩的BCD码(商7余6)。例2:把73转换成等值的二进制数。

MOVAX,0703H;(AX)=73BCDAAD;(AX)=0049H112三.逻辑运算和移位指令逻辑运算指令●运算规则:按位操作,无进/借位

●对标志位的影响(除NOT指令外):

CFOFSFZFPFAF

00***无定义

根据运算结果设置113(1)逻辑“与”AND例1:保留AL中低4位,高4位清0。

ANDAL,0FH例2:AL中有字符’a’~’z’,将其转换成大写。

ANDAL,01011111B例3:使AX的C和F标志位清0

ANDAX,AX对两个操作数进行按位逻辑“与”操作。格式:ANDdest,src用途:保留操作数的某几位,清零其他位。AX88114例4:测试AL的bit7,bit5,bit2是否都是1。

ANDAL,10100100B CMPAL,10100100BJZYES<notall1>

…YES:115对两个操作数进行按位逻辑”或”操作。格式:ORdest,src用途:对操作数的某几位置1;对两操作数进行组合。(2)逻辑“或”OR例1:ORAL,30H例2:ORAX,00FFH例3:把AL的第5位置为1ORAL,00100000B116对操作数进行按位逻辑“非”操作。格式:NOTmem/regNOT指令对标志位无影响例:NOTCXNOTBYTEPTR[DI](3)逻辑“非”(取反)NOT117对两个操作数按位进行”异或”操作。格式:XORdest,src用途:对reg清零(自身异或)

把reg/mem的某几位变反(与’1’异或)(4)逻辑“异或”XOR

例1:把AX寄存器清零。

①MOVAX,0②XORAX,AX③ANDAX,0④SUBAX,AX例2:把DH的bit4,3变反

XORDH,00011000B即:XORDH,18H118操作与AND指令类似,但不将”与”的结果送回,只影响标志位。TEST指令常用于位测试,与条件转移指令一起用例:测试AL的内容是否为负数。

TESTAL,80H;检查AL中D7=1?

JNZMINUS;是1(负数),转MINUS

;否则为正数MINUS:(5)测试指令TEST1192.移位指令(1)非循环移位指令算术左移指令SAL(ShiftArithmeticLeft)

算术右移指令SAR(ShiftArithmeticRight)

逻辑左移指令SHL(ShiftLeft)

逻辑右移指令SHR(ShiftRight)这4条指令的格式相同,以SAL为例:

SALmem/reg,CL;移位位数大于1时1;移位位数等于1时!例:MOVCL,4SALAL,CL120移位指令执行的操作示意:最低位最高位CF0(a)算术/逻辑左移SAL/SHL最低位最高位CF(b)算术右移SAR最低位最高位CF(c)逻辑右移SHR0121结果未溢出时:左移1位≡操作数*2

右移1位≡操作数/2

算术移位——把操作数看做有符号数;逻辑移位——把操作数看做无符号数。

影响C,P,S,Z,O标志122例:把AL中的数x乘10

10=8+2=23+21 SALAL,1;2x MOVAH,AL;暂存,作为加数

MOVCL,2 SALAL,CL;8xADDAL,AH;8x+2x=10x例3-37P130123

不含进位位的循环左移指令ROL

不含进位位的循环右移指令ROR

含进位位的循环左移指令RCL

含进位位的循环右移指令RCR格式同非循环移位指令。移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。循环移位指令只影响标志位CF和OF。(2)循环移位指令124这4条指令的功能如下图示:最低位最高位CF(a)ROL最低位最高位CF(c)RCL最低位最高位CF(b)ROR最低位最高位CF(d)RCR125例:前例中计算x*10。(1)采用乘法指令:

MOV BL,10MUL BL

共需70~77个T周期。(2)采用移位和加法指令:

SAL AL,1;2TMOV AH,AL;2TSAL AL,1;2TSAL AL,1;2TADD AL,AH;3T

只需11个T周期,仅相当于乘法的1/7。用移位操作代替乘除法可提高运算速度126循环移位举例例2:将连续两个内存单元中的操作数带进位位循环右移1位

RCRWORDPTR[SI],1例1:将AL的高4位与低4位互换。

MOVCL,4ROLAL,CL127四.串操作指令串:顺序放在内存中的一组相同类型的数据。串操作:对串中的元素进行相同的操作。串操作的寻址方式:源操作数指针———DS:SI(DS可超越)

目的操作数指针——ES:DI每次串操作后:串操作指令自动修改SI和DI——字节±1,字±2。DF标志决定±。注意:退出串操作后,指针指向最后操作的元素的下一个元素。128

可完成存储单元到存储单元的传送、比较有的串操作指令前面可加重复前缀当使用重复前缀时,操作重复次数由CX决定(CX自动减量)。该指令重复执行,直至(CX)=0。执行串指令的设置(初始化)源串首地址(末地址)→SI目的串首地址(末地址)→DI串长度→CX建立方向标志(CLD使DF=0,STD使DF=1)

129重复前缀REP:无条件重复前缀-----(CX)≠0时重复格式:REP

串指令执行:(1)若(CX)=0则退出REP,否则执行(2)(2)(CX)(CX)-1(3)执行串指令

(4)重复(1)~(3)130REPE/REPZ:相等/为零时重复

(ZF)=1且(CX)≠0时重复格式:REPE/REPZ

串指令执行:(1)若(CX)=0或ZF=0则退出循环,否则执行(2)(2)(CX)(CX)-1(3)执行串指令

(4)重复(1)~(3)REPE/REPZ与CMPS配合实现串比较REPNE/REPNZ:不相等/不为零时重复

(ZF)=0且(CX)≠0时重复退出条件为ZF=1或(CX)=0,其余与REPE/REPZ相同该指令与SCAS配合实现字符查找131指令也可写成:MOVSdest,src但要求:

①src用DS:SI寻址,dest用ES:DI寻址②传送是字节还是字,由操作数的类型决定⒈串传送指令MOVSB/MOVSW指令执行的操作为:MOVSB:((ES):(DI))←((DS):(SI))SI±1,DI±1

MOVSW:((ES):(DI+1)(DI))←((DS):(SI+1)(SI))SI±2,DI±2

132例3-41将2000:1200地址开始的100个字节传送到6000:0000开始的内存单元

MOVAX,2000 MOVDS,AX MOVAX,6000 MOVES,AX

MOVSI,1200 MOVDI,0 MOVCX,100 CLD REPMOVSB …133⒉串比较指令CMPSB/CMPSWCMPSB:((DS):(SI))-((ES):(DI))

SI±1,DI±1CMPSW:((DS):(SI+1)(SI))-((ES):(DI+1)(DI))

SI±2,DI±2指令也可写成:CMPSdest,src比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。134例3-42比较两个字符串是否相同,并找出其中第一个不相等字符的地址,将该地址送BX,不相等字符送AL,两个字符串的长度均为200B,M1为源串首地址,M2为目标串首地址

LEASI,M1

LEADI,M2

MOVCX,200CLDREPECMPSBJZSTOP

DECSIMOVBX,SIMOVAL,[SI]STOP:HLT

135⒊串扫描SCASB/SCASW搜索指令执行的仍是比较(减法)操作,结果只影响标志位。要搜索的关键字放在AL(字节)或AX(字)中。本指令用于在串中查找指定的信息。对字节:(AL)-((ES):(DI))

DI±1

对字:(AX)-((ES):(DI+1)(DI))

DI±2136SCAS指令加上重复前缀后,可对串进行连续扫描比较:若前缀为REPZ,则表示比较结果相等(ZF=1)且串未结束(CX≠0),则继续比较。若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束(CX≠0)就继续比较。137例3-43在ES段的偏移2000H开始处存有10个ASCII码。搜索’A’,若找到则记下搜索次数及存放地址,并在屏幕上显示’Y’;若未找到则显示’N’。2000H414243444546’A’’B’’C’’D’’F’...ES段’E’

在屏幕上显示一个字符的指令段如下

(参见附录C.3)MOVDL,<字符>

MOVAH,2;单字符显示的功能号

INT21H;系统功能调用138

MOVDI,2000H

;(DI)←串偏移地址

MOVCX,0AH

;(CX)←串长度

MOVAL,‘A’

;搜索关键字=‘A’

CLD

;从低地址到高地址进行搜索

REPNZSCASB;若未找到,继续搜索

JZFOUND;找到,转FOUNDMOVDL,’N’;串中无‘A’JMPDONE;转DONEFOUND:DECDI;(DI)-1MOVDATA2,DI;DATA2←‘A’的地址

SUBDI,2000HMOVDATA1,DI;DATA1←搜索次数

温馨提示

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

评论

0/150

提交评论