第3-章8086-微机机器语言指讲解课件_第1页
第3-章8086-微机机器语言指讲解课件_第2页
第3-章8086-微机机器语言指讲解课件_第3页
第3-章8086-微机机器语言指讲解课件_第4页
第3-章8086-微机机器语言指讲解课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

第3章

8086微机机器语言指令

教学目标:掌握数据操作数的寻址方式;掌握数据传送指令、加减运算指令、位操作指令的功能与用法;了解其它指令的作用。教学重点:常用指令的功能与用法。教学难点:指令的应用。3.1.1指令格式

一条指令是一个有意义的二进制代码序列,它是机器语言的一个语句,其基本格式为:操作码字段OP地址码字段A

——操作码表明了指令的功能及操作,

——地址码又称操作数字段,指明了参与操作运算的操作数地址。1.指令操作码指令系统中每条指令都有唯一确定的操作码。操作码的位数越多,所能表达的操作种类就越多。(1)规整型操作码字段的长度和位置固定,又称定长编码,编码最简单。

◆定长编码多用在大中型计算机上,如IBM370机指令操作码都为8bit(位)。

RISC指令集采用定长编码。

◆定长编码有利于简化硬件设计、减少指令译码时间;

但往往造成资源浪费(冗余)。

(2)非规整型非规整型操作码的长度不定,且分散在指令字的不同位置上,因此又称变长编码。

变长编码广泛用在小型、微型计算机上,如PDP小型机。

CISC指令集是非规整型编码。1.指令操作码(续)扩展操作码法:灵活充分利用指令的各个字段,在不增加指令长度的情况下,扩展操作码能表示更多的指令。80x86微处理器采用扩展操作码法。变长编码增加指令译码的难度,控制器的设计较复杂。2.指令地址码每条指令必须包括CPU执行所需的全部信息。

对双操作数指令,除了操作码OP(Operate)外,还必须包含:第一源操作数地址A1(Address1)、第二源操作数地址A2、操作结果的存放地址A3,以及下条指令在内存中的存放地址A4。程序计数器PC(Programcounter)来指向要执行指令的地址,

现代计算机地址码字段有四种结构:三地址、双地址、单地址和零地址。三地址指令格式:OPA1A2A3

;操作为:[A1]OP[A2]→A3,

PC+1→PC(隐含)

三地址指令在小型、微型计算机中很少使用。双地址指令格式:OPA1A2;操作为:[A1]OP[A2]→A1,PC+1→PC(隐含)

执行前,A1和A2中各存放一个源操作数,执行后结果存放到A1中,A1中原先的源操作数被冲掉。因此[A2]称源操作数,[A1]称目标操作数(又称目的操作数)。3.1.2基本寻址方式1.寄存器寻址操作数就存放在CPU通用寄存器中,存取操作数无需访问内存,指令执行速度快。8086/8088CPU有8个通用寄存器,指令中只用3bit即可表示,如下表所示。2.I/O端口寻址(1)直接寻址指令中用8位无符号数直接表示I/O端口地址号。

如:INAL,n;输入:AL←[n],n在0~255之间,表示端口号

(2)间接寻址DX指向I/O端口,即用DX内容(16位无符号数)表示I/O端口地址编号,范围在0~65535之间。

如:OUTDX,AL;输出:[DX]←AL3.存储器寻址

(1)立即寻址指令地址码字段就是操作数本身。立即数只能作为源操作数。

(2)直接寻址指令地址码字段直接给出操作数在段内的偏移量,段基址隐含给出或由段前缀指明。指令语句中,直接地址(一般为16位无符号数)用方括号括起来。段隐含:

EA=DS×16

+偏移地址段显式:

EA=段寄存器×16

+偏移地址

(3)寄存器间接寻址操作数在段内的地址在基址寄存器BX、BP或变址寄存器SI、DI中,根据寄存器的内容(段内的偏移地址值)到存储器中寻找操作数;段基址可用段前缀显式表示,更多的是隐含表示。

