8086指令系统综述_第1页
8086指令系统综述_第2页
8086指令系统综述_第3页
8086指令系统综述_第4页
8086指令系统综述_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

微机原理及其应用

信息与计算机学院闫勇yanyong10000@126.com3.3.18086指令系统的特点8086与8088的指令系统由8位的8080/8085指令系统扩展而来的,同时又能在其后续的80x86系列的CPU上正确运行。其主要特点是:采用可变长指令,指令格式比较复杂,编码形式灵活;寻址方式多样灵活,处理数据的能力比较强,可处理字节或字、带符号或无符号的二进制数据以及压缩型/非压缩型的十进制数据;有重复指令和乘、除运算指令,扩充了条件转移、移位/循环指令;为加强软件中断功能和支持多处理器系统的工作,增设了有关的指令。3.3.28086/8088指令的格式

-指令的构成1.指令助记符包括操作码和操作数。操作码:表示指令完成什么样的功能操作数:指令的操作对象2.指令的一般格式:

操作码

[操作数1],[操作数2];[注释]

目的操作数源操作数3.操作数的一般来源:1.立即数操作数,如MOVAX,1234H2.寄存器操作数,如MOVAH,AL3.存储器操作数,如MOVAX,[SI]4.I/O端口操作数,如INAL,n指令的格式8086/8088采用可变长指令,指令长度为1~6个字节。其指令编码格式有以下几种基本格式。1.无操作数指令这类指令一般属于控制类指令,指令中只包含1个字节的操作码OP,故又称为单字节指令。如:HLT2.单操作数指令这类指令只有1个操作数(字节或字),也只给出1个操作数地址。该操作数可以在寄存器或在存储器中,也可以是指令中直接给出的立即数。如: PUSHAX ; INC[1600H];[1600H]是数据段中的一个单元3.双操作数指令双操作数指令不允许两个操作数均在存储器中(串操作指令除外)。两个操作数均在寄存器中。如:MOVAX,BX两个操作数中有一个在寄存器中,另一个在存储器中。如:MOVAL,[SI]两个操作数中有一个在寄存器中,另一个是指令中给出的立即数。如:MOVAL,12H两个操作数中,一个在存储器中,另一个操作数是指令中给出的立即数。如:MOV[1600H],1200H3.3.3寻址方式在指令中,指定操作数或操作数存放位置的方法称为寻址方式。8086/8088的指令系统有以下几种寻址方式:(一)固定寻址

(二)立即数寻址(一)固定寻址有些单字节指令其操作是规定CPU对某个固定的寄存器进行的,如加法的ASCII调整指令AAA,规定被调整的数总是位于AL中。(二)立即数寻址操作数就在指令中,存放在代码段,当执行指令需要操作数时,CPU直接从指令队列缓冲器中取得该立即数,不需要额外执行总线周期访问存储器。注意:立即寻址只能用于源操作数。例如: MOV AX, 1C8FH MOV BYTEPTR[2A00H],8FH错误例:

×

MOV2A00H,AX(三)寄存器寻址操作数在寄存器(如AX、BH等)中,而寄存器名在指令中指出。寄存器寻址不需要执行总线周期访问存储器。例: MOVAX,BX ;BX->AX MOV [3F00H],AX ;AX->DS:3F00H MOV CL,AL ;AL

->CL MOV AH,4CH注意:源操作数与目的操作数字长要相同;

寄存器寻址与段地址无关。错误例:

×MOVAX,BL ;字长不同

×MOVES:AX,DX ;寄存器与段无关(四)存储器寻址操作数在存储器中(不是存在于代码段的立即数),必须经总线控制逻辑电路进行存取。当EU需要读/写位于存储器的操作数时,由EU中ALU先计算出操作数地址的偏移量(即有效地址EA),并将它送给总线接口单元BIU,同时请求BIU执行一个总线周期;BIU将与该偏移量相应的段寄存器的内容左移4位,加上由EU送来的该偏移量形成一个20位的实际地址(即物理地址),然后执行总线周期,读/写指令所需的操作数。有效地址8086/8088CPU所寻址的操作数地址的偏移量即有效地址EA,或称偏移地址,它是一个不带符号的16位地址码。计算EA的通式为:注意:有效地址=偏移地址=偏移量,由ALU根据操作数寻址方式计算得出;位移量≠偏移量,位移量一般在指令中直接给出。1.直接寻址方式指令中以位移量DISP的形式直接给出操作数的EA,即:EA=DISP;此方式需要将位移量外加[],表示里面存放的是地址而不是操作数。如: MOVAX,[1680H]注意:操作数默认的段寄存器为DS,也允许在以代码段、堆栈段、或附加段为基准的区域中,但要在指令中显式地指定其他段寄存器—称为段超越前缀。如:MOVDL,ES:[0100H]。在汇编语言指令中偏移地址一般用符号地址来表示。如:MOVSI,TABLE_PTR。为了使指令字不要过长,规定双操作数指令不能两个操作数都用直接寻址方式。错误例:

×

