第3章8086指令系统(上)本章内容提要3.18086指令系统入门3.2数据据传送类指令3.3算术运算与逻辑运算类指令3.18086指令系统入门3.1.1指令分类3.1.2指令格式数据传送类指令算术运算类指令逻辑运算类指令字符串操作指令处理器控制类指令程序控制类指令操作码[目的操作数][,源操作数]3.1.3操作数寻址1.立即寻址指令中直接给出指令的操作数(跟在操作码的后面),取出指令的同时就可以获得操作数。【例3-1】MOVAL,12H;12H为立即数,指令执行后,;(AL)=12HMOVAX,1234H;1234H为立即数,指令执行后,;(AH)=12H,(AL)=34HMOVBX,512;512为立即数,指令执行后,;(BH)=02H,(BL)=00HMOVCX,‘AB’;‘AB’为立即数,指令执行后,;(CH)=‘A’,(CL)='B'注:不能直接给段寄存器和标志寄存器赋予立即数,如MOVDS,1000H应为MOVAX,1000H,MOVDS,AX。2.寄存器寻址操作数存放在某个寄存器内,在指令中直接给出寄存器的名字。【例3-2】MOVAX,BX;源操作数和目的操作数都是寄存;器寻址方式,指令执行后,;(AX)=(BX),BX中的内容不变。MOVAL,AH;源操作数和目的操作数都是寄存;器寻址方式,指令执行后,;(AL)=(AH),AH中的内容不变。MOVAX,1234H;目的操作数是寄存器寻址方式注:源寄存器和目的寄存器的位数必须一致。例如,MOVCL,BX是一条非法指令。3.直接寻址操作数存放在存储器中,指令中直接给出操作数所在存储单元的偏移地址。【例3-3】MOVAX,[2000H];将DS段偏移量为2000H中内容送入;AX寄存器MOVAX,ES:2000H;将ES段偏移量为2000H中内容送入;AX4.寄存器间接寻址操作数存放在存储器中,指令中指定的基址或变址寄存器的内容是操作数的偏移地址。【例3-4】已知:(DS)=3000H,(BX)=1100H,(31100H)=3412H,执行指令:MOVAX,[BX]。操作数的物理地址为:(SI)(DS)×16+(DI)(BX)或(SS)×16+(BP)操作数的物理地址为:(DS)×16+(BX)=3000H×16+1100H=31100H,指令执行后(AX)=3412H。5.寄存器相对寻址操作数存放在存储器中,指令中指定的基址或变址寄存器的内容,加上指令中给出的8位或16位偏移量作为操作数的偏移地址。【例3-5】已知:(DS)=3000H,(BX)=1000H,COUNT=2000H,(33000H)=13H,(33001H)=24H,执行指令:MOVAX,COUNT[BX]。操作数的物理地址为:段地址×16+(寄存器)+偏移量操作数的物理地址为:(DS)×16+(BX)+COUNT=3000H×16+1000H+2000H=33000H,指令执行后,(AX)=2413H。6.基址加变址寻址操作数存放在存储器中,指令中基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容作为操作数的偏移地址。【例3-6】已知:(DS)=3000H,(BX)=1000H,(DI)=2000H,(33000H)=13H,(33001H)=24H,执行指令:MOVAX,[BX][DI]。操作数的物理地址为:段地址×16+(基址寄存器)+(变址寄存器)操作数的物理地址为:(DS)×16+(BX)+(DI)=3000H×16+1000H+2000H=33000H,指令执行后,(AX)=2413H。注:在一条指令中不能同时使用两个基址寄存器或两个变址寄存器。例如,MOVAX,[BX][BP]和MOVCX,[SI][DI]均是非法指令。7.相对基址加变址寻址操作数存放在存储器中,指令中基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容,再加上指令中给出的偏移量作为操作数的偏移地址。【例3-7】已知:(DS)=3000H,(BX)=1000H,(DI)=2000H,COUNT=100H,(33100H)=12H,(33101H)=34H,指令:MOVAX,COUNT[BX][DI]。操作数的物理地址为:段地址×16+(基址寄存器)+(变址寄存器)+偏移量操作数的物理地址为:(DS)×16+COUNT+(BX)+(DI)=3000H×16+100H+1000H+2000H=33100H,指令执行后,(AX)=3412H。3.1.4程序转移地址寻址1.段内直接寻址指令中直接给出程序转移地址(8位或16位偏移量),CS中的内容不变,IP中的内容被更新为IP原值加上指令中给出的偏移量,作为指令的新偏移地址。【例3-8】已知:(CS)=3000H,(IP)=2000H,OPR的偏移量为0100H,执行指令:JMPNEARPTROPR。执行指令后,(CS)=3000H,(IP)=2003H+0100H=2103H。2.段内间接寻址将存放在指令中指定的16位寄存器的内容或存储器中字存储单元的内容赋于IP,CS的内容保持不变。【例3-9】已知:(CS)=3000H,(DS)=4000H,(IP)=1000H,(BX)=0100H,(40103H)=2000H,执行指令:JMPWORDPTR3[BX]。执行指令后,(IP)=2000H,(CS)=3000H。3.段间直接寻址指令中直接给出16位段地址和16位偏移地址,指令中的段地址(操作码后第二个字)作为当前指令的段地址,指令中的偏移地址(操作码后第一个字)被赋给IP作为指令的偏移地址。【例3-10】已知:(CS)=3000H,(IP)=0100H,OPR的地址为4000H:1000H,执行指令:JMPFARPTROPR。执行指令后,(CS)=4000H,(IP)=1000H。4.段间间接寻址程序转移的偏移地址和段地址存放在存储器中两个连续的字存储单元中。其中,第一个字存放偏移地址,被赋于IP;第二个字存放段地址,被赋于CS。【例3-11】已知:(CS)=3000H,(IP)=0100H,DATA指向的存储单元的内容为40001000H,执行指令:JMPDWORDPTRDATA。执行指令后,CS被赋于4000H,IP被赋于1000H。3.1.5调试程序DEBUG的使用方法常用的DEBUG命令“开始”“所有程序”“附件”“命令提示符”“DEBUG”命令索引D命令E命令F命令R命令A命令U命令G命令T命令Q命令N命令L命令W命令P命令常用的DEBUG命令实训3-1对一组数据求和将双字节数据1122H、3344H和5566H存入首地址为1000H的连续的内存单元中,每个数据占据2个字节的空间,共需要占用6个内存单元,对它们求和后将运算结果存入这组数据的下一组内存单元中。首先将寄存器中的内容初始化,由SI控制指向每一个数据的地址,通过一个循环过程对连续存放的各数据求和,将结果存入累加器AX。源程序ARRAYDW1122H,3344H,5566HMOVCX,3;将循环计数值存入CXMOVAX,0;将AX和SI置0MOVSI,AX;将循环计数值存入CXLEABX,ARRAY;将ARRAY的首地址存入BXLOP:ADDAX,[BX][SI];将数组中的每个元素与AX中;内容求和,并存入AXADDSI,2;SI控制偏移量LOOPLOP;循环,由CX控制循环次数MOVBX,SI;将SI中的内容送入DIMOVDI,BXMOV1000[DI],AX;将累加和存入1000+(DI)指;向的内存单元3.2数据传送类指令3.2.1传送指令格式:MOVDST,SRC功能:将源操作数传送给目的操作数。①在CPU内部寄存器之间进行数据传送②在CPU内部寄存器与存储器之间进行数据传送③将立即数传送给寄存器④将立即数传送给存储单元注:不允许CS、IP作为目的操作数。源操作数和目的操作数不能同时为段寄存器。源操作数和目的操作数的类型必须匹配。源操作数和目的操作数不能同时为存储器单元。立即数只能作为源操作数,不能作为目的操作数。不允许直接向段寄存器传送立即数。该指令不影响标志位。【例3-12】指出下列指令中的错误(1)MOV[DI],[SI](2)MOVDS,1000H(3)MOV2000H,AX解答:(1)两个操作数不能同时为存储器操作数。(2)不能直接向段寄存器传送立即数,正确的指令应为:MOVAX,[1000H]MOVDS,AX(3)立即数不能作为目的操作数。3.2.2堆栈操作指令堆栈操作1.入栈指令格式:PUSHSRC功能:先将SP的内容减2,再将SRC的内容存入SP指示的栈顶存储单元。2.出栈指令格式:POPDST功能:先将SP指示的栈顶内容存入DST,再将SP的内容加2,指示当前栈顶的存储单元。注:堆栈操作指令只能做字操作。堆栈操作指令不允许使用立即寻址方式。堆栈操作指令可以使用段寄存器,但出栈指令不允许使用CS寄存器。入栈指令和出栈指令不影响标志位。【例3-13】已知:(SS)=3000H,(SP)=1000H,(AX)=1122H,(31000H)=1234H。执行指令:PUSHAXPOPBX3.2.3交换指令格式:XCHGOPR1,OPR2功能:两个操作数中的内容进行交换。注:两个操作数中必须有一个在寄存器中,即不允许两个存储器之间进行交换。不允许使用段寄存器和立即数。交换指令不影响标志位。【例3-14】已知:(BX)=1122H,(DS)=3000H,(31000H)=1234H。执行指令:SCHGBX,[1000H]。源操作数的物理地址为:(DS)×16+1000H=31000H。指令执行的结果为:(BX)=1234H,(31000H)=1122H。3.2.4目的地址传送指令1.有效地址传送指令格式:LEAREG,MEM功能:将存储器MEM的有效地址(偏移地址)送到指定寄存器中。2.指针送寄存器和DS指令格式:LDSREG,MEM功能:将存储器MEM中存放的4个连续字节中的内容(包括偏移地址和段地址)分别送到指定寄存器和DS中。其中,前2个字节送入指定寄存器中,后2个字节送入DS中。注:目的地址传送指令中的目的操作数必须是16位通用寄存器,源操作数必须是存储器。目的地址传送指令不影响标志位。3.指针送寄存器和ES指令格式:LESREG,MEM功能:将存储器MEM中存放的4个连续字节中的内容(包括偏移地址和段地址)分别送到指定寄存器和ES中。其中,前2个字节送入指定寄存器中,后2个字节送入ES中。【例3-15】已知:(DS)=3000H,(32000H)=12H,(32001H)=34H,(32002H)=56H,(32003H)=78H。执行指令:LDSSI,[2000H]。小结1LEA指令与MOV指令的区别:“LEA”指令取内存单元的偏移地址;“MOV”指令取内存单元的内容。举例说明:目的操作数只能是16位通用寄存器3.2.5输入输出指令1.输入指令长格式:INAL,PORTINAX,PORT功能:从指定的I/O端口输入一个字节或一个字的数据送入AL或AX。2.输出指令短格式:INAL,DXINAX,DX长格式:OUTPORT,ALOUTPORT,AX功能:将AL或AX中的内容输出到指定的I/O端口。短格式:OUTDX,ALOUTDX,AX【例3-16】将端口1200H的一个字送入累加器中。指令为:MOVDX,1200HINAX,DX注:输入输出指令只能使用累加器AX或AL来输入或输出数据。PORT和DX的内容均为I/O端口地址,传送的是端口中的信息。当端口地址超出16位时,必须使用短格式先把端口号放到DX中。输入输出指令不影响标志位。3.2.6换码指令注:换码指令只能使用AL和BX两个寄存器。换码指令不影响标志位。格式:XLATOPR或XLAT功能:把一种代码转换成另一种代码。通常先建立一个字节表格,将首地址放入BX中,相对于首地址的偏移量存入AL中,根据AL和BX的内容找到转换后的代码送到AL中。其中,OPR为表格首地址。【例3