段隐含:EA=DS×16+(BX或SI或DI) EA=SS×16+BP段显式:EA=段寄存器×16+(BX或BP或SI或DI)(4)寄存器相对寻址操作数在段内的偏移地址为基址/变址寄存器内容加上指令中给出的8位或16位偏移量。段基址表示同(3)。段隐含:EA=DS×16+(BX或SI或DI)+(8位或16位偏移量)

EA=SS×16+BP+(8位或16位偏移量)段显式:EA=段寄存器×16+(BX或BP或SI或DI)+(8位或16位偏移量)(5)基址变址寻址操作数在段内的偏移地址是基址寄存器BX或BP与变址寄存器SI或DI的内容之和。段基址表示同上。段隐含:EA=DS×16+BX+(SI或DI) EA=SS×16+BP+(SI或DI)段显式:EA=段寄存器×16+(BX或BP)+(SI或DI)(6)基址变址相对寻址

操作数在段内的偏移地址是基址寄存器BX或BP加上变址寄存器SI或DI内容再加上指令中给出的8位或16位偏移量,段基址表示同上。段隐含:EA=DS×16+BX+(SI或DI)+(8位或16位偏移量)

EA=SS×16+BP+(SI或DI)+(8位或16位偏移量)段显式:EA=段寄存器×16+(BX或BP)+(SI或DI)+(8位或16位偏移量)◆堆栈寻址

微机中普遍使用堆栈操作。

▲堆栈操作中一个操作数隐含在栈顶(出栈为源操作数、入栈为目标

操作数),由SP或ESP(堆栈指针)隐含指示;

▲段基址:由SS段寄存器索引找到,不用在指令中表明。

●对堆栈的访问实际上是隐含的寄存器间接寻址方式。◆指令寻址

对下条指令的寻址在代码段中进行。

▲顺序执行时由PC内容自动加1(硬件实现)完成,

▲段内转移时一般都用相对寻址方式,即PC内容加上一个相对值(由

当前下条指令到转移的目标指令间的字节距离);

▲段间转移则多采用直接寻址方式或间接寻址方式完成。3.2CISC基本指令集80x86微机属于CISC(复杂指令集计算机),8086/8088指令系统是CISC基本指令集,只能在实地址方式下执行单任务操作。8086/8088指令系统有基本指令133条,按功能可分为六大类——

数据传送指令、算术运算指令、位处理指令、程序控制指令、

串操作指令和处理机控制指令。3.2.1数据传送指令数据传送指令:分四类——

通用数据传送、累加器专用传送、地址传送和标志传送指令。数据传送指令都不影响标志寄存器FL的标志位,除了两条以标志寄存器为传送目标的指令(SAHF和POPF)外。1.通用数据传送指令通用数据传送指令包括MOV传送、交换指令和堆栈操作指令。(1)MOV传送指令

MOV指令的汇编语句格式及注释说明如下:MOVDst,Src

;Dst←Src,Dst和Src可为Reg、Mem,

Src还可为Im。MOV指令将源操作数送到目标操作数单元,而源操作数保持不变,源和目标操作数长度必须一致。

源和目标不能同为Mem,作为存储器操作数,Mem可以是所有寻址方式

MOVCL,AL ;8位寄存器传送,CL←ALMOVDS,AX;16位通用寄存器与段寄存器之间传送,DS←AXMOVCX,100;16位立即数0064H向通用寄存器传送,CX←64HMOVTAB[SI],AL;8位通用寄存器与存储器间数据传送[SI+TAB]←ALMOVDATA[BX][DI],CS;段寄存器向存储器16位数据传送,[BX+DI+DATA]←CS

(2)交换指令

交换指令是两个通用寄存器或通用寄存器与内存单元之间交换数据。

指令的汇编语句格式及注释说明如下:XCHGDst,Src;Dst←→Src,Dst和Src为Reg、Mem操作数XCHGAH,AL ;8位寄存器互相交换,AH←→ALXCHGDX,AX ;16位寄存器互相交换,DX←→AXXCHGBX,TAB[SI];寄存器与存储单元间16位数据交换,BX←→[SI+TAB](3)堆栈指令堆栈是后入先出队列LIFO(Last-In-First-OutQueue)。

堆栈操作有两种:压入PUSH(数据被填充到栈顶)和弹出POP(数据出栈顶)。