MOV[2000H],[3000H]2.间接寻址方式间接寻址方式是指寄存器间接寻址方式,其操作数一定在存储器中,而存储单元的有效地址EA则由寄存器指出。注意:只有SI、DI、BX和BP可作间址寄存器。书写指令时,这些寄存器带有方括号[]。以BX、SI、DI寄存器间接寻址,操作数在数据段;物理地址=DS×10H+BX/SI/DI(BX、SI、DI的某种组合)以BP寄存器间接寻址,操作数在堆栈段;物理地址=SS×10H+BP例:MOVAX,[SI]若DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H。则指令执行后,AX=3344H。44H33H6000H1200HDSSI60000H61200H

61200HAX存储器数据段

+)1200H44H33H(1)基址寻址方式

(2)变址寻址方式(1)基址寻址方式有效地址EA=BX/BP+DISP物理地址=DS/SS×10H+BX/BP+DISP例:MOVSI,[BX+1400H]或MOVSI,1400H[BX]则物理地址为:DS×10H+BX+1400H(2)变址寻址方式有效地址EA=SI/DI+DISP物理地址=DS×10H+SI/DI+DISP例:MOVAX,[SI]则物理地址:DS×10H+SI(3)基址加变址寻址方式有效地址EA=BX/BP+SI/DI+DISP物理地址=DS/SS×10H+BX/BP+SI/DI+DISP例: MOVAX,[BP+SI+6] ;BP默认SS段有效地址EA=BP+SI+06H物理地址为:SS×10H+BP+SI+06H注意:有的教材中,当指令中的地址位移量不为0时,又称为相对基址变址寻址方式。例:MOVAX,DATA[DI][BX]或MOVAX,[BX+DI+DATA]若DS=8000H,BX=2000H,DI=1000H,DATA=200H则指令执行后AH=(83021H),AL=(83020H)。8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS8000BX2000

DI1000选讲:存储器寻址的

段默认与段超越在存储器寻址方式中,基址与变址都有默认的段;但有时也可以通过段超越方式去寻址在其它段中的操作数。寻址方式操作数有效地址段默认段超越前缀直接寻址[disp]DSES,CS基址寻址[BX+disp]DSES,CS[BP+disp]SSDS,ES,CS变址寻址[SI/DI+disp]DSES,CS基址变址寻址[BX+SI/DI+disp]DSES,CS[BP+SI/DI+disp]SSDS,ES,CS选讲注意:不允许使用段超越前缀的情况:与堆栈操作有关的指令(PUSH,POP,CALL,RET,INT,IRET)使用SP作为指针,只能使用SS为段寄存器。串操作指令规定用DS:SI来指定源数据区,用ES:DI来指定目的数据区。

段超越前缀只能用于源,而不能用于目的;即SI可以更换段寄存器,而DI只能使用ES。指令只能存放在代码段。(五)I/O端口寻址方式输入/输出指令对I/O端口的寻址可采用直接或间接两种方式。1.直接端口寻址:I/O端口地址以8位立即数方式在指令中直接给出。所寻址的端口号只能在0~255范围内。

例如:INAL,n2.间接端口寻址:类似于寄存器间接寻址,16位的I/O端口地址在DX寄存器中,即通过DX间接寻址。可寻址的端口号为0~65535。

例如:OUTDX,AL ;将AL的内容输出到由DX指定的端口中去。(六)串操作指令寻址方式

(七)转移类指令的寻址方式(六)串操作指令寻址方式执行数据串指令时,源串操作数第1个字节或字的有效地址应存放在源变址寄存器SI中(不允许修改),目标串操作数第1个字节或字的有效地址应存放在目标变址寄存器DI中(不允许修改)。(七)转移类指令的寻址方式在8086/8088系统中,由于存储器采用分段结构,所以转移类指令有段内转移和段间转移之分。所有的条件转移指令只允许实现段内短转移,即只允许转移的地址范围在-128~+127字节内,由指令中直接给出8位地址位移量。寻址方式举例1.指出下列指令的源操作数寻址方式,对于存储器寻址写出EA的计算公式。a.MOV AX,[1000H]b.MOV AX,1000H;

c.MOV AX,BXd.MOV AX,[BP] e.MOV AX,1000H[DI] f.MOV AX,[BX+DI] g.IN AL,15H 2.判断下列指令是否正确,并说明原因。a.MOV [AX],[BP]b.MOV1000H,BXc.MOV[1000H],BXd.MOVCL,AX3.3.48086/8088指令的分类根据指令的功能,分为六类:数据传送类;

算术运算类;

逻辑运算类;

串操作类;

程序控制类;

CPU控制类。

数据传送类指令数据传送类指令可完成寄存器与寄存器之间、寄存器与存储器之间以及寄存器与I/O端口之间的字节或字传送。一.通用数据传送指令1.MOVd,s ;d←s即将由源s指定的源操作数送到目标d其中。注意:源与目的操作数要等长(即类型要匹配);源s不能是IP,目标d不能为CS、IP和立即数;

源s/目标d不能同时为存储器操作数;给段寄存器赋值,不能采用立即数方式。

错误例: MOVDS,1000H

;×

可改为: MOVAX,DATA ;DATA是预先分配的段名 MOVDS,AX例:MOVAL,BL;寄存器之间传送MOVBX,SIMOVCX,[BX+SI];存储器操作数传送到寄存器MOVAX,ARRAY[SI]MOVAX,0B00H;立即数传送到寄存器MOVCL,10000000BMOVVALUE,100H;立即数传送到存储器MOVES:[BX],4BH2.PUSHs

;将源操作数s(16位)压入堆栈

POPd

