您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 微型计算机原理与汇编语言 第4章-指令系统
4.1.38086/8088指令系统8086/8088CPU指令系统包含有133条基本指令。按其功能可以分为6类,它们是:⑴数据传送类指令⑵算术运算类指令⑶逻辑运算与移位类指令⑷字符串指令⑸控制转移类指令⑹处理器控制类指令。用到的符号意义如下:•DST:目的操作数•SRC:源操作数•OPR:操作数•MEM:存储器操作数•REG:寄存器操作数(16位的AX,BX,CX,DX,BP,SP,SI,DI或8位的AH,AL,BH,BL,CH,CL,DH,DL)•SEG:段寄存器(16位的CS,DS,ES,SS)•Data:立即数•port:8位的端口地址•DST_ADDR:转移的目标地址•COUNT:计数器一、数据传送类指令数据传送类指令将数据、地址或立即数传送到寄存器或存储器单元中。它又可分为通用数据传送指令、累加器专用传送指令、地址传送指令和标志传送指令等四组。(一)通用数据传送指令1.最基本的传送指令指令格式及操作:MOVdst,src;(dst)←(src)dst是目的操作数Src是源操作数需说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中的内容。但是CS可以作为源操作数。16位通用寄存器AXBXCXDXBPSPSIDIALBLCLDLAHBHCHDH段寄存器CSDSSSES存储器立即数16位8\16位8\16位8\16位MOV指令数据传送方向说明:*DST和SRC的组合关系是:①REG/MEM=data②REG/MEM=REG③REG/MEM=SEG*CS不能做目的操作数;*不能MEM=MEM,不能SEG=SEG,不能SEG=data*MOV不改变源操作数,不影响标志位。例:MOVAL,80HMOV[BX],1020HMOVAX,BXMOVDH,ALMOV[BX+10H],DXMOVDX,[BX+SI]MOVSS,AXMOVSS,[1000H]MOVAX,DSMOV[3020H],DS2.堆栈操作指令堆栈操作指令是用来完成压入和弹出堆栈操作的。⑴压入堆栈指令指令格式及操作:PUSHsrc;(SP)←(SP)-2,((SP)+1:(SP))←(src)⑵弹出堆栈指令指令格式及操作:POPdst;(dst)←((SP)+1:(SP)),(SP)←(SP)+2源操作数src和目的操作数dst可以是REG/MEM/SEG,且必须是16位的操作数,但不能是立即数。说明:*堆栈按后进先出原则组织。*堆栈操作以字为单位进行。*目的操作数dst不可以是CS。例:PUSH[BX+DI]PUSHAXPUSHCSPOP[BX+SI+1020H]POPBXPOPDS例:已知(AX)=1234H,(BX)=5678H,分析下面程序段的执行过程。1PUSHAX2PUSHAXPUSHBXPUSHBXPOPAXPOPBXPOPBXPOPAX3.交换指令XCHG(Exchange)格式:XCHGOPR1,OPR2执行操作:OPR1=OPR2说明两个操作数中必有一个是寄存器REG=REG/MEM例:XCHGBX,[BP+SI]XCHGDL,BLXCHGBX,CXXCHG[2000H],AHXCHG[2000H],BXXCHGDXXCHGBL(二)累加器专用指令这类指令中的一个操作数必须是累加器。累加器操作数可以是8位的,也可以是16位的。1.输入/输出指令输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令:一类是通过DX寄存器间接端口地址的输入/输出指令。⑴输入指令①直接寻址的输入指令指令格式及操作:INacc,port;(acc)←(port)②间接寻址的输入指令指令格式及操作:INacc,DX;(acc)←((DX))⑵输出指令①直接寻址的输出指令指令格式及操作:OUTport,acc;(port)←(acc)②间接寻址的输出指令指令格式及操作:OUTDX,acc;((DX))←(acc)2.字节转换指令指令格式及操作:XLATsrc_table;(AL)←((BX)+(AL))XLAT指令是用来将一种字节代码转换成另一种字节代码。常用该指令进行查表操作。使用前先建立一个字节表格,表格的首址存入BX,要转换的代码(即相对于表格首址的位移量)放入AL,然后执行XLAT,在AL中得到转换以后的代码。XLAT指令还可以有以下几种表示形式:XLAT;不写操作数XLATB;有B就不允许再写操作数。XLATES:src_table;重设段寄存器为ES[例]在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,欲将十六进制数0AH转换成ASCII码,则可用以下几条指令实现:MOVBX,OFFSETHex_tale;(BX)←表首址MOVAL,0AH;(AL)←十六进制数AXLATHex_table;查表转换61000H61001H61002H6100AH6100BH6100FH60000HDS:60000HBX:1000HAX:000AH+6100AHHex_tableHex_table+1Hex_table+2Hex_table+AHex_table+BHex_table+FASCII表31H32H41H42H30H46H………0AHALEA6100AH41H41HASCII表Hex_table=1000H(三)地址传送指令1.取有效地址指令指令格式:LEAreg16,mem此指令的功能是将存放源操作数的16位偏移地址(即有效地址EA)送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数。例如:LEABX,bufferLEAAX,[BP][DI]LEADX,bety[BX][SI]注意LEA指令和MOV指令的异同,比较下面两组指令:不同:LEABX,buffer;将存储器buffer的偏移地址送到BXMOVBX,buffer;将存储器buffer的内容传送到BX相同:LEABX,bufferMOVBX,OFFSETbuffer以上两条指令都是将存储器buffer的偏移地址送到BX。其中OFFSETbuffer表示存储器偏移地址。2.地址指针装入DS指令指令格式:LDSreg16,mem32此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入DS,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:LDSDI,[2130H]34H12H00H40H2130H2132HDMDIDS1234H4000H3.地址指针装入ES指令指令格式:LESreg16,mem32此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入ES,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如:LESDI,[2130H]34H12H00H40H2130H2132HDMDIES1234H4000H(四)标志传送指令1.取标志指令指令格式:LAHF2.置标志指令指令格式:SAHFOFDFIFTFSFZFAFPFCFFLAGAHLAHF和SAHF指令操作示意图3.标志压入堆栈指令指令格式及操作:PUSHF;(SP)←(SP)-2,((SP)+1;(SP))←(FLAG)4.标志弹出堆栈指令指令格式及操作:POPF;(FLAG)←((SP)+1;(SP)),(SP)←(SP)+2二、算术运算指令8086/8088有丰富的算术运算指令,而且可以处理4种类型的数据,如下表所示:数据类型数据范围运算可作累加器使用的寄存器或存储器二进制8位无符号0~255加减所有的通用寄存器或存储器乘除AX寄存器16位无符号0~65535加减所有的通用寄存器或存储器乘除AX、DX寄存器8位带符号-128~+127加减所有的通用寄存器或存储器乘除AX寄存器16位带符号-32768~+32767加减所有的通用寄存器或存储器乘除AX、DX寄存器十进制组合式0~99加减AX寄存器分离式0~9加减AX寄存器乘除AX寄存器2算术运算类指令(1)加法指令ADD(add)加法格式:ADDDST,SRC操作:DST=DST+SRCADC(addwithcarry)带进位的加法格式:ADCDST,SRC操作:DST=DST+SRC+CFINC(increment)加1格式:INCDST操作:DST=DST+1说明:1、DST:REG/MEM,SRC:8/16data/REG/MEM。2、DST、SRC不能同时为MEM。3、加法指令影响标志寄存器的状态标志。4、INC指令不影响CF标志。(2)减法指令SUB(subtract)减法格式:SUBDST,SRC操作:DST=DST-SRCSBB(subtractwithborrow)带借位的减法格式:SBBDST,SRC操作:DST=DST-SRC-CFDEC(Decrement)减1格式:DECDST操作:DST=DST-1NEG(Negate)求补格式:NEGDST操作:DST=0-DST利用NEG指令可以得到负数的绝对值CMP(Compare)比较格式:CMPDST,SRC操作:DST-SRC相当于减法,但不保存结果,仅影响标志。说明:1、DST:REG/MEM,SRC:8/16data/REG/MEM。2、DST、SRC不能同时为MEM。3、减法指令影响标志寄存器的状态标志。4、DEC指令不影响CF标志。例:教材P93-94例:求两个多字节16进制数之和:3B74AC60F8+20D59E36C1=?[例题]计算两个多字节十六进制数之和:374AC60F8H+20D59E36C1H=?存储器…DATA1F8H被加数60HACH74H3BH…DATA2C1H加数36H9EHD5H20H…开始结束初始化:置循环次数清SI,清进位标志CF取一个字节加数SI加1与一个被加数相加并送回内存区循环次数减1循环完否NYMOVCX,5;设置循环次数MOVSI,0;置位移量初值CLC;清进位CFLOOPER:MOVAL,DATA2[SI];取一个加数ADCDATA1[SI],AL;和一个被加数相加INCSI;位移量加1DECCX;循环次数减1JNZLOOPER;加完否HLT;程序暂停[例题]在数据段从MYDATA开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元。程序如下:LEABX,MYDATA;MYDATA偏移地址送BXMOVAL,[BX];第一个无符号数送ALINCBX;BX指向第二个无符号数CMPAL,[BX];两个数比较JNCDONE;如CF=0,则转DONEMOVAL,[BX];否则,第二个无符号数送ALDONE:MOVMAX,AL;较大的无符号数送MAX单元HLT;停止(3)乘法指令MUL(UnsignedMultiple)无符号数乘法格式:MULSRC操作:AX=AL*SRC(字节)/DX,AX=AX*SRC(字)默认使用AX或DX,AX为目的操作数。AL源操作数AL×AHAX源操作数AXDX×IMUL(SignedMultiple)有符号数乘法格式:IMULSRC操作:类似MUL。默认使用AX或DX,AX为目的操作数。说明:1、SRC为REG/MEM。2、乘法指令影响状态标志,但只对CF和OF有定义且CF=OF。字节乘法运算的结果可以保存在AL中或字乘法的运算结果可以保存在AX中(即无符号数相乘结果的高半部分为零或带符号数相乘结果的高半部分为低半部分符号位的扩展),则CF=OF=0;否则CF=OF=1。(4)除法指令DIV(Unsigneddivide)无符号数除法格式:DIVSRC操作:1、字节除法:AX/SRC,商=AL,余数=AH2、字除法:DX,AX/SRC,商=AX,余数=DXAL源操作数AXAHAXAX源操作数DXDX商商余数余数8位16位16位32位除数除数被除数被除数IDIV(Signeddivide)有符号数除法格式:IDIVSRC操作:类似DIV
本文标题:微型计算机原理与汇编语言 第4章-指令系统
链接地址:https://www.777doc.com/doc-3178112 .html