堆栈指针SP:基本指令集中堆栈每次操作都是16位数据,栈顶向下生成——

每次PUSH操作SP减2,每次POP操作SP加2,SP始终指向栈顶。堆栈指令语句格式及注释说明如下:

PUSHSrc ;SP←SP-2,[SP]←Src POPDst ;Dst←[SP],SP←SP+2PUSHAX;寄存器入栈,SP←SP-2,[SP]←AXPUSHES;段寄存器入栈,SP←SP-2,[SP]←ESPUSHBUFFER[BX];存储器操作数入栈,SP←SP-2,[SP]←[BX+BUFFER]POPCX;出栈到寄存器,CX←[SP],SP←SP+2POPDS;出栈到段寄存器,DS←[SP],SP←SP+2POPDATA[SI];出栈到存储器单元,[SI+DATA]←[SP],SP←SP+22.累加器专用传送指令

(1)输入/输出指令INAcc,n;Acc←[n],Acc为AX(16位输入,n为偶数)或AL(8位输入),n=0~255INAcc,DX;Acc←[DX],Acc同上,DX当前值为I/O端口地址OUTn,Acc;[n]←Acc,Acc与n同上,OUTDX,Acc;[DX]←Acc,Acc同上,DX当前值为I/O端口地址INAX,86H;从86H端口输入16位数,AX←[86H]INAL,DX;从DX所指向的端口输入8位数,AL←[DX]OUT61H,AL;向60H端口输出8位数,[61H[←ALOUTDX,AX;向DX所指向的端口输出16位数,[DX]←AX(2)查表指令查表指令XLAT用于根据AL的内容到字节表格中查找相应位置元素的代码。

◆XLAT指令执行前,必须将字节表格的首地址放入BX中,

AL中内容为索引值,即所查找元素在表格中的位置(与表首的字节距离)。

◆指令执行后将查到的元素代码放到AL中(AL原来的索引值被冲掉)。

该指令格式有两种,如下所示:XLAT ;或者

XLATOPR ;┇LEABX,DISPMOVAL,8XLATOUT60H,AL┇例:当前数据段中从DISP(=2000H)单元开始连续存放十六进制数码0~F的LED显示代码,编程将“8”字的显示代码送到60H端口(显示)。

3.有效地址和地址指针传送指令

(1)有效地址传送指令LEALEA指令把源操作数在段内的偏移地址送入指定的16位寄存器,而不是传送该地址单元内的操作数。

LEA指令格式及注释说明如下:

LEAReg,Mem

;R16←Mem存储器操作数的地址

(2)地址指针传送指令地址指针传送指令有两条:LDS和LES,它们都是把源操作数(所有寻址方式的存储器操作数)指定的4个相继字节单元内容作为一个地址指针送到指定的16位寄存器与段寄存器DS或ES中。

指令语句的格式及注释说明如下:

LDSReg,Mem

;Reg←[Mem],DS←[Mem+2] LESReg,Mem

;Reg←[Mem],ES←[Mem+2]4.标志传送指令

标志传送指令在标志寄存器FL与通用寄存器AH(8位)或堆栈(16位)之间传送数据,共4条:LAHF;AH←FL-l(低字节),保存SF、ZF、AF、PF、CF到AH中PUSH;SP←SP-2,[SP]←FL,标志寄存器FL入栈SAHF;FL-l(低字节)←AH,恢复保存在AH中的SF、ZF、AF、PF、CFPOPF;FL←[SP],SP←SP-2,恢复保存在堆栈中的所有标志位◆传送指令种类多,应用最频繁。◆传送指令汇编格式和语句操作、字节数、执行时间(时钟周期数)等

汇总于下表中。3.2.2算术运算指令

CISC基本指令集提供了加、减、乘、除四种基本算术运算,

运算操作数可以是8位或16位、可以是无符号数或有符号数,通过调整还可以进行十进制(BCD)数运算。

算术运算指令执行结果一般都影响标志寄存器FL的状态标志位。加减运算比较丰富。加减运算的操作数如下图所示,其中Mem为所有寻址方式的存储器操作数。1.加法运算加法指令有3条。指令语句格式及注释说明如下:ADDDst,Src

;Dst←Dst+Src,Dst为Reg、Mem,Src为Reg、Mem、Im

;Dst和Src不可同为MemADCDst,Src;Dst←Dst+Src+CF,Dst、Src同上INCDst

;Dst←Dst+1,Dst同上1.加法运算(续)两个32位加数98765432H和8901FA45H分别存放在数据段内2000H单元和2004H单元,编程将两数相加,结果从2100H单元开始存放。基本指令集没有32位加法指令,32位的加法程序段如下:

MOVAX,[2000H] ;AX=5432H,被加数低16位

MOVBX,[2002H] ;BX=9876H,被加数高16位

ADDAX,[2004H] ;低16位相加,AX=4E86H ADCBX,[2006H];高16位及低16位的进位相加,BX=2178HMOV[2100H],AX;存低16位的和4E86HMOV[2102H],BX ;存高16位的和2178HMOVAX,0ADCAX,0;获得最高位的进位MOV[2104H],AX;存和的最高位┆2.减法指令

减法运算指令有5条。指令语句格式及注释说明如下:

SUBDst,Src;Dst←Dst-Src,Dst和Src同ADD指令

SBBDst,Src;Dst←Dst-Src-CF,Dst和Src同上

CMPDst,Src;Dst-Src,不保存结果,仅影响状态标志,Dst和Src同上

DECDst ;Dst←Dst-1 NEGDst ;Dst←0-Dst(即Dst←+1比较指令CMP作两数相减运算而不存结果(被减数和减数都保持不变),但结果的特征影响FL寄存器的6个状态标志,据此比较两个数的大小,判断如下:■若ZF=1,表明相减结果为0,则两数相等。■若ZF=0,表明两数不等,须再判CF(无符号数)或SF和OF(有符号数)●无符号数判CF:CF=0说明无借位,则Dst>Src,否则Dst<Src●有符号数同时判OF(溢出标志)和SF(符号标志):同号Dst>Src,异号DST<Src对上述结论,请根据Dst和Src同号/异号、是否溢出等情况分析之。2.减法指令(续)32位的被减数和减数分别存放在FIRT和SECOND单元,求两数之差,结果放入THIRD开始的单元中。基本指令集没有32位减法指令,32位减法程序段

用如下六条指令实现之:

MOVAX,FIRST ;取被减数低16位到AX SUBAX,SECOND ;低16位相减

MOVTHIRD,AX ;存低16位差

MOVAX,FIRST+2 ;取被减数高16位到AX SBBAX,SECOND+2 ;高16位相减,并减去低16位的借位

MOVTHIRD+2,AX ;存高16位差如果FIRST和SECOND是符号相异的有符号数,相减可能产生溢出,如何编程?请参考上例改编之。

3.乘法指令

乘法指令分字节(8位)乘和字(16位)乘,要求:

被乘数事先放在AL或AX中,被乘数为隐含寻址;

乘数放在寄存器或存储器单元中,指令中只显式地表示乘数。

乘积为双字长,存放于AX(8位乘)或DXAX(16位乘)中。乘法指令有两条:无符号数乘和有符号数乘。指令语句格式及注释说明如下:MULSrc

;8位乘:AX←AL*Src,16位乘:DXAX←AX*Src

;Src为8位或16位通用寄存器或所有寻址方式的存储器操作数IMULSrc

;同上,但被乘数、乘数和双字长乘积都是有符号数与加减指令不同,乘法指令执行只确定地影响CF和OF状态:若乘积的高半部分为0(MUL指令)或者为低半部分符号位的扩展(IMUL指令)则CF和OF均为0,否则均为1;对其余状态位的影响不确定。已知AL=0FFH,[SI]=0FFH,(0FFH可视为无符号数255或有符号数-1)若执行指令

MUL[SI] ;则AX=0FE01H(即255*255=65025)若执行指令

IMUL[SI] ;则AX=0001H(即(-1)*(-1)=1)4.

除法指令

除法是乘法的逆运算,要求:

被除数为双字长,放在AX(8位除法)或DXAX(16位除法)中;

除数在指令中显式地指定,为8位或16位的寄存器或所有寻址方式的存储

器操作数;

商放在AL(8位除法)或AX(16位除法)中,

余数放入AH(8位除法)或DX(16位除法)中;

有符号除法的余数和被除数同号。除法指令有无符号数除法DIV和有符号数除法IDIV两条。

为了将被除数扩展为双字长,还有两条相应的符号扩展指令——

CBW(8位扩展为16位)和CWD(16位扩展为32位)。除法指令语句格式及注释说明如下:DIVSrc;8位除AX÷Src,AL←商,AH←余数;

;16位除DXAX÷Src,AX←商,DX←余数IDIVSrc;同上,但被除数、除数和商、余数都是有符号数,

;余数和被除数同号CBW ;AL的符号位扩展到AH中,不影响状态标志。CWD ;AX的符号位扩展到DX中,不影响状态标志。两条除法指令对FL的状态标志均无确定的影响。4.

除法指令(续)若被除数高半部分的绝对值大于除数,执行除法指令将产生溢出,引起0类中断。已知x、y、z均为16位有符号数,已分别装入X、Y、Z单元,编程计算:

(x*y+z-568)/x,商放入AX中,余数放入DX中。┆MOVAX,X ;AX←被乘数IMULY ;求x*yMOVCX,AX ;BXCX←32位乘积MOVBX,DXMOVAX,Z ;AX←加数zCWD ;将加数z扩展成32位ADDAX,CX ;32位相加ADCDX,BXSUBAX,568 ;减去16位立即数568SBBDX,0 ;高16位减去低16位的借位IDIVX ;双字长被除数除以16位除数x┆

5.十进制调整指令

DAA;加法十进制调整指令,将AL中的和调整成压缩型BCD数DAS ;减法十进制调整指令,将AL中的差调整成压缩型BCD数调整规则如下:

◆((AL∧0FH)>9)∨(AF=1),则AL←AL±6,AF←1◆(AL>9FH)∨(CF=1),则AL←AL±60H,CF←1已知AH和AL中有两个十进制数28和59(即BCD数28H和59H),

BH和BL中有两个十进制数85和37(即BCD数85H和37H),

分别做十进制加减运算如下:

ADDAL,AH ;AL=81H DAA ;AL=87H(28与59之和的BCD结果)

MOVAL,BH ;AL←85H SUBAL,BL ;AL=4EH DAS ;AL=48H(即85与37之差的BCD结果)上机内容:

1假定(AL)=48H,(BL)=59H,执行ADDAL,BLDAA后,运行结果是什么?

2如(BCD1)=34H,(BCD2)=89H,编程使(BCD3)=BCD1)+(BCD2),其中各变量为两位BCD数3如(BCD1)=1834H,(BCD2)=2789H,编程使(BCD3)=BCD1)+(BCD2),其中各变量为四位BCD数4如(BCD1)=1834H,(BCD2)=2789H,编程使(BCD3)=BCD1)-(BCD2),其中各变量为四位BCD数5已知各变量为两位BCD数,编程使U=V+(S-6)6已知各变量为四位BCD数,编程使U=V+(S-6)算术运算指令汇编格式和语句操作、指令字节数、执行时间(时钟周期数)及对状态标志位的影响等汇总于右表。3.2.3位操作指令