;将堆栈当前栈顶两相邻单元的数据字弹出到d这是两条进栈与出栈指令,其中,s和d可以是16位寄存器或存储器两相邻单元,以保证堆栈按字操作。注意:PUSH和POP指令执行过程(即:SP的变化);成对并且按照对称的次序使用;堆栈操作按字进行,没有单字节的堆栈操作指令;CS寄存器的值可以入栈,但不能反过来从堆栈弹出一个字到CS寄存器;常用于子程序调用和中断处理。例:设AX

=1020H,执行PUSHAX示意图:低地址存储区(SS段)(SP)存储区(SS段)进栈SP变化的方向执行后20H10H(AL)(AH)(SP)-2(SP)高地址低地址高地址执行前AX=1020H执行POPBX的示意图:低地址存储区(SS段)出栈方向执行前20H10H(SP)存储区(SS段)执行后BX=1020H(SP)BX20H10H高地址低地址高地址3.XCHGd,s此指令是将源操作数与目标操作数相互对应交换位置。注意:可以在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行交换。不能在两个存储单元之间交换,段寄存器与IP也不能作为一个源或目的操作数。例: XCHGAL,BL XCHGBX,CX XCHG[2530H],CX 选讲4.XLAT ;[BX+AL]→AL这是一条用于实现字节翻译功能的指令,又称为代码转换指令,或查表指令。它可以将AL寄存器中设定的一个字节数值变换为内存一段连续表格中的另一个相应的代码,以实现编码制的转换。执行XLAT指令之前,将表的首地址→BX;表中某一项与表首址的位移量(距离)→AL。例:内存数据段有一张16进制数的ASCII码表,设段首偏移地址为2000H,如欲查出表中第11个代码(代码序号从0开始)即十六进制数B的ASCII码。ASCII表在DS段中,并假设DS=4000H。执行程序:MOVBX,2000H;BX←表首地址MOVAL,0BH;AL←表中序号XALT;查表转换执行后得到:(AL)=42H=‘B’303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’存储器二.目标地址传送指令1.LEAd,s取有效地址指令,其功能是把用于指定源操作数(它必须是存储器操作数)的16位偏移地址(即有效地址)传送到一个指定的16位通用寄存器中。例:LEABX,[1600H];则指令执行之后,BX

=1600H,是偏移地址。区别:MOVBX,[1600H] ;指令执行后BX等于数据段偏移地址为

;1600H的存储单元的内容,一般为操作数。下面两条指令等效:

LEABX,BUFFER MOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存储器单元BUFFER的偏移地址。2.LDSd,s取某变量的32位地址指针的指令,其功能是从由s指定的存储单元开始的4个连续存储单元中取出该变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)送到由d指定的某16位通用寄存器,后两字节(即变量的段地址)传送到DS段寄存器中。如:LDSSI,[DI+100AH] ;执行后 SI=(DS×10H+DI+100AH),DS=(DS×10H+DI+100AH+2)3.LESd,s这条指令与LDSd,s指令的操作基本相同,其区别仅在于将把由源所指定的某变量的地址指针中后2个字节(段地址)传送到ES段寄存器,而不是DS段寄存器。如:LESSI,[DI+100AH]

三.标志位传送指令1.LAHF将标志寄存器F的低字节(共包含5个状态标志位)传送到AH寄存器中。2.SAHF将AH寄存器内容传送到标志寄存器F的低字节。OFDFIFTFSFZFAFPFCFAHFLAGOFDFIFTFSFZFAFPFAHFLAGCF3.PUSHF将16位标志寄存器F内容入栈保护。其操作过程与前述的PUSH指令类似。4.POPF将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中。提示:PUSHF与POPF常成对出现,一般用在子程序和中断处理程序的首尾,用来保护和恢复主程序涉及的标志寄存器内容.必要时可以用来修改标志寄存器的内容.四.

I/O数据传送指令1.IN累加器,端口号IN指令是将指定端口中的内容输入到累加器AL/AX中。端口号可以用8位立即数直接给出;也可以将端口号事先安排在DX寄存器中,间接寻址16位端口号。例如:INAL,PORT;AL←(端口PORT)

INAX,PORT;AX←(端口PORT)

INAL,DX;AL←(端口(DX))

INAX,DX;AX←(端口(DX))2.OUT端口号,累加器OUT指令是将累加器AL/AX中的内容输出到指定的端口。具体如下: OUTPORT,AL ;端口PORT←AL

OUTPORT,AX ;端口PORT←AX

OUTDX,AL ;端口(DX)←AL

OUTDX,AX ;端口(DX)←AX注意:I/O指令只能用累加器AL/AX作为执行I/O数据传送的机构,而不能用其它寄存器(包括AH)代替。当用直接寻址的I/O指令时,寻址范围为0~255,适用于较小规模的微机系统;当用端口号由寄存器DX给出的间接寻址的I/O指令时,寻址范围为0~65535。数据传送指令小结1.数据传送指令本身不影响标志位;2.除XCHG指令外,都是从源到目的的单向传送;3.注意MOV和LEA的差别;4.指令有多种格式,但一般遵循以下规则:双操作数指令中一般不允许两个操作数都在存储器中(串操作指令除外);目的操作数不允许立即数寻址方式。5.段寄存器只能在MOV、POP、PUSH指令中作为操作数出现。如:MOVES,AX和PUSHCS和POPDS;但下列指令不合法:MOVCS,reg和POPCS;

