1、第3章 8086微机机器语言指令 n教学目标教学目标:掌握数据操作数的寻址方式;掌握数据传送指令、加减运算指令、位操作指令的功能与用法;了解其它指令的作用。n教学重点教学重点:常用指令的功能与用法。n教学难点教学难点:指令的应用。3.1.1 指令格式 n一条指令是一个有意义的二进制代码序列,它是机器语言的一个语句,其基本格式为:操作码字段操作码字段操作码字段OP OP OP 地址码字段地址码字段地址码字段A A A 操作码表明了指令的功能及操作,地址码又称操作数字段,指明了参与操作运算的操作数地址。n1.指令操作码指令操作码n指令系统中每条指令都有唯一确定的操作码。操作码的位数越多,所能表达的
2、操作种类就越多。n(1)规整型规整型n操作码字段的长度和位置固定,又称定长编码,编码最简单。定长编码多用在大中型计算机上,如IBM 370机指令操作码都为8bit(位)。RISC指令集采用定长编码。定长编码有利于简化硬件设计、减少指令译码时间;但往往造成资源浪费(冗余)。n(2)非规整型非规整型n非规整型操作码的长度不定,且分散在指令字的不同位置上,因此又称变长编码。变长编码广泛用在小型、微型计算机上,如PDP小型机。CISC指令集是非规整型编码。1.指令操作码(续)指令操作码(续)n扩展操作码法:灵活充分利用指令的各个字段,在不增加指令长度的情况下,扩展操作码能表示更多的指令。80 x86微
3、处理器采用扩展操作码法。n变长编码增加指令译码的难度,控制器的设计较复杂。n2.指令地址码指令地址码n每条指令必须包括CPU执行所需的全部信息。对双操作数指令,除了操作码OP(Operate)外,还必须包含:第一源操作数地址A1(Address1)、第二源操作数地址A2、操作结果的存放地址A3,以及下条指令在内存中的存放地址A4。n程序计数器PC(Program counter)来指向要执行指令的地址,n现代计算机地址码字段有四种结构:三地址、双地址、单地址和零地址。n三地址指令格式:OP A1 A2 A3OP A1 A2 A3OP A1 A2 A3;操作为:A1 OP A2 A3,PC+1P
4、C(隐含)三地址指令在小型、微型计算机中很少使用。n双地址指令格式:OP A1 A2 ;操作为:A1 OP A2 A1,PC+1PC(隐含)执行前,A1和A2中各存放一个源操作数,执行后结果存放到A1中,A1中原先的源操作数被冲掉。因此A2称源操作数,A1称目标操作数(又称目的操作数)。3.1.2 基本寻址方式基本寻址方式n1.寄存器寻址寄存器寻址n操作数就存放在CPU通用寄存器中,存取操作数无需访问内存,指令执行速度快。n8086/8088CPU有8个通用寄存器,指令中只用3bit即可表示,如下表所示。n2.I/O端口寻址端口寻址n(1)直接寻址直接寻址n指令中用8位无符号数直接表示I/O端
5、口地址号。如:IN AL,n ;输入:ALn,n在0255之间,表示端口号 n(2)间接寻址间接寻址nDX指向I/O端口,即用DX内容(16位无符号数)表示I/O端口地址编号,范围在065535之间。如:OUT DX,AL ;输出:DXAL 3.存储器寻址 n(1)立即寻址立即寻址n指令地址码字段就是操作数本身。立即数只能作为源操作数。n(2)直接寻址直接寻址n指令地址码字段直接给出操作数在段内的偏移量,段基址隐含给出或由段前缀指明。指令语句中,直接地址(一般为16位无符号数)用方括号括起来。n段隐含:EADS16 偏移地址n段显式:EA段寄存器16 偏移地址(3)寄存器间接寻址寄存器间接寻址
6、n操作数在段内的地址在基址寄存器BX、BP或变址寄存器SI、DI中,根据寄存器的内容(段内的偏移地址值)到存储器中寻找操作数;段基址可用段前缀显式表示,更多的是隐含表示。n段隐含:EADS16(BX或SI或DI)n EASS16BPn段显式:EA段寄存器16(BX或BP或SI或DI)n(4)寄存器相对寻址寄存器相对寻址n操作数在段内的偏移地址为基址/变址寄存器内容加上指令中给出的8位或16位偏移量。段基址表示同(3)。n段隐含:EADS16(BX或SI或DI)(8位或16位偏移量)n EASS16BP(8位或16位偏移量)n段显式:EA段寄存器16(BX或BP或SI或DI)(8位或16位偏移量
7、)n(5)基址变址寻址基址变址寻址n操作数在段内的偏移地址是基址寄存器BX或BP与变址寄存器SI或DI的内容之和。段基址表示同上。n段隐含:EADS16BX(SI或DI)n EASS16BP(SI或DI)n段显式:EA段寄存器16(BX或BP)(SI或DI)(6)基址变址相对寻址基址变址相对寻址 n操作数在段内的偏移地址是基址寄存器BX或BP加上变址寄存器SI或DI内容再加上指令中给出的8位或16位偏移量,段基址表示同上。n段隐含:EADS16BX(SI或DI)(8位或16位偏移量)n EASS16BP(SI或DI)(8位或16位偏移量)n段显式:EA段寄存器16(BX或BP)(SI或DI)(
8、8位或16位偏移量)堆栈寻址堆栈寻址 微机中普遍使用堆栈操作。堆栈操作中一个操作数隐含在栈顶(出栈为源操作数、入栈为目标 操作数),由SP或ESP(堆栈指针)隐含指示;段基址:由SS段寄存器索引找到,不用在指令中表明。对堆栈的访问实际上是隐含的寄存器间接寻址方式。指令寻址指令寻址 对下条指令的寻址在代码段中进行。顺序执行时由PC内容自动加1(硬件实现)完成,段内转移时一般都用相对寻址方式,即PC内容加上一个相对值(由 当前下条指令到转移的目标指令间的字节距离);段间转移则多采用直接寻址方式或间接寻址方式完成。3.2 CISC基本指令集基本指令集n80 x86微机属于CISC(复杂指令集计算机)
9、,8086/8088指令系统是CISC基本指令集,只能在实地址方式下执行单任务操作。n8086/8088指令系统有基本指令133条,按功能可分为六大类 数据传送指令、算术运算指令、位处理指令、程序控制指令、串操作指令和处理机控制指令。n3.2.1 数据传送指令数据传送指令n数据传送指令:分四类 通用数据传送、累加器专用传送、地址传送和标志传送指令。n数据传送指令都不影响标志寄存器FL的标志位,除了两条以标志寄存器为传送目标的指令(SAHF和POPF)外。n1.通用数据传送指令通用数据传送指令n通用数据传送指令包括MOV传送、交换指令和堆栈操作指令。(1)MOV传送指令传送指令nMOV指令的汇编
10、语句格式及注释说明如下:nMOV Dst,Src ;DstSrc,Dst和Src可为Reg、Mem,Src还可为Im。nMOV指令将源操作数送到目标操作数单元,而源操作数保持不变,源和目标操作数长度必须一致。源和目标不能同为Mem,作为存储器操作数,Mem可以是所有寻址方式 nMOV CL,AL ;8位寄存器传送,CLALnMOV DS,AX ;16位通用寄存器与段寄存器之间传送,DSAXnMOV CX,100 ;16位立即数0064H向通用寄存器传送,CX64HnMOV TABSI,AL ;8位通用寄存器与存储器间数据传送SI+TABALnMOV DATABXDI,CS ;段寄存器向存储器1
11、6位数据传送,BX+DI+DATACS (2)交换指令交换指令 n交换指令是两个通用寄存器或通用寄存器与内存单元之间交换数据。指令的汇编语句格式及注释说明如下:nXCHG Dst,Src ;DstSrc,Dst和Src为Reg、Mem操作数nXCHG AH,AL ;8位寄存器互相交换,AHALnXCHG DX,AX ;16位寄存器互相交换,DXAXnXCHG BX,TABSI ;寄存器与存储单元间16位数据交换,BXSI+TABn(3)堆栈指令堆栈指令n堆栈是后入先出队列LIFO(Last-In-First-Out Queue)。堆栈操作有两种:压入PUSH(数据被填充到栈顶)和弹出POP(数
12、据出栈顶)。堆栈指针SP:基本指令集中堆栈每次操作都是16位数据,栈顶向下生成 每次PUSH操作SP减2,每次POP操作SP加2,SP始终指向栈顶。n堆栈指令语句格式及注释说明如下:nPUSH Src ;SPSP-2,SPSrcnPOP Dst ;DstSP,SPSP+2n PUSH AX ;寄存器入栈,SPSP-2,SPAXn PUSH ES ;段寄存器入栈,SPSP-2,SPESn PUSH BUFFERBX ;存储器操作数入栈,SPSP-2,SPBX+BUFFERn POP CX ;出栈到寄存器,CXSP,SPSP+2n POP DS ;出栈到段寄存器,DSSP,SPSP+2n POP
13、DATASI ;出栈到存储器单元,SI+DATASP,SPSP+2 2.累加器专用传送指令 n(1)输入输入/输出指令输出指令nIN Acc,n ;Accn,Acc为AX(16位输入,n为偶数)或AL(8位输入),n=0255nIN Acc,DX ;AccDX,Acc同上,DX当前值为I/O端口地址nOUT n,Acc ;nAcc,Acc与n同上,nOUT DX,Acc ;DXAcc,Acc同上,DX当前值为I/O端口地址nIN AX,86H ;从86H端口输入16位数,AX86HnIN AL,DX ;从DX所指向的端口输入8位数,ALDXnOUT 61H,AL ;向60H端口输出8位数,61
14、HALnOUT DX,AX ;向DX所指向的端口输出16位数,DXAXn(2)查表指令查表指令n查表指令XLAT用于根据AL的内容到字节表格中查找相应位置元素的代码。XLAT指令执行前,必须将字节表格的首地址放入BX中,AL中内容为索引值,即所查找元素在表格中的位置(与表首的字节距离)。指令执行后将查到的元素代码放到AL中(AL原来的索引值被冲掉)。该指令格式有两种,如下所示:XLAT;或者 XLAT OPR;LEA BX,DISPMOV AL,8XLATOUT 60H,AL 例:当前数据段中从DISP(=2000H)单元开始连续存放十六进制数码0F的LED显示代码,编程将“8”字的显示代码送
15、到60H端口(显示)。3.有效地址和地址指针传送指令 n(1)有效地址传送指令有效地址传送指令LEAnLEA指令把源操作数在段内的偏移地址送入指定的16位寄存器,而不是传送该地址单元内的操作数。LEA指令格式及注释说明如下:nLEA Reg,Mem;R16Mem存储器操作数的地址(2)地址指针传送指令地址指针传送指令n地址指针传送指令有两条:LDS和LES,它们都是把源操作数(所有寻址方式的存储器操作数)指定的4个相继字节单元内容作为一个地址指针送到指定的16位寄存器与段寄存器DS或ES中。指令语句的格式及注释说明如下:nLDS Reg,Mem;RegMem,DSMem+2nLES Reg,M
16、em;RegMem,ESMem+24.标志传送指令 n标志传送指令在标志寄存器FL与通用寄存器AH(8位)或堆栈(16位)之间传送数据,共4条:n LAHF ;AHFL-l(低字节),保存SF、ZF、AF、PF、CF到AH中n PUSH ;SPSP-2,SPFL,标志寄存器FL入栈n SAHF ;FL-l(低字节)AH,恢复保存在AH中的SF、ZF、AF、PF、CFn POPF ;FLSP,SPSP-2,恢复保存在堆栈中的所有标志位传送指令种类多,应用最频繁。传送指令汇编格式和语句操作、字节数、执行时间(时钟周期数)等 汇总于下表中。3.2.2 算术运算指令 nCISC基本指令集提供了加、减、
17、乘、除四种基本算术运算,运算操作数可以是8位或16位、可以是无符号数或有符号数,通过调整还可以进行十进制(BCD)数运算。算术运算指令执行结果一般都影响标志寄存器FL的状态标志位。n加减运算比较丰富。加减运算的操作数如下图所示,其中Mem为所有寻址方式的存储器操作数。n1.加法运算加法运算n加法指令有3条。指令语句格式及注释说明如下:nADD Dst,Src;DstDst+Src,Dst为Reg、Mem,Src为Reg、Mem、Im;Dst和Src不可同为MemnADC Dst,Src ;DstDst+Src+CF,Dst、Src同上nINC Dst;DstDst+1,Dst同上1.加法运算(
18、续)加法运算(续)n两个32位加数98765432H和8901FA45H分别存放在数据段内2000H单元和2004H单元,编程将两数相加,结果从2100H单元开始存放。n基本指令集没有32位加法指令,32位的加法程序段如下:n nMOV AX,2000H ;AX=5432H,被加数低16位nMOV BX,2002H ;BX=9876H,被加数高16位nADD AX,2004H ;低16位相加,AX=4E86HnADC BX,2006H ;高16位及低16位的进位相加,BX=2178Hn MOV 2100H,AX ;存低16位的和4E86Hn MOV 2102H,BX ;存高16位的和2178H
19、n MOV AX,0n ADC AX,0 ;获得最高位的进位n MOV 2104H,AX ;存和的最高位n 2.减法指令 n减法运算指令有5条。指令语句格式及注释说明如下:nSUB Dst,Src ;DstDst-Src,Dst和Src同ADD指令nSBB Dst,Src ;DstDst-Src-CF,Dst和Src同上nCMP Dst,Src ;Dst-Src,不保存结果,仅影响状态标志,Dst和Src同上nDEC Dst ;DstDst-1nNEG Dst ;Dst0-Dst(即Dst+1n比较指令CMP作两数相减运算而不存结果(被减数和减数都保持不变),但结果的特征影响FL寄存器的6个状
20、态标志,据此比较两个数的大小,判断如下:n若ZF=1,表明相减结果为0,则两数相等。n若ZF=0,表明两数不等,须再判CF(无符号数)或SF和OF(有符号数)n无符号数判CF:CF=0说明无借位,则DstSrc,否则DstSrcn有符号数同时判OF(溢出标志)和SF(符号标志):同号DstSrc,异号DSTSrcn对上述结论,请根据Dst和Src同号/异号、是否溢出等情况分析之。2.减法指令(续)n32位的被减数和减数分别存放在FIRT和SECOND单元,求两数之差,结果放入THIRD开始的单元中。n基本指令集没有32位减法指令,32位减法程序段 用如下六条指令实现之:nMOV AX,FIRS
21、T;取被减数低16位到AXnSUB AX,SECOND;低16位相减nMOV THIRD,AX;存低16位差nMOV AX,FIRST+2;取被减数高16位到AXnSBB AX,SECOND+2;高16位相减,并减去低16位的借位nMOV THIRD+2,AX;存高16位差n如果FIRST和SECOND是符号相异的有符号数,相减可能产生溢出,如何编程?请参考上例改编之。3.乘法指令 n乘法指令分字节(8位)乘和字(16位)乘,要求:被乘数事先放在AL或AX中,被乘数为隐含寻址;乘数放在寄存器或存储器单元中,指令中只显式地表示乘数。乘积为双字长,存放于AX(8位乘)或DXAX(16位乘)中。n乘
22、法指令有两条:无符号数乘和有符号数乘。n指令语句格式及注释说明如下:nMUL Src ;8位乘:AXAL*Src,16位乘:DXAXAX*Src ;Src为8位或16位通用寄存器或所有寻址方式的存储器操作数nIMUL Src ;同上,但被乘数、乘数和双字长乘积都是有符号数n与加减指令不同,乘法指令执行只确定地影响CF和OF状态:若乘积的高半部分为0(MUL指令)或者为低半部分符号位的扩展(IMUL指令)则CF和OF均为0,否则均为1;对其余状态位的影响不确定。n已知AL=0FFH,SI=0FFH,(0FFH可视为无符号数255或有符号数-1)n若执行指令 MUL SI;则AX=0FE01H(即
23、255*255=65025)n若执行指令 IMUL SI;则AX=0001H(即(-1)*(-1)=1)4 除法指令 n除法是乘法的逆运算,要求:被除数为双字长,放在AX(8位除法)或DXAX(16位除法)中;除数在指令中显式地指定,为8位或16位的寄存器或所有寻址方式的存储 器操作数;商放在AL(8位除法)或AX(16位除法)中,余数放入AH(8位除法)或DX(16位除法)中;有符号除法的余数和被除数同号。n除法指令有无符号数除法DIV和有符号数除法IDIV两条。为了将被除数扩展为双字长,还有两条相应的符号扩展指令CBW(8位扩展为16位)和CWD(16位扩展为32位)。n除法指令语句格式及
24、注释说明如下:nDIV Src ;8位除 AXSrc,AL商,AH余数;16位除 DXAXSrc,AX商,DX余数nIDIV Src ;同上,但被除数、除数和商、余数都是有符号数,;余数和被除数同号nCBW ;AL的符号位扩展到AH中,不影响状态标志。nCWD ;AX的符号位扩展到DX中,不影响状态标志。n两条除法指令对FL的状态标志均无确定的影响。4 除法指令(续)n若被除数高半部分的绝对值大于除数,执行除法指令将产生溢出,引起0类中断。n已知x、y、z均为16位有符号数,已分别装入X、Y、Z单元,编程计算:(x*y+z-568)/x,商放入AX中,余数放入DX中。n nMOV AX,X;A
25、X被乘数nIMUL Y;求x*ynMOV CX,AX;BXCX32位乘积nMOV BX,DXnMOV AX,Z;AX加数znCWD;将加数z扩展成32位nADD AX,CX;32位相加nADC DX,BXnSUB AX,568;减去16位立即数568nSBB DX,0;高16位减去低16位的借位nIDIV X;双字长被除数除以16位除数xn 5.十进制调整指令 nDAA ;加法十进制调整指令,将AL中的和调整成压缩型BCD数nDAS ;减法十进制调整指令,将AL中的差调整成压缩型BCD数n调整规则如下:(AL0FH)9)(AF=1),则ALAL6,AF1 (AL9FH)(CF=1),则ALAL
26、60H,CF1n已知AH和AL中有两个十进制数28和59(即BCD数28H和59H),BH和BL中有两个十进制数85和37(即BCD数85H和37H),分别做十进制加减运算如下:nADD AL,AH;AL=81HnDAA;AL=87H(28与59之和的BCD结果)nMOV AL,BH;AL85HnSUB AL,BL;AL=4EHnDAS;AL=48H(即85与37之差的BCD结果)上机内容:n1 假定(AL)=48H,(BL)=59H,执行ADD AL,BL DAA 后,运行结果是什么?n2 如(BCD1)=34H,(BCD2)=89H,编程使(BCD3)=BCD1)+(BCD2),其中各变量
27、为两位BCD数n3 如(BCD1)=1834H,(BCD2)=2789H,编程使(BCD3)=BCD1)+(BCD2),其中各变量为四位BCD数n4 如(BCD1)=1834H,(BCD2)=2789H,编程使(BCD3)=BCD1)-(BCD2),其中各变量为四位BCD数n5 已知各变量为两位BCD数,编程使U=V+(S-6)n6 已知各变量为四位BCD数,编程使U=V+(S-6)算 术 运算 指 令汇 编 格式 和 语句操作、指 令 字节 数、执 行 时间(时钟 周 期数)及对 状 态标 志 位的 影 响等 汇 总于右表。3.2.3 位操作指令 n位操作包括逻辑运算、移位和循环移位。位操作
28、指令执行结果都将影响FL标志寄存器相应状态标志位,NOT除外。n1.逻辑运算指令逻辑运算指令n逻辑运算指令有五条:与(AND)、或(OR)、非(NOT)、异或(XOR)和测试(TEST)nAND Dst,Src ;DstDstSrc,Dst为Reg、Mem,Src为Reg、Mem、Im ;Dst和Src不能同为MemnOR Dst,Src ;DstDstSrc,Dst与Src同上nNOT Dst ;Dst0-Dst,Dst同上nXOR Dst,Src ;DstDst Src,即DstDstSrc,Dst与Src同上nTEST Dst,Src ;DstSrc,不存结果,只影响状态标志位,Dst与
29、Src同上n对一个位串,AND可以屏蔽(清0)某些位,OR可以置位(置1)某些位,XOR可以取反某些位,XOR可以检查两个位串是否匹配。AND AX,0;AX清0nAND CL,0FH;屏蔽CL的高4位nOR BH,00111100B;将BH的中间4位置位nXOR BL,0F0H;将BL高4位变反n XOR DX,378H ;DX中端口地址是378H吗?是则结果为0(使ZF=1)nNOT指令执行不影响状态标志,其他逻辑指令执行后将重新设置SF、ZF、PF的 状态,而总使CF=0、OF=0,AF状态不确定。2.移位指令 n移位有逻辑移位和算术移位两种,每种又分左移和右移。算术左移n位相当于2n,
30、右移n位相当于2n。移位的对象可以是寄存器或所有寻址方式的存储器操作数,移位的次数在指令中给出:1(只移位1次)或CL(CL中的数值即移位的次数)。n逻辑左移和算术左移完全等价,因此移位指令实际上只有3条(但有4种格式)。n例:将DX和AX中的低8位拼成一个16位数放在DX中,要求原DX中的低8位置于16位数中的高位。nMOV CL,8nSHL DX,CLnAND AX,0FFHnOR DX,AX 3.循环移位指令 n循环移位首尾相连移位(不丢失移位单元的位信息),分带进位移位(CF在循环链之内)和不带进位移位(CF在循环链之外),同时又分左移和右移。移位的对象和次数同移位指令。3.循环移位指
31、令nAX中有16位数X,求X316,要求不损失任何有效位。X316X(21)16X8X16,程序段如下:nMOV BX,0nSAR AX,1;以下求X8,先求X2nRCR BX,1;nSAR AX,1;求X4nRCR BX,1;nSAR AX,1;AXBXX8 nRCR BX,1;X中低3位移至BX高3位nPUSH AX;保存X8nPUSH BXnSAR AX,1;求X16nRCR BX,1nPOP DXnADD BX,DXnPOP DXnADC AX,DX;AXBXAX316(高位在AX中,低位在BX中)n 3.循环移位指令(续)位 操 作指 令 的汇 编 格式、语句操作、字节数、执 行 时
32、间 及 对标 志 位的 影 响汇 总 于右表。3.2.4 程序控制指令 n程序控制指令能选择不同的程序段执行,可构成转移、循环、调用和返回,控制程序执行的流程。n1.控制转移指令控制转移指令n转移指令分无条件转移和条件转移两类,它们本身执行后都不影响FL寄存器的状态标志。n(1)无条件转移指令无条件转移指令n无条件转移指令 JMP ,控制程序转移到TARGET(目标)标号处去执行。按TARGET目标地址单元的属性有四种转移范围、五种指令格式。nJMP SHORT TARGET;段内直接短转移nJMP NEAR PTR TARGET;段内直接近转移nJMP WORD PTR TARGET;段内间
33、接转移nJMP FAR PTR TARGET;段间直接转移nJMP DWORD PTR TARGET;段间间接转移(1)无条件转移指令(续)无条件转移指令(续)n段内转移只改变IP值,CS(代码段基址)不变。段内直接转移为相对寻址,将IP指向的(下条)指令距目标TARGET 的偏移量(字节距离)与IP的当前值相加后送IP;段内短转移的偏移量为8位、(以当前指令位置为准的)转移范围 为129-126(若以IP当前值为准则为127-128),段内直接近转移的偏移量为16位、(以当前指令位置为准的)转移 范围为32769-32766(若以IP当前值为准则为32767-32768);段内间接转移是绝对
34、寻址,TARGET是一个16位的寄存器或存储器 单元,将其内容直接赋给IP。段间转移跨段 段间直接转移将指令中给出的TARGET偏移量和段基址赋给IP和CS,段间间接转移将指令中给出的TARGET存储单元开始的4个字节分别 赋给IP和CS,从而实现跨段转移。(1)无条件转移指令(续)无条件转移指令(续)(2)条件转移指令 n条件转移指令测试标志寄存器FL的当前状态标志,满足条件就转移到目 标地址去执行,否则顺序向下执行。条件是对一个或两个或三个状态标志位的状态判断。(2)条件转移指令(续)n所有条件转移指令的执行时间都是16T/4T(转移/不转移)。n例:一个16位数的数组存储在以ARRAY为
35、首地址的数据段中,长度为n(小于256)。编程求数组中正数、0及负数的个数,分别存放在BH、BL、DL中。n n MOV CX,;数组长度送计数器CXn MOV AX,0n MOV SI,AX;数组指针初始化为0n MOV BX,AX;结果寄存器清0n MOV DL,ALn AGAIN:CMP AX,ARRAYSI;比较n JG PLUSn JZ ZEROn INC DL;是负数,负数个数寄存器加1n JMP NEXTn ZERO:NC BL;是0,0个数寄存器加1n JMP NEXTn PLUS:INC BH;是正数,正数个数寄存器加1n NEXT:ADD SI,2;指向下一个数组元素n D
36、EC CXn JNZ AGAIN;未结束则继续n n从80386开始,扩大了条件转移的范围,实模式下能够转移到代码段的任何位置。2.循环指令 n循环程序非常普遍,用条件指令可实现之;为方便编程,基本指令集特意提供了4条循环指令。n循环指令放在循环程序的开头或结尾,测试CX是否为0、以及ZF标志的状态,来控制循环结束与否。循环指令长度都是2个字节,一个字节操作码加8位偏移量,循环转移范围为-128127。循环指令执行不影响标志寄存器FL的状态标志。2.循环指令(续)n例:一字符串长度(256)存放在ASCIISTR单元,ASCIISTR单元之后接着存放该字符串。请编程判断该字符串中是否有“空格”
37、字符:若有DL置1,否则DL清0。nMOV BX,0;地址指针初始化为0nMOV DL,BL;预置没有“空格”标志nMOV AL,20H;“空格”字符送ALn MOV CX,ASCIISTRBX;串长度送CXn NEXT:INC BXnCMP AL,ASCIISTRBX;是空格吗?n LOOPNZ NEXTnJNZ DONEnMOV DL,01H;置有“空格”标志nDONE:;没有“空格”,继续运行 n32位的80 x86微处理器还可以使用32位的ECX作为隐含的循环计数器。即便80486,循环指令也只能在短距离内作循环,即相对于当前循环指令的地址,转移的范围为129-126。3.子程序调用指
38、令CALL和返回指令RET n子程序调用不同于转移指令,首先要把CALL指令的下一条指令地址(即返回地址)入栈保存,然后转向子程序的首地址去执行。调用分段内调用和段间调用。段内调用只对IP操作,(CS不变),段间调用要同时对CS:IP操作。段内/段间调用又分直接调用和间接调用。调用和返回指令都没有条件判断,且都不影响标志寄存器FL的标志位。4.中断指令INT和中断返回指令IRET n中断指令INT是种特殊的调用指令(调用例行中断子程序),是段间调用;与段间CALL指令相同的是:须先把CS:IP入栈保存,不同的是:还要首先把标志寄存器FL入栈保存。中断返回是段间返回,执行IRET指令,依次恢复I
39、P、CS和FL。3.2.5 串操作指令 n串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。基本指令集处理的串长度不超过64K。串操作常用于数据块的快速移动、比较、搜索和存取,执行一次操作串中一个元 素,配上重复前缀可按条件完成对整个串的操作。1.串操作的寻址与控制 n(1)串操作均为隐含寻址,源串起始地址在DS:SI中,目标串起始地址在ES:DI中。AL/AX为串扫描的关键字,或存串的源操作数、取串的目标操作数。n(2)串操作时自动修改地址指针SI和DI。当标志寄存器FL的控制标志位DF=0时每完成 一次串元素操作SI和DI自动增量,当DF=1时SI和DI自动减量;如果串元素是字节
40、,SI和DI每次加1或减1;如果串元素是字,SI和DI每次加2或减2。n(3)串长度在CX中,每完成一次串元素操作CX自动减1(不管串元素是字还是字节)。n(4)源串和目标串在不同的段内,分别由DS和ES指明。若DS和ES相等则两串在相同物 理段中。n(5)串比较和串扫描都是作减法操作,所以每次串操作都影响对标志寄存器FL的6个状 态标志,而串传送、存串和取串都是作传送操作,所以都不影响FL的状态标志位。n(6)加重复前缀则串操作指令重复执行。串指令在重复执行过程中SI、DI和CX自动修改,但指令指针IP保持指向重复前缀的 存储地址。因此串操作可以被中断,中断返回后可继续原来的串操作。n(7)
41、串操作指令本身都是单字节指令,加上重复前缀共2个字节,可对串中元素按条件 重复操作。2.重复前缀 n重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。n重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使 串操作指令重复或条件重复执行,相当于运行一个循环程序;取串指令LODS一般不加重复前缀,因为重复取出串中的元素送到累加 器Acc无意义(后面取出的数冲掉前面取出的数)。3.2.6 处理器控制指令 n处理器控制指令执行对标志位(CF、DF、IF)的置位/复位操作和其它控制操作。n处理器控制指令的汇编格式、语句操作、目标代码、执行时间等汇总于下表中。3.3 扩展指令集
42、n3.3.1 一般扩展指令集一般扩展指令集n32位80 x86微机存储器寻址空间大大扩展(达4GB或64GB),操作数宽度也扩展至32位,指令功能进一步丰富,因此指令长度也有所扩展,达112个字节:12个字节操作码字段,02个字节寻址方式码字段,0、1、2、4个字节的偏移量字段,0、1、2、4个字节的立即数字段,不超过4个字节的前缀码段。n80 x86指令集在基本集基础上扩展而来,依次是286(16位处理器)、386、486指令集,在代码级保持向上兼容。扩展主要表现在32位寻址和32位操作,还体现在指令种类增多、功能增强,如浮点数运算指令、操作系统型指令,指令操作数也扩展到3个等等。80 x8
43、6常用扩展指令(续)80 x86常用扩展指令(续)3.3.2 多媒体SIMD指令集 nSIMD(Single Instruction Multiple Data:单指令多数据)一条指令能处理多个数据,使操作的并行性进一步增强,提高了计算机的多媒体处理能力。nSIMD指令集是开放的:包括MMX、3D NOW!、SSE和SSE2等。n1.MMX指令集指令集n游戏、音乐合成、语音压缩/解压、图像图形处理、MPEG视频等应用程序具有一些共同特征:n 短整数数据类型(像素:8/16位,音频:16位)n 频繁的乘与累加,高度重复的小循环体n 巨大计算量的算法n 高度并行操作nMMX技术借用现成的浮点堆栈生
44、成8个64位MMX寄存器,MMX寄存器支持四种新型数据类型:紧缩字节(8个字节)、紧缩字(4个字)、紧缩双字(2个双字)和四字,可将它们移入MMX寄存器同时完成对多个数据的算术运算和逻辑运算,特别适合整数运算密集的图像处理、视频和音频回放等多媒体应用,提高其性能。1.MMX指令集指令集nMMX指令有57条,包括算术运算(加、减、乘、除、算术移位和累加)、比较、逻辑操作(与、与非、或、异或)、转换操作(把数据紧缩和拆放)、移位操作、移数(在MMX寄存器之间、MMX寄存器与存储单元之间移入/移出)。1.MMX指令集(续)指令集(续)n音像多媒体数据流算法中常用到矢量点积、矩阵乘、FIR/IIR滤波
45、、FFT/DCT变换等,指令PMADDWD(紧缩字相乘并相加)就可方便快速地完成这类运算。nPMADDWD:16位16位32位(积)再累加n a3 a2 a1 a0nb3 b2 b1 b0 n a3b3+a2b2 a1b1+a0b0n该指令将两组4个16位数对应相乘,得到4个32位乘积,再将高两个乘积相加存入一个MMX寄存器的高32位(D63D32),将低两个乘积相加存入同一MMX寄存器的低32位(D31D0)。一条PMADDWD指令可同时处理4个乘法和2个加法。n多数MMX指令可在一个时钟周期内完成。经测试,同样的Pentium芯片,采用MMX技术运行MMX应用程序,比不采用MMX技术的运行
46、速度提高40%以上。2.3D now!指令集 n3D NOW!将原先的64位MMX寄存器加以延伸,改进成8组3D运算寄存器(充分利用浮点堆栈80位宽度),使其可以拆成两个32位浮点数,具备24位元的单精度。3D NOW!增加了21条新的多媒体处理指令,包括1条快速进入/退出多媒体执行状态指令、1条数据预取指令、2条数据格式转换指令、2条整数运算指令和15条单精度浮点运算指令。n采用3D NOW!技术,在最优化的程序执行状态下,处理器在一个时钟周期内可处理4个浮点运算,在几个时钟周期内可完成8组16个浮点数的累乘和累加,浮点运算速度比80 x87快几倍到几十倍。不采用3D NOW!技术的同档CP
47、U每个时钟周期最多只能执行一次浮点运算。n3D NOW!指令和MMX指令具有互补性,可混合使用,提升系统的多媒体性能。n3D NOW!指令集只支持IEEE754中单精度数据类型,不能实现双精度浮点运算。3.SSE指令集 nIntel在Pentium 中集成了SSE(Streeming SIMD Extension:单指令多数据扩展流)指令集。nSSE技术在微处理器中增加了8个128位浮点寄存器,支持双精度浮点运算。SSE指令集拓展3D NOW!新设计了70条指令,包括8条连续内存数据流优化处理指令、50条SIMD浮点运算指令和12条新的多媒体指令。SSE技术极大地满足了三维动画、动态音像、实时
48、通信等流媒体应用需要。n新SIMD指令集 增强型3D NOW!指令集:在3D NOW!之后推出,SSE2指令集(144条):在Pentium 4微处理器实现,功能更为强大。超线程(Hyper-Threading)技术:Intel第一款支持的Pentium 4(主频 3.06GHz)在2002年11月4日问世,可使一个微处理器当作2颗甚至多颗 CPU来使用,在线程级上实现并行操作。3.4 RISC指令集与CRISC指令 nCISC指令集:不断追求改善性能(及升级换代)和简化编译器(对高级语言提供更好的支持)导致更多/更复杂的指令、更多的寻址方式、更多的专用寄存器等等。nRISC(Reductio
49、n Instruction Set Computer)系统对C和Pascal等高级语言程序的行为分析,发现各类变量动态出现频度最高的是简单标量变量,且80%以上标量是过 程的局部变量;高级语言程序中赋值语句使用最普遍,条件语句(IF、LOOP)用的也 较多,而最耗时的操作是过程的调用和返回。在各类计算机中编译后的程序中大多数语句都是简单指令。nRISC产生的背景据此,不少机构和研究者背离CPU结构发展的传统趋势来开发新的系统,使之更好地支持高级语言、简化处理器结构(以降低研制成本和周期),同时改善性能。CISC和RISC系统的比较 RISC结构有多种,其指令集的共同特征如下:指令简单,每周期至
50、少执行一条指令,寄存器到寄存器操作为主,简单的寻址方式简单的指令格式MIPS R系列是由MIPS Technology公司开发的最早商品化的RISC处理器芯片。MIPS R系列有32位的R2000、R3000、R6000和64位的R4000,所有指令都是单一32位字格式编码,所有数据操作都是寄存器到寄存器,仅存储器访问是纯粹的装入/取出操作。SPARC(Scalable Processor Architecture:可扩展处理器体系结构)是Sun Microsystems公司开发的RISC处理器。RISC和CISC的技术:随着芯片密度的增加和硬件速度的提高,RISC系统已变得复杂起来;而追求极