位操作包括逻辑运算、移位和循环移位。

位操作指令执行结果都将影响FL标志寄存器相应状态标志位,NOT除外。1.逻辑运算指令逻辑运算指令有五条:

与(AND)、或(OR)、非(NOT)、异或(XOR)和测试(TEST)ANDDst,Src;Dst←Dst∧Src,Dst为Reg、Mem,Src为Reg、Mem、Im

;Dst和Src不能同为MemOR Dst,Src ;Dst←Dst∨Src,Dst与Src同上NOTDst;Dst←0-Dst,Dst同上XORDst,Src;Dst←DstSrc,即Dst←DstSrc,Dst与Src同上TESTDst,Src;Dst∧Src,不存结果,只影响状态标志位,Dst与Src同上对一个位串,AND可以屏蔽(清0)某些位,OR可以置位(置1)某些位,

XOR可以取反某些位,XOR可以检查两个位串是否匹配。ANDAX,0 ;AX清0

ANDCL,0FH ;屏蔽CL的高4位

ORBH,00111100B ;将BH的中间4位置位

XORBL,0F0H ;将BL高4位变反XORDX,378H;DX中端口地址是378H吗?是则结果为0(使ZF=1)NOT指令执行不影响状态标志,其他逻辑指令执行后将重新设置SF、ZF、PF的