算术运算类指令

一.加法指令1.ADDd,s;d←d+s目标操作数不允许是立即数,其他同源操作数。且不允许两者同时为存储器操作数。ADD指令对6个状态标志均产生影响。例:已知BX=D75FH,指令ADDBX,8046H执行后,状态标志各是多少?

D75FH=1101011101011111

+8046H=1000000001000110

(1)0101011110100101结果:CF=1,ZF=0,PF=1,AF=1,OF=1,SF=02.

ADCd,s

;d←d+s+CF带进位的加法指令进位标志位CF的原状态也将一起参与加法运算;待运算结束后,CF将根据结果置成新的状态。例如:ADCAL,68H;AL←AL+68H+CF ADCAX,CX;AX←AX+CX+CF ADCBX,[DI];BX←BX+[DI]+CFADC指令用于多字节加法运算中,一般在ADD之后使用。

例:见下页。例:有两个4字节的无符号数相加:2C56F8ACH+309E47BEH=?设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区。分析:因CPU只能进行8/16位的加法运算,可将两数分成低字和高字分别相加。程序段如下:MOVAX,BUFFER2 ADDBUFFER1,AX ;低字相加MOVAX,BUFFER2+2 ADCBUFFER1+2,AX ;高字相加,包括低字的进位56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加数加数数据段......3.INCd

;d←d+1加1指令将目标操作数当作无符号数,加1后仍保留在目标中;

如:INCAX ;AX←AX+1目标操作数不允许是立即数。本指令只影响ZF、OF、SF、PF、AF,而不影响CF标志;对于间接寻址的存储器数据加1要求用伪指令BYTEPTR、WORDPTR、DWORDPTR类型伪指令来说明数据的长度。

如:INC

BYTEPTR

[BX+1000H]二.减法指令1.SUBd,s

;d←d-s,减法指令不允许两个操作数同时为存储器操作数,也不允许做段寄存器的减法。2.SBBd,s

;d←d-s-CF带借位减法指令完成减法运算时还要再减去进位标志CF的原状态。待运算结束,CF将根据结果置成新的状态。常用于比16字节宽的多字节减法中。3.DECd

;d←d-1减1指令目标操作数不允许是立即数。不影响进位标志CF,因此不能用INC设置进位位。间接寻址需伪指令说明数据的长度。4.NEGd

;d←d+1求补码指令将d按位取反后加1,实际为d←0-d,即取负。系统约定CF一般置1,只有d=0时CF=0。5.CMPd,s

;d-s,

比较指令不回送结果,只根据结果置标志位;不允许做段寄存器比较。比较两数的大小时,应区分无符号数与有符号数的判断条件:(1)对于两无符号数比较,只需根据进位标志CF即可判断:ZF=1时,表示d=s;ZF=0时:若CF=0,则d≥s;若CF=1,则d<s。(2)对于两有符号数比较,则要根据OF和SF两者的异或运算结果来判断:当OF⊕SF=0时,d≥s;当OF⊕SF=1时,d<s。比较指令CMP在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。例:比较AL、BL、CL中有符号数的大小,将最小数放在AL中。

CMPAL,BL ;前两个数相比较

JNGBBB ;若AL较小,则转而与CL比较 XCHGAL,BL ;若AL>BL,将BL中的小数放入ALBBB: CMPAL,CL ;AL和CL比较

JNGCCC ;若AL≤CL,则AL中为最小的 XCHGAL,CL ;若AL>CL,将CL中的小数放入ALCCC: HLT三.乘法指令指令格式:OPs进行乘法时:

字节乘法: 8位×8位→16位乘积;

字乘法: 16位×16位→32位乘积。对被乘数、乘数及乘积存放有如下规定:

被乘数 乘数 乘积

字节乘法 AL s(8bit) AX

字乘法 AX s(16bit) DX||AX注意:由s指定的源操作数作乘数,它可以是8/16位通用寄存器或存储器操作数,不能是立即数;若为存储器操作数,必须在前面加BYTEPTR或WORDPTR说明是字节还是字。如:

MULBYTEPTR[SI]1.MULs

;无符号乘法指令它完成两个无符号的8/16位二进制数相乘的功能。若运算结果的高位字节(字节乘)或高位字(字乘)有效,即AH≠0或DX≠0,则CF和OF同时置1;否则CF=OF=0。

标志寄存器其他4个状态位状态不定。2.IMULs ;有符号乘法指令该指令除计算对象是有符号二进制数以外,其他都与MUL一样。IMUL指令对OF和CF的影响是:若乘积的高一半是低一半的符号扩展(为全0或全1),则OF=CF=0;否则均为1。

标志寄存器其他4个状态位状态不定。四.除法指令指令格式:OPs进行除法时: 16位/8位→8位商(/8位余数); 32位/16位→16位商(/16位余数)。对被除数、商及余数存放有如下规定:

被除数 除数

商 余数

字节除法 AX s(8bit) AL AH

字除法 DX||AX s(16bit) AX DX注意:由s指定的源操作数作乘数,它可以是8/16位通用寄存器或存储器操作数,不能是立即数。若为存储器操作数,必须在前面加BYTEPTR或WORDPTR说明是字节还是字。如:

