练习指出下列指令中源操作数的寻址方式。若是存储器寻址,写出有效地址和物理地址;设(DS)=3000H,(ES)=1000H,(SS)=1500H,(SI)=00B0H,(DI)=5040H,(BX)=0700H,(BP)=1200H;1)MOVAX,2040H2)MOVDX,[BP]3)MOVDI,ES:[BX+2]4)MOVBX,[20H]5)MOVAX,[BX+DI]6)MOVAX,[BX+SI+1]答案设(DS)=3000H,(ES)=1000H,(SS)=1500H,(SI)=00B0H,(DI)=5040H,(BX)=0700H,(BP)=1200H;1)MOVAX,2040H;立即数无EA,无物理地址2)MOVDX,[BP];寄存器间接EA=(BP)=1200H;物理地址为16200H3)MOVDI,ES:[BX+2];寄存器相对EA=(BX)+2=0702H;物理地址为10702H4)MOVBX,[20H];直接寻址EA=20H,物理30020H5)MOVAX,[BX+DI];基址加变址EA=(BX)+(DI)=5740H;物理地址为35740H6)MOVAX,[BX+SI+1];相对基址加变址EA=(BX)+(SI)+1=07B1H,;物理地址为307B1H3.28086指令系统8086指令系统是80x86的基本指令集,按功能可以把这些指令分为六种类型:数据传送指令算术运算指令逻辑运算与移位指令串操作指令控制转移指令处理器控制指令4数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令。传送指令把数据从一个位置传送到另一个位置。除标志寄存器传送指令外,均不影响标志位。3.2.1数据传送指令3.2.1数据传送指令数据传送指令用于寄存器,存储单元和输入输出端口之间传送数据或地址。除SAHF和POPF外,对标志无影响。主要有四类:1.通用数据传送指令(MOV、XCHG、PUSH/POP、XLAT)2.地址传送指令(LEA、LDS、LES)3.标志传送指令(LAHF/SAHF、PUSHF/POPF)4.输入输出指令(IN、OUT)1.通用数据传送指令(1)基本的传送指令MOV格式:MOVDEST,SRC功能:将源操作数的内容传送到目的操作数。结果目的操作数的内容等于源操作数的内容,源操作数的内容不变。对标志位的影响:该指令不影响标志位。该指令的源操作数SRC可以使用各种寻址方式,目的操作数DEST可以使用除立即数外的各种寻址方式。1.通用数据传送指令例:基本的传送指令MOVAL,30H;立即数传送到寄存器MOVAL,BL;寄存器之间传送字节数据MOVSI,[BX+62H];寄存器和存储器之间传送数据MOVWORDPTR[SI],01H;立即数传送到存储器;该指令的源操作数SRC可以使用各种寻址方式,目的操作数DEST可以使用除立即数外的各种寻址方式。8依据源操作数、目的操作数的不同,MOV指令有6种具体格式①通用寄存器之间的数据传送例如MOVAL,BLMOVAX,CX它将源寄存器的内容传送到目的寄存器,源寄存器内容不变。1.通用数据传送指令9②通用寄存器与段寄存器之间的数据传送例如MOVDS,AXMOVAX,ES注意:向段寄存器送数据,源操作数不能用立即数,只能从通用数据寄存器或存储器段寄存器不能向CS传送1.通用数据传送指令10例如MOVAL,[BX]MOV[1234H],BX④段寄存器和存储单元之间的数据传送例如MOVDS,[3000H]MOV[BX+SI],CS⑤立即数送通用寄存器MOVAX,1234H;将立即数1234HAX⑥立即数送存储单元MOVWORDPTR[DI],0800H表示是一个字型数据③通用寄存器和存储单元之间的数据传送1.通用数据传送指令立即数存储器通用寄存器AXBXCXDXBPSPSIDI段寄存器CSDSESSS1.通用数据传送指令MOV指令传送功能图解1.通用数据传送指令例下列指令是不合法的。MOV6234H,AX;立即数不能用于目的操作数MOVCS,AX;CS不能用于目的操作数MOVIP,AX;IP不能用于目的操作数MOVDS,4234H;立即数不能直接传送给段寄存器MOVAL,BX;源操作数与目的操作数的位数必须一致MOVBUF1,BUF2;不能在两个存储器单元之间传送数据MOVDS,ES;不能在两个段寄存器之间传送数据分析错误的指令MOVDS,0100HMOV[1000H],[2000H]MOV1020H,DXMOVCS,AXMOVAX,[BX+BP]MOVCL,3300HMOVDS,ESMOVIP,2000HMOVTEST1,CS不能向段寄存器送立即数存储器之间不能直接传送立即数不能做目的操作数代码段寄存器不能是目的操作数不能同时使用两个基址寄存器数据类型不匹配段寄存器之间不能直接传IP不能直接作为目的操作数符号名不能做目的操作数1)MOV指令源、目标操作数长度必须一致,即两者同为8位或同为16位;2)目的操作数DST不能为立即数;3)立即数不能传送到段寄存器中。4)DST、SRC不能同时为段寄存器,也不能同时为存储器单元;5)不能使用此指令为代码段寄存器CS以及指令指针IP赋值,CS,IP不能作为目的操作数。注意几种不能传送的解决办法:MOVAL,mem1;通过寄存器AL作桥梁MOVmem2,AL;用来解决存←存MOVAX,DS;通过AX解决MOVES,AX;段寄←段寄MOVAX,data;通过AX解决MOVDS,AX;段寄←立即数例:用MOV指令实现两内存字节单元内容的赋值[1000H]送[2000H]MOVAL,[1000H]MOV[2000H],AL例:用MOV指令实现两内存字节单元内容的交换[2000H]互换[3000H]MOVAL,[2000H]MOVAH,[3000H]MOV[2000H],AHMOV[3000H],AL(2)交换指令格式:XCHGDEST,SRC功能:将源操作数与目的操作数的内容交换(Exchange)指令执行后,源操作数变成目的操作数,目的操作数变成源操作数,不影响标志位。例:交换指令XCHGAL,CL;字节交换XCHGBX,SI;字交换XCHGAX,[BX+SI];寄存器和存储器之间交换数据(2)交换指令例:下列指令是非法的XCHGAX,6234H;寄存器与立即数之间不能交换XCHGBUF1,BUF2;存储器单元与存储器单元之间不能交换XCHGADDR,4234H;存储器单元与立即数之间不能交换XCHGCS,DAT[BX];不能与CS(或IP)寄存器进行交换19使用注意事项:可以在两个寄存器、或寄存器与存储器之间交换,不能与段寄存器进行交换,也不能与立即数进行交换,存储器两单元之间不能进行交换。例:用XCHG指令改进前面的数据块交换程序:[2000H]互换[3000H]MOVAL,[2000H];(XCHG)XCHGAL,[3000H];MOV[2000H],AL;(XCHG)堆栈是按“后进先出“原则定义在存储器中的用来存储数据的特殊的存储区域:堆栈在存储器中的位置和大小由堆栈段段寄存器SS和堆栈指针SP的初始值确定堆栈按“后进先出”方式工作,只有一个出入口;出入口称为栈顶堆栈操作总是字操作;操作包括入栈和出栈(3)堆栈操作指令堆栈段段基址存放在SSSP的初值确定了所用堆栈区的大小堆栈指针SP始终指向堆栈的顶部(称为栈顶)堆栈指针自动修正入栈时:SP-2SP出栈时:SP+2SP……SP段基址SS就这么大!进栈方向退栈方向24作用:在调用一个过程时,保存返回地址;保存现场——中断服务程序、或子程序中用到某些寄存器或存储单元,但这些寄存器或存储单元在主程序中也用到,并且它的内容不能被子程序或中断服务程序破坏。暂时存放寄存器或存储器单元操作数的内容。(3)堆栈操作指令25格式:PUSHSRC功能:将SRC压入堆栈。SRC可以是16位的寄存器,段寄存器,字存储单元。执行操作:(SP)(SP)-2((SP)+1,(SP))(SRC)过程:先修改SP的内容:(SP)(SP)-2,使SP指向新的栈顶,然后将SRC的低8位存入SP指向的单元,高8位存入(SP)+1指向的单元。(3)堆栈操作指令①入栈指令26①格式:POPDEST②功能:将(SP)指向的存储单元的内容送入DEST指向的寄存器或存储单元。DEST可以是16位的寄存器,段寄存器,字存储单元。注意:CS不能作为DEST。②出栈指令③执行操作:(DST)(SP)+1,(SP))(SP)(SP)+2操作过程:先将(SP)指向的存储单元的内容送到dst,(SP)为低字节,(SP)+1为高字节,然后修改(SP)=(SP)+2。该过程与入栈相反。27①源操作数和目的操作数为16位,可以是通用寄存器、段寄存器、内存操作数。但CS不能作为目的操作数。②遵循先进后出的原则。③SP总是指向栈顶,压栈时,高字节压入到高地址,低字节压入到低地址。出栈刚好相反。使用堆栈指令的注意事项:例将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中,已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH,其示意图见下图:-20200×162006200712FAH2000SS段首地址新栈顶原栈顶120008SSCXSP2008FA+12FAH+2×16存储器SS段首地址新栈顶原栈顶CXSPSS02000008200620072008FA122000+注意:*堆栈操作必须以字为单位。*不影响标志位*不能用立即寻址方式PUSH1234H*DST不能是CSPOPCS即:CS的值可以推入堆栈,但反过来不能从堆栈中弹入一个值到CS。例:假设(AX)=2107H,执行PUSHAX(SP)低地址高地址(SP)07H21H低地址高地址进栈方向********PUSHAX执行前PUSHAX执行后例:POPBX(SP)低地址高地址(SP)07H21H低地址高地址出栈方向07H21H(BX)=2107HPOPBX执行前POPBX执行后********PUSH指令在程序中常用来暂存某些数据,而POP指令又可以将这些数据恢复。例:PUSHAXPUSHBX……POPBXPOPAX注意:恢复数据时寄存器的操作顺序(出栈和进栈顺序相反);其间用到AX和BX寄存器(4)换码指令格式:XLAT功能:这是一条专门用于AL和字节表中某一存储单元之间执行数据传送的指令。执行(AL)←((BX)+(AL))的操作,使AL中的一个值变换为内存表格中的某一个值,实现编码的转换。(4)换码指令该指令对于进行代码转换非常有用——利用该指令查表。执行操作:(AL)((BX)+(AL))功能:使用换码指令时,要求BX指向表的首地址,AL中为表中某一项与表格首地址之间的位移量。执行指令时,会将BX和AL的内容相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中。说明(使用方法):先在存储器的数据段中建立一个字节表格,表格的内容则是要换取的代码。表格的首地址送到寄存器BX中。对应编码相对于表格首地址的位移量送到寄存器AL中。指令XLAT指令,AL中即为转换后的编码。(4)换码指令换码指令:XLAT或XLATOPRXLATopr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。(4)换码指令(4)换码指令Hex_table+0Hex_table+1Hex_table+2Hex_table+8Hex_table+9‘0’‘1’‘2’‘8’‘9’30H31H32H38H39H例:在内存的数据段中存放有一张数值0~9的ASCII码转换表,首地址为Hex_table,如右图所示。现要把数值8转换成对应的ASCII码,可用以下几条指令实现:LEABX,Hex_table;(BX)←表首偏移地址MOVAL,8;(AL)←8XLAT;查表转换执行指令:M