状态,而总使CF=0、OF=0,AF状态不确定。

2.移位指令

移位有逻辑移位和算术移位两种,每种又分左移和右移。

算术左移n位相当于×2n,右移n位相当于÷2n。

移位的对象可以是寄存器或所有寻址方式的存储器操作数,

移位的次数在指令中给出:1(只移位1次)或CL(CL中的数值即移位的次数)。逻辑左移和算术左移完全等价,因此移位指令实际上只有3条(但有4种格式)。例:将DX和AX中的低8位拼成一个16位数放在DX中,要求原DX中的低8位置于16位数中的高位。

MOVCL,8 SHLDX,CL ANDAX,0FFH ORDX,AX

3.循环移位指令

循环移位首尾相连移位(不丢失移位单元的位信息),

分带进位移位(CF在循环链之内)和不带进位移位(CF在循环链之外),同时又分左移和右移。移位的对象和次数同移位指令。3.循环移位指令AX中有16位数X,求X×3÷16,要求不损失任何有效位。

X×3÷16=X×(2+1)÷16=X÷8+X÷16,程序段如下:┆MOVBX,0SARAX,1 ;以下求X÷8,先求X÷2RCRBX,1 ;SARAX,1 ;求X÷4RCRBX,1 ;SARAX,1 ;AXBX←X÷8RCRBX,1 ;X中低3位移至BX高3位PUSHAX ;保存X÷8PUSHBXSARAX,1 ;求X÷16RCRBX,1POPDXADDBX,DXPOPDXADCAX,DX ;AXBX←AX×3÷16(高位在AX中,低位在BX中)┆