DIVWORDPTR[BX]1.DIVs完成两个无符号二进制数相除的功能。商和余数也是无符号数,字节/字除法时商最大为FFH/FFFFH。2.IDIVs完成将两个有符号的二进制数相除的功能。字节/字除法允许的最大商数为+127/+32767,最小商数为-127/-32767。与DIV指令的主要区别在于对符号位处理的约定:与DIV一样,如果除数s是字节/字数据,被除数应为字/双字数据并隐含存放于AX/DX||AX中;如果被除数也是字节/字数据在AL/AX中,应将AL/AX的符号位(AL7)/(AX15)扩展到AH/DX后,才能开始字节/字除法运算商和余数均为有符号数:商数在AL/AX寄存器中,AL7/AX15是商数的符号位;余数在AH/DX中,AH7/DX15

是余数的符号位,它应与被除数的符号一致。注意事项若字节除法/字除法的被除数是字节/字的长度,一定要先将AH/AX进行处理,再执行除法;

其中对于DIV指令,需要编程事先将AH/AX清零;对于IDIV指令,需要专门的符号扩展指令对AH/AX进行设置。

(请在实验课上验证。)若除法运算所得的商数超出累加器(AL或AX)的容量,则系统将其当作除数为0处理,自动产生中断类型号为0的除法出错中断,此时所得的商、余数均无效。3.CBW和CWDCBW和CWD是专为IDIV指令设置的符号扩展指令,用来扩展被除数字节/字为字/双字的符号,所扩充的高位字节/字部分均为低位的符号位。CBW指令将AL的最高有效位D7扩展至AH

即:若D7=0,则(AH)=00000000B=00H;

若D7=1,则(AH)=11111111B=FFH。CWD指令将AX的最高有效位D15扩展形成DX。CBW和CWD在使用时应安排在IDIV之前,用来获取除法指令所需要的被除数。执行结果对标志位没有影响。五.十进制调整指令8086为完成十进制数运算而专设了一组十进制调整指令。1.DAA

;加法的十进制调整指令。将存于AL寄存器中的2位BCD码加法运算的结果调整为2位压缩型十进制数,仍保留在AL中。它必须跟在ADD或ADC指令之后使用。调整过程:若(AL∧0FH)>9H或AF=1(低四位非法),则AL+06H→AL,1→AF;若AL>9FH或CF=1(高四位非法),则AL+60H→AH,1→CF。例:计算54+63,采用BCD码。 MOVAL,54H MOVBL,63H ADDAL,BL DAA01010100;54H+01100011;63H10110111;B7H>9FH+01100000

;60H100010111;17H,CF=12.DAS

;减法的十进制调整指令将AL寄存器中的减法运算结果调整为2位压缩型十进制数,仍保留在AL中。减法是加法的逆运算,对减法的调整操作是减6调整。调整过程:若(AL∧0FH)>9H或AF=1,则AL-06H→AL;若AL>9FH或CF=1,则AL-60H→AL。3.AAA

;加法的ASCII码调整指令。将存于AL寄存器中的1位ASCII码数加法运算的结果调整为1位非压缩型十进制数,仍保留在AL中;如果向高位有进位(AF=1),则进到AH中。该指令只能放在ADD之后。调整过程:①若(AL∧0FH)≤9H且AF=0(低四位合法),转③;②若(AL∧0FH)>9H或AF=1(低四位非法),则AL+6→AL,AH+1→AH,1→AF,1→CF;③AL高4位无意义,参与运算也不应影响结果,屏蔽之:

(AL∧0FH)→AL,0→AF→CF。例计算5+9,采用ASCII码。用ACSII码表示:AL=00110101B=35H,BL=00111001B=39H,AH=00H.指令为: MOVAL,35H MOVBL,39H ADDAL,BL AAA结果:(AH)=00000001B,(AL)=00000100B,即十进制14;AF=1,CF=100110101+0011100101101110;低4位>9

+0110

01110100;AF=1CF,AH+1AH∧00001111;屏蔽高4位00000100;AL高4位清0,低4位不变②③4.AAS

;减法的ASCII码调整指令,它必须跟在SUB或SBB指令之后,用来将AL寄存器中的减法运算结果调整为1位非压缩型十进制数;如有借位,则保留在借位标志CF中。调整过程:①若(AL∧0FH)≤9H且AF=0(低四位合法),转③;②若(AL∧0FH)>9H或AF=1(低四位非法),则AL-6→AL,AH-1→AH,1→AF,1→CF;③AL高4位无意义,参与运算也不应影响结果,屏蔽之:

(AL∧0FH)→AL,0→AF→CF。5.AAM

;乘法的ASCII码调整指令将AL中的乘法运算结果调整为2位非压缩型十进制数,其高位在AH中,低位在AL中。AAM用于乘法指令之后,参加乘法运算的十进制数必须是非压缩型。调整过程:将AL中的乘积除以10,商存于AH中,余数存于AL中。MUL指令之前一般安排两条AND指令(为什么?)例: ANDAL,0FH;初始ACSII码AL=37H,BL=39H ANDBL,0FH;使得AL=07H,BL=09H MULBL;则AL=3FH AAM;则AH=06H,AL=03H6.AAD

;除法的ASCII码调整指令将累加器AX中的2位非压缩型十进制的被除数调整为二进制数,保留在AL中。在除法之前进行调整操作。调整过程:(AL+AH×10)→AL。例:十进制数67,非压缩BCD码表示时,AH=00000110B,AL=00000111B,

