第3章16位和32位微处理器的指令系统23.1Pentium的寻址方式指令的两个问题指出进行什么操作涉及的操作数和操作结果放在何处两种情况下涉及寻址方式操作数寻址转移地址和调用地址进行寻址33.1Pentium的寻址方式3.1.1立即数寻址比如:MOVAL,80HMOVAX,1090HMOVEAX,10002000H3.1.2寄存器寻址比如:INCCXROLAH,1MOVECX,EAX43.1Pentium的寻址方式3.1.3输入/输出端口寻址I/O直接寻址比如:INAL,82HOUT80H,AXINEAX,80HI/O间接寻址INAL,DXOUTDX,AXOUTDX,EAX53.1Pentium的寻址方式3.1.4存储器寻址EA=基址+变址×比例因子+位移量63.1Pentium的寻址方式1直接寻址比如:MOVAX,[1070H]MOVEAX,ES:[1000H]2寄存器间接寻址MOVAX,[BX]MOVEAX,[EBX]3寄存器相对寻址比如:MOVAX,[SI+100H]4基址加变址的寻址MOVAX,[BX+SI]MOVEDX,[EBX+ESI]MOVEDX,[EBX][ESI]5相对的基址加变址寻址比如:MOVAX,[BP+SI+0050]73.1Pentium的寻址方式6相对的带比例因子的变址寻址IMULEBX,[ESI*4+7]7基址加比例因子的变址寻址MOVEAX,[EBX][ESI*4]MOVECX,[EDI*8][EAX]8相对的基址加比例因子的变址寻址MOVEAX,[EDI*4][EBP+80]8例:设BX=0158H,DI=10A5H,位移量=1B57H,DS=2100H,各种寻址方式下,有效地址和物理地址如下:9①直接寻址:MOVAX,[1B57H]有效地址=1B57H物理地址=21000H+1B57H=22B57H②寄存器间接寻址(寄存器为BX):MOVAX,[BX]有效地址=0158H物理地址=21000H+0158H=21158H10③BX寄存器相对间接寻址:MOVAX,[BX+1B57H]有效地址=0158H+1B57H=1CAFH物理地址=21000H+1CAFH=22CAFH④变址寻址(寄存器为DI):MOVAX,[DI]有效地址=10A5H物理地址=21000H+10A5H=220A5H11⑤DI寄存器相对变址寻址:MOVAX,[DI+1B57H]有效地址=10A5H+1B57H=2BFCH物理地址=21000H+2BFCH=23BFCH⑥基址加变址的寻址(BX为基址寄存器,DI为变址寄存器):MOVAX,[BX+DI]有效地址=0158H+10A5H=11FDH物理地址=21000H+11FDH=221FDH12⑦相对的基址加变址的寻址(BX为基址寄存器,DI为变址寄存器):MOVAX,[BX+DI+1B57H]有效地址=0158H+10A5H+1B57H=2D54H物理地址=21000H+2D54H=23D54H共有133条指令,按功能可分为:传送指令算术运算指令逻辑运算和移位指令串操作指令控制转移指令传送指令通用传送指令累加器专用传送指令地址传送指令标志传送指令通用传送指令(1)最基本的传送指令(MOV)MOVAL,BL;BL中的8位数据送ALMOVES,DX;DX中16位数据送ES是程序中使用频率最高、用的最多的指令。格式:MOVDST(目的),SRC(源)执行操作:(DST)(SRC)注意:源操作数和目的操作数都是由某一种寻址方式确定的,可以是8位或16位。注意:①通用传送指令可传送8位和16位数据②通用传送指令中总是既含源操作数,又含目的操作数③不能在两个内存单元之间直接传送数据④CS和IP寄存器不能作为目的操作数⑤用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。⑥执行SS寄存器赋值的传送指令时,系统自动禁止外部中断。⑦所有的通用传送指令都不改变标志。(2)堆栈操作指令推入堆栈指令PUSH和弹出堆栈指令POP。如:PUSHAXPUSHDSPOPDSPOPAX格式:PUSHSRC入栈指令POPDST出栈指令功能:一般用于保护现场操作数只能是16位数主程序子程序……PUSHAX转子PUSHBX……PUSHCX结束……POPCXPOPBXPOPAX返回保护现场恢复现场特点:不影响标志位;堆栈遵从“后进先出”的原则;操作数在堆栈中,高字节在高地址,低字节在低地址;每次入栈操作SP-2,每次出栈操作SP+2。注意:①堆栈操作总是按字进行的。②推入指令,SP减2,数据在栈顶。弹出指令正好相反。③允许PUSHCS,但不允许POPCS。④堆栈的后进先出。(3)交换指令格式:XCHGOPRD1,OPRD2两个操作数均可以是8位或16位功能:OPRD1与OPRD2交换①通用寄存器与累加器②通用寄存器与通用寄存器③通用寄存器与存储器例如:XCHGAL,CLXCHGBX,SIXCHGAX,AREA1[SI]交换指令注意点:①目的操作数和源操作数不能均为内存单元。②段寄存器和IP不能作为交换指令的操作数。累加器专用传送指令8088是准16位机,外部数据总线是8位,因此只有字节传送指令。而对8086来说,外部数据总线是16位,有字输入输出指令。当端口地址为00H~FFH时,可用直接输入输出指令。当端口地址多于8位(00100H~0FFFFH)时,必须先用DX存放端口地址。因此与I/O有关的寻址方式:l直接寻址:直接写8位端口号(端口地址)例:INAL,20H(8088)INAX,20H(8086)lDX寄存器间接寻址:将16位端口地址存入DX中例:MOVDX,2500H(2500H是端口号)INAL,DX(8088)INAX,DX(8086)直接寻址的输入/输出指令IN/OUT格式:INAL,n;(n)送ALINAX,n;(n+1,n)送AXOUTn,AL;AL送(n)OUTn,AX;AX送(n+1,n)说明:n为直接端口地址,是一个8位地址。(n)表示n号端口寄存器内容,8位。n+1,n为相邻两个端口地址,(n+1,n)表示n+1和n两端口寄存器内容,16位。DX间接寻址的IN/OUT指令格式:INAL,DX;((DX))送ALINAX,DX;((DX)+1,(DX))送AXOUTDX,AL;AL送((DX))OUTDX,AX;AX送((DX)+1,(DX))说明:DX是间址寄存器,其内容是端口地址,其地址值可以是16位的。注意这里间址寄存器只能用DX,不可以用其它寄存器。综上我们可以看到:如果端口地址是8位的,用直接寻址或DX间接寻址都可以;但如果端口地址是16位的,则必须用DX间接寻址。16位输入输出指令中的端口地址只能取偶数。输入输出指令注意点:①只能用累加器作为执行输入输出的机构②寻址范围:直接输入输出指令为0~255间接输入输出指令为0~65535。l换码指令格式:XLAT~将字节表格的首地址存入BX,要换取的代码相对于表格首址的偏移量存入AL中,表格的内容是要换取的代码表操作:((BX)+(AL))(AL)XLAT执行前,BX指向转换表的起点,AL中是位移量,执行后AL中是换取的代码。功能:从转换表中查找出一个字节的内容,用其取代AL寄存器中的内容。用途:常用于将一种代码转换成另一种代码。如把字符的扫描码转换成ASCII码,或把数字0~9转换成7段数码管所需要的相应代码等。换码指令的功能地址传送指令(1)取有效地址指令(LEA)如:LEAAX,[2728];将内存单元的偏移量2728送AXLEABX,[BP+SI];指令执行后,BX中内容为BP+SI的值LEASP,[0482];使堆栈指针SP为482(2)装入地址指令LDS功能:将4字节的地址指针传送到2个目的寄存器,比如:LDSDI,[2130H];使2130H和2131H中的偏移量送DI,2132H和2133H中的段值DS。(3)装入地址的指令LES功能:将一个地址指针装入ES和另一个寄存器。例:LESDI,〔BP+04〕;将堆栈中存放的字符串首址送到ES和DI中标志传送指令(1)读取标志指令(LAHF)将标志寄存器的低8位送AH。(2)设置标志指令SAHF将AH寄存器的相应位送标志寄存器的低8位。(3)对标志寄存器的堆栈操作指令PUSHF将标志寄存器的值推入堆栈顶部。POPF从堆栈弹出一个字送标志寄存器。算术运算指令算术运算指令涉及两种类型的数据无符号数8位无符号数的范围为0~25516位无符号数的范围为0~65535有符号数8位有符号数的范围为-128~+12716位有符号数的范围为-32768~+32767所有算术运算指令均影响状态标志。规则:当无符号数运算产生溢出时,CF为1;当有符号数运算产生溢出时,OF为1;如运算结果为0,则ZF=1;如运算结果为负数,则SF=1;如运算结果中有偶数个1,则PF=1。对加法和减法,无符号数和有符号数采用同一套指令。对乘法和除法,无符号数和有符号数采用不同的指令。加法指令(1)不带进位位的加法指令如:ADDAL,50H;AL和50H相加,结果放在AL中ADDDI,SI;DI和SI的内容相加,结果在DIADD[BX+DI],AX;BX+DI和BX+DI+12个单元和AX相加,结果在BX+DI和BX+DI+1所指单元ADDAX,[BX+2000H];BX+2000H和BX+2001H所指单元内容和AX的内容相加,结果在AX中(2)带进位位的加法指令如:ADCAX,SI;AX和SI中的内容以及CF的值相加,结果在AXADCDX,[SI];SI和SI+1所指的单元的内容和DX的内容以及CF的值相加,结果在DX(3)增量指令将操作数的内容加1。如:INCAL;将AL中的内容加1INCCX;将CX中的内容加1INCBYTEPTR[BX+DI+500];将BX+DI+500所指单元的内容加1要特别注意该指令不影响进位标志CF,但会影响其它标志AF、OF、PF、SF、ZF减法指令(1)不考虑借位的减法指令SUB完成2个字节或2个字的相减。如:SUBBX,CX;将BX中的内容减去CX中的内容,结果在BX中SUB[BP+2],CL;将BP+2所指的单元中的值减去CL中的值,结果在BP+2所指的堆栈单元中SUBAL,20;AL中的数减去20,结果在AL中SUBSI,5010H;SI中的数减去5010H,结果在SI中SUBWORDPTR[DI],1000H;DI和DI+1所指的两单元中的数减去1000H,结果在DI和DI+1所指的单元中(2)考虑借位的减法指令如:SBBAX,2030H;将AX的内容减去2030H,并减去CF值SBBWORDPTR[DI+2],1000H;将DI+2和DI+3所指两单元的内容减去1000H,并减去CF值,结果在DI+2和DI+3所指的单元(3)减量指令将操作数减1。如:DECAX;将AX的内容减1,再送回AX中DECBL;将BL的内容减1,结果送回BL中DECBYTEPTR[DI+2];将DI+2所指单元的内容减1,结果送回此单元要特别注意该指令不影响进位标志CF,但会影响其它标志AF、OF、PF、SF、ZF(4)求补指令操作数取补码如:NEGAL;将AL中的数取补码NEGCX;将CX中的内容取补码该指令相当于用0减去操作数,该指令会影响进位标志CF和其它标志AF、OF、PF、SF、ZF。该指令执行时,通常会使CF为1。(5)比较指令如:CMPAX,2000H;将AX的内容和2000H相比较,结果影响标志位CMPAL,50H;将AL中的数和50H比较,结果影响标志位CMP指令也是执行两个数的相减操作,但不送回相减的结果,只是使结果影响所有状态标志位。对于无符号数的比较,若CF为0,则说明被减数大,否则说明被减数小。对于有符号数的比较,如果得到OF和SF相同,则说明被减数大;否则说明被减数小。乘法指令(1)无符号数的乘法指令如:MULBL;AL中数和BL中数相乘,结果在AX中MULCX;AX中数