3.循环移位指令(续)位操作指令的汇编格式、语句操作、字节数、执行时间及对标志位的影响汇总于右表。3.2.4程序控制指令

程序控制指令能选择不同的程序段执行,可构成转移、循环、调用和返回,控制程序执行的流程。1.控制转移指令转移指令分无条件转移和条件转移两类,它们本身执行后都不影响FL寄存器的状态标志。(1)无条件转移指令无条件转移指令

JMP<TARGET>,控制程序转移到TARGET(目标)标号处去执行。

按TARGET目标地址单元的属性有四种转移范围、五种指令格式。JMPSHORT〈TARGET〉

;段内直接短转移JMPNEARPTR〈TARGET〉

;段内直接近转移JMPWORDPTR〈TARGET〉

;段内间接转移JMPFARPTR〈TARGET〉

;段间直接转移JMPDWORDPTR〈TARGET〉

;段间间接转移(1)无条件转移指令(续)段内转移只改变IP值,CS(代码段基址)不变。

◆段内直接转移为相对寻址,将IP指向的(下条)指令距目标TARGET

的偏移量(字节距离)与IP的当前值相加后送IP;

▲段内短转移的偏移量为8位、(以当前指令位置为准的)转移范围

为129~-126(若以IP当前值为准则为127~-128),

▲段内直接近转移的偏移量为16位、(以当前指令位置为准的)转移

范围为32769~-32766(若以IP当前值为准则为32767~-32768);

▲段内间接转移是绝对寻址,TARGET是一个16位的寄存器或存储器

单元,将其内容直接赋给IP。

◆段间转移跨段——

▲段间直接转移将指令中给出的TARGET偏移量和段基址赋给IP和CS,

▲段间间接转移将指令中给出的TARGET存储单元开始的4个字节分别

赋给IP和CS,从而实现跨段转移。(1)无条件转移指令(续)(2)条件转移指令

条件转移指令测试标志寄存器FL的当前状态标志,满足条件就转移到目

标地址去执行,否则顺序向下执行。