执行AAD时,将AH内容乘以10,得到00111100,再加到AL中,结果为01000011B=43H。

算数运算类指令小结包括二进制运算指令和十进制运算调整指令;算数运算指令影响标志位;注意有符号和无符号的区别;乘除法指令是单操作数指令,另一个操作数约定在AX/DX||AX中,运算结果的存放也有相应的约定;SUB和CMP指令都做减法运算,但CMP指令不改变操作数的值,而改变标志位的值;加1和减1指令,一般用于修改地址指针和修改循环计数器;十进制运算调整指令,分为压缩的和非压缩的两种,仅限于字节,只对AL/AX中的内容调整。

逻辑运算和

移位循环类指令一.逻辑运算指令1.ANDd,s ;d←d∧s,按位“与”操作,可实现位清0。例: MOVAL,B6H ANDAL,0FH 10110110

∧ 00001111

;屏蔽字OFH

00000110;高4位清02.ORd,s

;d←d∨s,按位“或”操作;可实现位置1。例: MOVAL,B6H ORAL,0FH 10110110

∨ 00001111

;屏蔽字0FH10111111;低4位置13.XORd,s

;d←d⊕s,按位“异或”操作主要用于将若干位取反的操作:需取反的位与1异或,保持不变的位与0异或。例:XORAL,AL;可以实现AL清0,且CF=0。4.NOTd

;d←d,按位取反操作5.TESTd,s

;d∧s,按位“与”操作与AND类似,但不送回结果,后面常跟转移指令。二.移位指令与

循环移位指令格式:OPd,CNT操作:对目的操作数d移动由CNT指定的次数;移位结果送d;移出的位送标志位CF。说明:d可以是通用寄存器或存储器操作数;当移动次数等于1时,CNT=1;

当移动次数大于1时,必须将移动次数事先存入CL,此时CNT为CL。(一)

移位指令移位指令分为算术移位和逻辑移位。算术移位对有符号数移位,移位过程中保持符号不变;逻辑移位对无符号数移位,总是用“0”填补已空出的位。根据移位的结果置标志寄存器中的状态标志(AF位除外)。若移1位,并使得最高位(符号位)发生变化,则将溢出标志OF置“1”;若移多位,则OF标志无效。C0CSAL算数左移SAR算数右移C0SHL逻辑左移CSHR逻辑右移0相同不同例:AL=abcdefgh,CL=3。a~h均为0、1二进制数。分别执行四种移位指令。 CF AL执行前/ abcdefgh1.SALAL,CL c defgh000

2.SARAL,CL f

aaaabcde3.SHLAL,CL c defgh000

4.SHRAL,CL f

000abcdeC0CC0C0(二)

循环移位指令循环移位指令是将操作数首尾相接进行移位,它分为不带进位位与带进位位两种循环移位。这类指令只影响CF和OF标志:CF标志总是保持移出的最后一位的状态。若只循环移1位,且使最高位发生变化,则OF标志置“1”;若循环移多位,则OF标志无效。CCROL循环左移ROR循环右移CCRCL带进位位循环左移RCR带进位位循环右移例:设AL=abcdefgh,CL=3,CF=i。a~i均为0、1二进制数。分别执行四种循环移位指令。 CF AL执行前 i abcdefgh1.ROLAL,CL c defghabc2.RORAL,CL f fghabcde3.RCLAL,CL c defghiab4.RCRAL,CL f ghiabcdeCCCC

串操作类指令串操作类指令是惟一一类在存储器内的源与目标之间进行操作的指令。使用约定串操作指令均采用隐含寻址:源数据串由DS:SI提供;目标串由ES:DI提供,即将源串和目标串的首元素或末元素的偏移地址分别置入SI和DI中。如果要在同一段内进行串操作,必须使DS和ES指向同一段。数据串的长度预先送CX寄存器。使用CLD、STD指令设置方向标志位: DF=0:串操作由低向高地址进行,SI和DI内容应递增; DF=1:串操作由高向低地址进行,SI和DI内容应递减。每条指令有两种形式,分别对应着字节操作和字操作。

如:MOVS d,s指令有以下两种形式: MOVSBd,s ;字节传送MOVSWd,s ;字传送一.5个基本的

串操作指令1.MOVS将DS:SI源串中的1个字节或字,传送到ES:DI作为指针的目标串中,自动修改SI/DI,使之指向下一个元素。在MOVS指令之前可以加上重复前缀REP。具体操作:字节传送MOVSB

;

((ES):(DI))←((DS):(SI)),SI±1,DI±1;字传送MOVSW

;((ES):(DI+1)(DI))←((DS):(SI+1)(SI)),SI±2,DI±2。2.CMPS将DS:SI源串的1个元素减去由ES:DI作为指针的目标串中相对应的1个元素,不回送结果,只根据结果特征置标志位;相应地修改SI和DI。在CMPS指令前可以加重复前缀REPE/REPZ,可用来确定两个串中第一个不相同的数据

。具体操作:字节比较CMPSB

;

((DS):(SI))←((ES):(DI)),

SI±1,DI±1;字比较CMPSW

;((DS):(SI+1)(SI))←((ES):(DI+1)(DI)), SI±2,DI±2。3.SCAS从目标串ES:DI中搜索(查找)某个关键字,要求将待查找的关键字在事先置入AX或AL中。不传送结果,只根据结果置标志位。具体操作:字节查找SCASB