条件是对一个或两个或三个状态标志位的状态判断。(2)条件转移指令(续)所有条件转移指令的执行时间都是16T/4T(转移/不转移)。例:一个16位数的数组存储在以ARRAY为首地址的数据段中,长度为n(小于256)。编程求数组中正数、0及负数的个数,分别存放在BH、BL、DL中。 ┆

MOVCX,<n> ;数组长度送计数器CX MOVAX,0 MOVSI,AX ;数组指针初始化为0

MOVBX,AX ;结果寄存器清0

MOVDL,ALAGAIN:CMPAX,ARRAY[SI] ;比较

JGPLUS JZZERO INCDL ;是负数,负数个数寄存器加1

JMPNEXTZERO:NCBL ;是0,0个数寄存器加1

JMPNEXTPLUS:INCBH ;是正数,正数个数寄存器加1NEXT:ADDSI,2 ;指向下一个数组元素

DECCX JNZAGAIN ;未结束则继续

从80386开始,扩大了条件转移的范围,实模式下能够转移到代码段的任何位置。

2.循环指令

循环程序非常普遍,用条件指令可实现之;

为方便编程,基本指令集特意提供了4条循环指令。循环指令放在循环程序的开头或结尾,测试CX是否为0、以及ZF标志的状态,来控制循环结束与否。

循环指令长度都是2个字节,一个字节操作码加8位偏移量,循环转移范围为-128~127。循环指令执行不影响标志寄存器FL的状态标志。2.循环指令(续)

例:一字符串长度(<256)存放在ASCIISTR单元,ASCIISTR单元之后接着存放该字符串。

请编程判断该字符串中是否有“空格”字符:若有DL置1,否则DL清0。

MOVBX,0 ;地址指针初始化为0

MOVDL,BL ;预置没有“空格”标志

MOVAL,20H ;“空格”字符送AL MOVCX,ASCIISTR[BX] ;串长度送CX NEXT:INCBX CMPAL,ASCIISTR[BX] ;是空格吗?LOOPNZNEXT JNZDONE MOVDL,01H ;置有“空格”标志

DONE:……

;没有“空格”,继续运行

32位的80x86微处理器还可以使用32位的ECX作为隐含的循环计数器。

即便80486,循环指令也只能在短距离内作循环,即相对于当前循环指令的地址,转移的范围为129~-126。

3.子程序调用指令CALL和返回指令RET

子程序调用不同于转移指令,首先要把CALL指令的下一条指令地址(即返回地址)入栈保存,然后转向子程序的首地址去执行。

调用分段内调用和段间调用。段内调用只对IP操作,(CS不变),段间调用要同时对CS:IP操作。

段内/段间调用又分直接调用和间接调用。

调用和返回指令都没有条件判断,且都不影响标志寄存器FL的标志位。

4.中断指令INT和中断返回指令IRET

中断指令INT是种特殊的调用指令(调用例行中断子程序),是段间调用;与段间CALL指令相同的是:须先把CS:IP入栈保存,

不同的是:还要首先把标志寄存器FL入栈保存。

中断返回是段间返回,执行IRET指令,依次恢复IP、CS和FL。3.2.5串操作指令

串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。基本指令集处理的串长度不超过64K。

串操作常用于数据块的快速移动、比较、搜索和存取,执行一次操作串中一个元

素,配上重复前缀可按条件完成对整个串的操作。1.串操作的寻址与控制

(1)串操作均为隐含寻址,源串起始地址在DS:SI中,目标串起始地址在ES:DI中。

AL/AX为串扫描的关键字,或存串的源操作数、取串的目标操作数。(2)串操作时自动修改地址指针SI和DI。当标志寄存器FL的控制标志位DF=0时每完成

一次串元素操作SI和DI自动增量,当DF=1时SI和DI自动减量;如果串元素是字节,

SI和DI每次加1或减1;如果串元素是字,SI和DI每次加2或减2。(3)串长度在CX中,每完成一次串元素操作CX自动减1(不管串元素是字还是字节)。(4)源串和目标串在不同的段内,分别由DS和ES指明。若DS和ES相等则两串在相同物

理段中。(5)串比较和串扫描都是作减法操作,所以每次串操作都影响对标志寄存器FL的6个状

态标志,而串传送、存串和取串都是作传送操作,所以都不影响FL的状态标志位。(6)加重复前缀则串操作指令重复执行。

串指令在重复执行过程中SI、DI和CX自动修改,但指令指针IP保持指向重复前缀的

存储地址。因此串操作可以被中断,中断返回后可继续原来的串操作。(7)串操作指令本身都是单字节指令,加上重复前缀共2个字节,可对串中元素按条件

重复操作。2.重复前缀

重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。

重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使

串操作指令重复或条件重复执行,相当于运行一个循环程序;

取串指令LODS一般不加重复前缀,因为重复取出串中的元素送到累加

器Acc无意义(后面取出的数冲掉前面取出的数)。3.2.6处理器控制指令

处理器控制指令执行对标志位(CF、DF、IF)的置位/复位操作和其它控制操作。处理器控制指令的汇编格式、语句操作、目标代码、执行时间等汇总于下表中。3.3扩展指令集

3.3.1一般扩展指令集32位80x86微机存储器寻址空间大大扩展(达4GB或64GB),操作数宽度也扩展至32位,指令功能进一步丰富,因此指令长度也有所扩展,达

1~12个字节:

1~2个字节操作码字段,

0~2个字节寻址方式码字段,

0、1、2、4个字节的偏移量字段,

0、1、2、4个字节的立即数字段,

不超过4个字节的前缀码段。80x86指令集在基本集基础上扩展而来,依次是286(16位处理器)、386、486指令集,在代码级保持向上兼容。

扩展主要表现在32位寻址和32位操作,

还体现在指令种类增多、功能增强,如浮点数运算指令、操作系统型指令,指令操作数也扩展到3个等等。

80x86常用扩展指令(续)

80x86常用扩展指令(续)

3.3.2多媒体SIMD指令集

SIMD(SingleInstructionMultipleData:单指令多数据)一条指令能处理多个数据,使操作的并行性进一步增强,提高了计算机的多媒体处理能力。SIMD指令集是开放的:包括MMX、3DNOW!、SSE和SSE2等。1.MMX指令集游戏、音乐合成、语音压缩/解压、图像图形处理、MPEG视频等应用程序具有一些共同特征:★

短整数数据类型(像素:8/16位,音频:16位)★

频繁的乘与累加,高度重复的小循环体★

巨大计算量的算法★

高度并行操作MMX技术借用现成的浮点堆栈生成8个64位MMX寄存器,MMX寄存器支持四种新型数据类型:紧缩字节(8个字节)、紧缩字(4个字)、紧缩双字(2个双字)和四字,可将它们移入MMX寄存器同时完成对多个数据的算术运算和逻辑运算,特别适合整数运算密集的图像处理、视频和音频回放等多媒体应用,提高其性能。1.MMX指令集MMX指令有57条,包括——

◆算术运算(加、减、乘、除、算术移位和累加)、◆比较、逻辑操作(与、与非、或、异或)、

◆转换操作(把数据紧缩和拆放)、

◆移位操作、

◆移数(在MMX寄存器之间、MMX寄存器与存储单元之间移入/移出)。1.MMX指令集(续)音像多媒体数据流算法中常用到矢量点积、矩阵乘、FIR/IIR滤波、FFT/DCT变换等,指令PMADDWD(紧缩字相乘并相加)就可方便快速地完成这类运算。PMADDWD:16位×16位→32位(积)再累加

a3a2a1a0

×b3×b2×b1×b0 a3×b3+a2×b2a1×b1+a0×b0该指令将两组4个16位数对应相乘,得到4个32位乘积,再将高两个乘积相加存入一个MMX寄存器的高32位(D63~D32),将低两个乘积相加存入同一MMX寄存器的低32位(D31~D0)。一条PMADDWD指令可同时处理4个乘法和2个加法。多数MMX指令可在一个时钟周期内完成。经测试,同样的Pentium芯片,采用MMX技术运行MMX应用程序,比不采用MMX技术的运行速度提高40%以上。

2.3Dnow!指令集

3DNOW!将原先的64位MMX寄存器加以延伸,改进成8组3D运算寄存器(充分

温馨提示

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

评论

0/150

提交评论