;AL-((DI)),DI←DI±1;字查找SCASW;AX-((DI+1)(DI)),DI←DI±2。通常在SCAS前加重复前缀REPNE/REPNZ,用来从目标串中寻找关键字,操作一直进行到ZF=1(查到了某关键字)或CX=0(终未查找到)为止。4.LODS将源串中由SI所指向的元素取到AX/AL寄存器中,修改SI的内容。一般不加重复前缀,常用来和其他指令结合使用。具体操作:字节取LODSB ;AL←((SI)),SI←SI±1;字取LODSW ;AX←((SI+1)(SI)),SI←SI±2。5.STOS将AX/AL寄存器中的1个字或字节存入由DI作为指针的目标串中,同时修改DI,一般不加重复前缀(否则串元素值都相同)。具体操作:字节存LODSB ;((DI))←AL,DI←DI±1;字取LODSW ;((DI+1)(DI))←AX,DI←DI±2。二.3个重复前缀为加快串操作的执行,在基本串操作指令的前方加上重复前缀,共有无条件重复(REP)、相等/为0时重复(REPE/REPZ)和不等/不为0重复(REPNE/REPNZ)5种重复前缀。带有重复前缀的串操作指令,每处理完一个元素能自动修改CX的内容(按字节/字处理减1/减2),以完成计数功能。当CX≠0时,继续串操作,直到CX=0才结束串操作。1.REP ;常与MOVS连用,执行到CX=0为止;2.REPE和REPZ;常与CMPS连用。只有当ZF=1且CX≠0时,才重复执行串操作,比较操作一直进行到ZF=0或CX=0时为止;3.REPNE和REPNZ;常与SCAS连用。只有当ZF=0且CX≠0时才重复执行串操作,搜索操作一直进行到ZF=1或CX=0为止。

程序控制指令一.无条件转移:3条

对无符号数的条件转移:4条

二.条件转移:18条

对有符号数的条件转移:4条

单标志转移:10条

三.循环控制:4条

四.中断:3条一.无条件转移指令1.JMP目标标号允许程序流无条件地转移到由目标标号指定的地址,去继续执行从该地址开始的程序。转移可分为段内转移和段间转移两类。段内转移是指在同一代码段的范围之内进行转,此时,只需要改变指令指针IP寄存器的内容,即用新的转移目标地址(指偏移地址)代替原有的IP值就可实现转移。段间转移则是要转移到一个新的代码段去执行指令,此时不仅要修改IP的内容,还要修改段寄存器CS的内容才能实现转移。此时的转移目标地址应由新的段地址和偏移地址两部分组成。JMP指令的4种格式根据目标地址的位置与寻址方式的不同,JMP指令有4种基本格式。①段内直接转移段内直接转移是指目标地址就在当前代码段内,其偏移地址(即目标地址的偏移量)与本指令当前IP值(即JMP指令的下一条指令的地址)之间的字节距离即位移量将在指令中直接给出。此时,目标标号偏移地址为:

目标标号偏移地址=(IP)+指令中位移量

式中,(IP)是指IP的当前值。位移量的字节数则根据微处理器的位数而定。不同的位移量若位移量只有1个字节,则称为段内短转移,其目标标号与本指令之间的距离不能超过+127和-128字节范围。格式:JMPSHORTOPR

操作:(IP)←(IP)+8位位移量,OPR为即将转移到的指令的偏移地址的符号。

如:JMPSHORTPROG_S若位移量占2个字节,则称为段内近转移,其目标标号与本指令之间的距离不能超过±32K字节范围。格式:JMPNEARPTROPR操作:(IP)←(IP)+16位位移量。如:JMPNEARPTRPROG_N注意:段的偏移地址是周期性循环计数的,这意味着在偏移地址FFFFH之后的一个位置是偏移地址0000H。因此,若IP指向偏移地址FFFFH,而要转移到存储器中的后两个字节地址,则程序流将在偏移地址0001H处继续执行。②段内间接转移一种间接寻址方式,它将段内的目标地址(指偏移地址或按间接寻找方式计算出的有效地址)先存放在某通用寄存器或存储器的某两个地址连续的单元中,指令中只需给出该寄存器号或存储单元地址即可。格式:JMPWORDPTROPR或JMPreg操作:(IP)←(EA),其中EA由OPR的寻址方式确定。例如:JMPBX ;BX未打[],仍表示BX的内容是地址 JMPWORDPTR[1000H]③段间直接(远)转移程序由当前代码段转移到其他代码段,转移范围超过±32K字节。指令中直接给出目标标号的段地址和偏移地址。格式:JMPFARPTROPR操作:(IP)←OPR的段内偏移地址, (CS)←OPR所在段的段地址。例如:JMPFARPTRADDR2 ;ADDR2是当前代码段之

;外的另一个代码段中的一个内

;存单元偏移地址。④段间间接转移以间接寻址方式来实现由当前代码段转移到其他代码段。将目标地址的段地址和偏移地址先存放于存储器的4个连续地址中,其中前2个字节为偏移地址,后2个字节为段地址,指令中只需给出存放目标地址的4个连续地址首字节的偏移地址值.格式:JMPDWORDPTROPR ;OPR是即将要转移到的指令所在段地址、偏移地址的存放地址操作:(IP)←(OPR+1,OPR),(CS)←(OPR+3,OPR+2)例如:JMPDWORDPTR[BX+ADDR3]2.CALL过程名

;无条件调用过程指令CALL指令将迫使CPU暂停执行主程序后续的下一条指令(即断点),转去执行指定的过程;过程执行完毕,再用返回指令RET将程序返回到断点。8086/8088指令系统中把处于当前代码段的过程称为近过程,用NEAR表示,而把其他代码段的过程称为远过程,用FAR表示。调用近过程,只需将当前IP值入栈;如果是远过程,则必须将当前CS和IP的值一起入栈。CALL指令的4种格式①段内直接调用如: CALLPROC_N ;PROC_N是一个近标号②段内间接调用如: CALLBX ;BX未打[],仍表示BX的内容是地址 CALLWORDPTR[BX+SI] ③段间直接调用如:CALLFARPTRPROC_F ;PROC_F是一个远标号 CALL2000H:5600H④段间间接调用如:CALLDWORDPTR[DI]3.RET

;过程返回指令功能是从堆栈顶部弹出由CALL指令压入的断点地址值,迫使CPU返回到调用过程的断点去继续执行。该指令应安排在过程的出口即过程的最后一条指令处。RET指令与CALL指令相呼应,CALL指令安排在调用过程中,RET指令安排在被调用过程末尾处。并且,为了能正确返回,返回指令的类型要和调用指令的类型相对应。在8086/8088指令系统中,段内返回与段间返回的指令形式是一样的,都是RET,但它们的指令代码却不同,段内返回指令的代码为C3H(或C2H),而段间返回指令的代码为CBH(或CAH)。

二.条件转移指令条件转移指令共有18条,这些指令将根据CPU执行上一条指令时,某一个或某几个标志位的状态而决定是否控制程序转移。如果满足指令中所要求的条件,则产生转移;否则,将继续往下执行紧接着条件转移指令后面的一条指令。为缩短指令长度,所有的条件转移指令都被设计成短转移,即转移目标与本指令之间的字节距离在-128~+127范围以内。对无符号数和有符号数

的条件转移指令类别指令助记符测试条件指令功能无符号数测试比较JA/JNBE目标标号JAE/JNB目标标号JB/JNAE目标标号JBE/JNA目标标号CF∧ZF=0CF=0CF=1CF∧ZF=1高于/不低于则转移高于等于/不低于则转移低于/不高于等于则转移低于等于/不高于则转移有符号数测试比较JG/JNLE目标标号JGE/JNL目标标号JL/JNGE目标标号JLE/JNG目标标号(SF⊕OF)∧ZF=0SF⊕OF=0SF⊕OF=1(SF⊕OF)∧ZF=1大于/不小于等于则转移大于等于/不小于则转移小于/不大于等于则转移小于等于/不大于则转移单标志转移指令指令助记符测试条件指令功能JC目标标号JNC目标标号JZ/JE目标标号JNZ/JNE目标标号JS目标标号JNS目标标号JO目标标号JNO目标标号JP/JPE目标标号JNP/JPO目标标号CF=1CF=0ZF=1ZF=0SF=1SF=0OF=1OF=0PF=1PF=0有进位则转移无进位则转移结果为0/相等则转移结果不为0/不相等则转移符号为负则转移符号为正则转移溢出则转移不溢出则转移奇偶位为1/为偶则转移奇偶位为0/为奇则转移注意所有条件转移指令都是相对转移形式,其转移范围-128B~+127B。

当需要转移到较远目标地址时,可先用条件转移指令转到附近一个单元,该单元事先放一条无条件转移指令,可通过该指令转移到较远的目标地址去。为无符号数和有符号数提供了两组不同的条件转移指令。有一部分转移指令可用两种不同助记符表示,其功能相同,如数M高于数N=M不低于也不等于N,所以JA与JNBE功能相同。条件转移指令的使用条件转移指令前面常有TEST指令例:AX中存放的无符号数,若为偶数,则直接除以2;若为奇数,则加1再除以2。编程实现该功能。 TESTAX,01H ;最低位与1相与,判断奇偶性 JZEVEN ;ZF=0,为偶数,则转到EVEN ADDAX,1 ;否则为奇数,需要加1EVEN:SHRAX,1 ;除以2三.循环控制指令在设计循环程序时,可以用循环控制指令来实现。循环控制指令实际上是一组增强型的条件转移指令,它也是根据测试状态标志判定是否满足条件而控制转移。所不同的是,前述的条件转移指令只能测试由执行前面指令所设置的标志,而循环控制指令是自己进行某种运算后来设置状态标志的。循环控制指令共有4条,都与CX寄存器配合使用,CX中存放着循环次数,使用这些指令之前都要把循环次数存入CX。这些指令所控制的目标地址的范围都在-128~+127字节之内。1.LOOP目标标号功能是先将CX减1后送回CX,再判断CX是否为0,若CX≠0,则转移到目标标号所给定的地址继续循环;否则,结束循环,顺序执行下一条指令。使用LOOP指令前,应将循环次数送入CX寄存器。其操作过程与条件转移指令类似,只是它的位移量应为负值。2.JCXZ目标标号指令不对CX寄存器内容进行操作,只根据CX内

温馨提示

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

评论

0/150

提交评论