资源预览内容
第1页 / 共104页
第2页 / 共104页
第3页 / 共104页
第4页 / 共104页
第5页 / 共104页
第6页 / 共104页
第7页 / 共104页
第8页 / 共104页
第9页 / 共104页
第10页 / 共104页
亲,该文档总共104页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
任向民 王克朝 王喜德 冯阿芳 编著高级汇编语言程序设计高级汇编语言程序设计实用教程(第实用教程(第2 2版)版)清华大学出版社高等院校信息技术规划教材3.1指令系统概述3.1.1机器指令格式3.1.2寻址技术3.1.3立即寻址3.1.4寄存器寻址3.1.5存储器寻址方式3.28086/8088指令系统3.2.1数据传送指令3.2.2算术运算指令3.2.3逻辑运算和移位指令3.2.4处理器控制指令3.380X86指令系统3.3.180286指令系统3.3.280386指令系统3.3.380486指令系统3.3.4Pentium指令系统第第3章章 指令系统指令系统3.1 指令系统概述指令系统概述 计算机的指令系统是指其处理器所能执行的各种指令的集合。计算机的主要功能必须通过它的指令系统来实现。每种计算机都有自己的指令系统,不能互相兼容。目前,一般小型或微型计算机的指令系统可以包括几十条至几百条指令。指令有机器指令和汇编指令两种形式,机器指令用二进制代码表示,便于机器识别,但不便于用户记忆和交流;汇编指令则是用助记符来表示机器指令,容易阅读和使用,但在执行之前,必须先翻译成等价的机器指令。若无特殊说明,本书此后所论及的指令均指汇编指令。3.1.1 机器指令格式机器指令格式计算机指令通常由操作码字段和操作数字段(操作码)两部分组成。指令的基本格式如图3-1所示。操作码操作数图3-1指令的基本格式1操作码字段操作码字段指示计算机所要执行的操作类型。如加、减、乘、除、数据传送等。一台计算机可能有几十条至几百条指令,每条指令都有一个对应的操作码。2操作数字段操作数字段指出指令执行操作所需的数据和操作结果存放的位置。根据一条指令操作数字段提供的操作数个数,可以将指令分为以下3种:(1)双操作数指令双操作数指令中的操作数字段提供两个操作数,中间用逗号分隔,逗号前面的操作数称为目的操作数,逗号后面的操作数称为源操作数。其格式如图3-2所示。图3-2双操作数指令格式 操作码操作码 目的操作数目的操作数 , 源操作数源操作数3.1.1 机器指令格式机器指令格式(2)单操作数指令单操作数指令中的操作数字段只提供一个操作数。其格式如图3-3所示。图3-3单操作数指令格式这类指令有两种情况,一是只需要一个操作数,例如加1指令INC、减1指令DEC等;二是指令中只给出一个操作数,另一个操作数是隐含指出的,即操作数存放在固定位置,无需指令给出,例如进栈指令PUSH、出栈指令POP等。 操作码操作码 操作数操作数3.1.1 机器指令格式机器指令格式(3)零操作数指令这类指令中只有操作码字段,没有操作数字段。其格式如图3-4所示。图3-4零操作数指令格式这类指令有两种情况,一是不需要操作数,例如停机指令HLT;二是所需的操作数是隐含指出的,即操作数存放在固定位置,无需指令给出。例如:HLT;停机指令,不需要操作数CBW;符号扩展指令,隐含的操作数在AL和AX中 操作码操作码3.1.1 机器指令格式机器指令格式3.1.2 寻址技术寻址技术指令中的操作数字段可能直接给出操作数,也可能给出操作数的存放地址,操作数可能存放在寄存器或存储器中。若指令中给出的是操作数的存放地址,则在执行指令时就要根据指令中给出的地址信息来寻找操作数,这个过程叫做寻址,寻找操作数的各种方式统称为寻址方式。立即寻址立即寻址立即寻址方式是指操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段中。取出指令的同时也就取出了可以立即使用的操作数,这样的操作数称为立即数。立即数可以是8位或16位数,若是16位操作数,则低位字节存放在低地址单元中,高位字节存放在高地址单元中。立即寻址方式能够快速获得操作数,但适用范围有限,通常用于给寄存器或存储器赋初值。立即寻址方式只能用于源操作数,不能用于目的操作数。在汇编指令中,立即数若是数值常数可直接书写,若是字符常数,应加上引号。例如:MOVBL,20H;/将8位立即数20H存入寄存器BL中MOVAX,12BCH;/将16位立即数12BCH存入寄存器AX中MOVBX,”AB”;/将字符串”AB”存入寄存器BX中在上例中,各指令的源操作数均采用了立即寻址方式。立即寻址立即寻址寄存器寻址寄存器寻址寄存器寻址方式是指操作数存放在寄存器中,指令中直接给出寄存器名,通过寄存器名找到操作数。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP等,对于8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL等。寄存器寻址方式既可以用于源操作数,也可以用于目的操作数。例如:MOVCX,1234H;将16位立即数1234H存入寄存器CXMOVBL,AL;将寄存器AL的内容存入寄存器BLMOVDS,BX;将通用寄存器BX的内容存入段寄存器DS存储器寻址方式存储器寻址方式顾名思义,存储器寻址方式就是操作数在存储器单元中。如果存储器单元作为操作数,CPU必须通过指令提供的信息计算出该存储器单元的物理地址,物理地址是由段基址和偏移量组成的,操作数物理地址计算方法:物理地址=16段基址偏移量其中段基址取自段寄存器,所以指令只需提供计算偏移量所需要的信息就可以了。在80x86中,根据对存储器单元地址偏移量的不同计算方法,可以分为5种不同的存储器寻址方式。需要指出的是,在80x86中,为了限制指令的长度,在同一条指令中,不允许两个操作数同时采用存储器寻址方式。(1)直接寻址方式直接寻址方式是指指令所需操作数存放在存储器单元中,其地址偏移量由指令代码中的位移量直接给出。位移量可用常数表示,也可用变量名表示。操作数如果在数据段中,则指令中不必给出段寄存器名(即默认使用DS);否则,必须使用段超越前缀来说明使用其他段中的数据。操作数格式:常数|变量名。直接寻址方式如图3-5所示。图3-5直接寻址方式存储器寻址方式存储器寻址方式例如:MOVBL,100H;将当前数据段偏移量为100H的字节单元内容存入BLMOVAX,DA_WORD;将DA_WORD指向的字单元内容存入AXMOVDA_BYTE,0FFH;将立即数0FFH存入DA_BYTE指向的字节单元MOVES:100H,AX;将AX内容存入ES中偏移100H的字单元(2)寄存器间接寻址方式寄存器间接寻址方式是指指令所需操作数存放在存储器单元中,其地址偏移量由基址寄存器BX、BP或变址寄存器SI、DI给出。若使用BP,默认段为SS,若使用BX、SI和DI寄存器,默认段为DS。操作数格式:BX|BP|SI|DI寄存器间接寻址方式如图3-6所示。图3-6寄存器间接寻址方式例如:MOVBX,1234H;设BX内容为100H,将1234H存入DS段偏移100H的字单元MOVBP,BL;设BP内容为100H,将BL的内容存入SS段偏移100H的字节单元MOVAL,SI;设SI内容为100H,将DS段偏移100H的字节单元的内容存入ALMOVAX,DS:BP;设BP内容为1000H,将DS段偏移1000H的字单元的内容存入AX(3)寄存器相对寻址方式寄存器相对寻址方式是指指令所需操作数存放在存储器单元中,指令中给定的一个基址寄存器或变址寄存器名(BX、BP、SI和DI)和一个8位或16位的相对位移量,两者之和为操作数的地址偏移量。若使用BP,默认段为SS,若使用其它寄存器,默认段为DS。操作数格式:位移量BX|BP|SI|DI寄存器相对寻址方式如图3-7所示。图3-7寄存器相对寻址方式例如:MOVAL,ES:VARSI;设SI的内容为100H,VAR所指存储单元的偏移量为200H,则源操作数偏移量为300H,将ES段偏移量为300H的字节单元内容存入ALMOV10HBX,1234H;设BX的内容为100H,则目的操作数偏移量为110H,将1234H存入DS段偏移量为110H的字单元在上例中,第一条指令的源操作数和第二条指令的目的操作数采用了寄存器相对寻址方式。(4)基址变址寻址方式基址变址寻址方式是指指令所需操作数存放在存储器单元中,指令中给定的一个基址寄存器名(BX或BP)和一个变址寄存器名(SI或DI),两者内容之和为操作数的地址偏移量。若基址寄存器使用BP,默认段为SS,若基址寄存器使用BX,默认段为DS。操作数格式:BX|BPSI|DI图3-8所示例如:MOVAX,ES:BXSI;设BX的内容为100H,SI的内容为20H,则源操作数偏移量为120H,将ES段偏移120H的字单元内容存入AXMOVBPDI,AL;设BP的内容为1000H,DI的内容为50H,则目的操作数的偏移量为1050H,将AL的内容存入DS段偏移量为1050H的字节单元在上例中,第一条指令的源操作数和第二条指令的目的操作数采用了基址变址寻址方式寻址方式。(5)相对基址变址寻址方式相对基址变址寻址方式是指指令所需操作数存放在存储器单元中,指令中给定的一个基址寄存器名(BX或BP)、一个变址寄存器名(SI或DI)和一个8位或16位的相对位移量,三者内容之和为操作数的地址偏移量。若基址寄存器使用BP,默认段为SS,若基址寄存器使用BX,默认段为DS。操作数格式:位移量BX|BPSI|DI例如:MOVAL,-20HBXDI;设BX的内容为100H,DI的内容为20H,则源操作数偏移量为100H,将DS段偏移量为100H的字节单元内容存入ALMOV100HBPSI,AX;设BP的内容为1000H,DI的内容为200H,则目的操作数的偏移量为1300H,将AX的内容存入SS段偏移量1300H的字单元在上例中,第一条指令的源操作数和第二条指令的目的操作数采用了相对基址变址寻址方式。3.2 8086/8088指令系统指令系统8086/8088指令系统中的指令按照功能可以分为六类:数据传送指令、算术运算指令、逻辑运算指令、串操作指令、处理器控制指令和控制转移指令。本节介绍数据传送指令、算术运算指令、逻辑运算指令和处理器控制指令,串操作指令和控制转移指令将在第五章的相关部分介绍。数据传送指令数据传送指令数据传送指令用于寄存器、存储器或输入/输出端口之间传送数据或地址。数据传送指令又可以分为通用数据传送指令、累加器专用传送指令、地址传送指令和标志传送指令。1通用数据传送指令(1)传送指令MOV格式:MOV目的操作数,源操作数功能:将源操作数送入目的地址中,执行后,源操作数内容不变。它可以实现寄存器之间、寄存器与存储单元之间的数据传送,以及立即数到寄存器或存储单元的传送。对标志位的影响:无(2)堆栈操作指令堆栈是在存储器中开辟的一个特殊区域,它遵循“后进先出”的存取原则。堆栈操作只能在栈顶进行,堆栈的操作有进栈和出栈两种。从8086堆栈的组织形式来看,堆栈是从高地址向低地址方向生长的。最初堆栈的栈顶和栈底是重叠的,随着堆栈操作的进行,栈底的位置保持不变,而栈顶的位置却在不断地变化。进栈时栈顶向低地址方向变化,出栈时栈顶向高地址方向变化。进栈指令PUSH格式:PUSH源操作数功能:修改堆栈指针SP,然后将源操作数压入栈顶单元。具体操作过程:先将SP的内容减1,然后将源操作数的高字节存入当前SP所指单元,再将SP的内容减1,然后将源操作数的低字节存入当前SP所指单元。说明:源操作数可以是寄存器操作数、段寄存器操作数或存储器操作数。其长度必须是16位。对标志位的影响:无出栈指令POP格式:POP目的操作数功能:将栈顶单元的内容弹出(复制)到目的地址中,然后修改堆栈指针SP。具体操作过程:先将当前SP所指单元的内容弹出到目的地址的低字节,然后将SP的内容加1,再将当前SP所指单元的内容弹出到目的地址的高字节,然后再将SP的内容加1。说明:目的操作数除CS以外的段寄存器操作数或字类型的存储器操作数,其长度必须是16位。(3)交换指令XCHG格式:XCHG目的操作数,源操作数功能:将源操作数和目的操作数互换。说明:该指令至少有一个操作数在通用寄存器中。可以实现通用寄存器之间的数据交换,或通用寄存器与存储单元之间的数据交换。其操作数可以是8位的,也可以是16位的。例如:XCHGAX,BXXCHG1000H,AL2累加器专用传送指令(1)XLAT换码指令一般用来实现码制之间的转换,又称查表转换指令。在使之前,应先在数据段建立一个表格,并将表格的首单元偏移地址送入BX寄存器;要转换的代码应该是相对于表格首单元的偏移量。格式:XLAT功能:以DS:BX+AL为地址,提取存储器中的一个字节再送入AL。对标志位影响:无MOVBX,4C02HMOVAL,08HXLAT指令执行时,先计算(BX)+(AL),得到有效地址4C0AH,再将4C0AH所指字节单元中的数据送入AL寄存器。指令执行以后,AL的内容是20H。(2)输入/输出指令输入/输出指令是专门用于在输入/输出端口和累加器之间进行数据传送的指令。输入指令IN格式:长格式:IN AL/AX,PORT短格式:IN AL/AX,DX功能:从无符号数PORT或DX寄存器所指定的端口输入一个字节数据到累加器AL中,或输入一个字数据到累加器AX中。输出指令OUT格式:长格式:OUTPORT,AL/AX短格式:OUTDX,AL/AX功能:实现输出,其数据传送方向与IN指令相反。3地址传送指令地址传送指令实现操作数地址信息的传送。(1)有效地址送寄存器指令LEA格式:LEA 通用寄存器,源操作数功能:将源操作数的偏移地址送入通用寄存器。说明:指令中的目的操作数只能使用16位通用寄存器,不能使用段寄存器,源操作数只能是存储器操作数。(2)指针送寄存器和DS指令LDS格式:LDS通用寄存器,源操作数功能:将源操作数指示的双字单元内容送入通用寄存器和DS,低两字节内容送通用寄存器,高两字节内容送入DS。说明:指令中的目的操作数只能使用16位通用寄存器,不能使用段寄存器,源操作数只能是存储器操作数。(3)指针送寄存器和ES指令LESLES与LDS指令的区别仅在于,传送地址时将高两字节送ES,而不是DS。4标志传送指令标志传送指令专门用于对标志寄存器进行操作。LAHF和SAHF指令仅对标志寄存器的低8位进行操作,而PUSHF和POPF对整个标志寄存器进行操作。(1)取标志指令LAHF格式:LAHF功能:将标志寄存器的低8位传送到累加器AH。标志寄存器的低8位中有五个状态标志位,分别是:SF、ZF、AF、PF和CF,LAHF指令将这些状态标志位传送到AH的对应位。(2)置标志指令SAHF格式:SAHF功能:将累加器AH的内容传送到标志寄存器的低8位。即用AH的值来设置标志寄存器的低8位,即分别用累加器AH的第7、6、4、2、0位的值来设置标志寄存器的SF、ZF、AF、PF和CF等标志位。SAHF的执行过程如图3-15所示。对标志位的影响:SF、ZF、AF、PF和CF等标志位被修改成AH对应为的值,但其它标志位即OF、DF、IF和TF不受影响。(3)标志进栈指令PUSHF格式:PUSHF功能:与PUSH不同之处仅在于,压入堆栈的是标志寄存器的内容。对标志位的影响:无(4)标志出栈指令POPF格式:POPF功能:与POP不同之处仅在于,将栈顶单元的内容弹出到标志寄存器中。对标志位的影响:可直接修改标志寄存器的值。算术运算指令算术运算指令(1)加法指令不带进位加法指令ADD格式:ADD目的操作数,源操作数功能:将源操作数加到目的操作数。说明:源操作数和目的操作数类型必须一致,即同为字节操作数或字操作数,并且两者不能同为存储器操作数(这一点适合于所有双操作数的算术运算指令)。对标志位的影响:影响OF、SF、ZF、AF、PF、CF等标志位,具体如下:OF:字节运算结果超出了(-128+127)或字运算结果超出了(-32768+32767)时,OF=1;否则OF=0。在把操作数视为有符号数时,可以通过该标志了解结果是否溢出。SF:运算结果的最高位为1时,SF=1;否则SF=0。ZF:运算结果为0时,ZF=1;否则ZF=0。AF:低字节第3位向第4位产生进/借位时,AF=1;否则AF=0。PF:运算结果中的二进制1的个数为偶数时,PF=1;否则PF=0。CF:运算时,最高位产生进位,CF=1;否则CF=0。在把操作数视为无符号数时,可以通过该标志了解结果是否溢出。带进位加法指令ADC格式:ADC目的操作数,源操作数功能:ADC指令与ADD指令基本相同,惟一区别是:指令执行之前要将标志位CF的值加到目的操作数上。该指令主要用于多字节加法运算。对标志位的影响:影响OF、SF、ZF、AF、PF、CF等标志位。加1指令INC格式:INC目的操作数功能:将目的操作数加1。对标志位的影响:影响OF、SF、ZF、AF、PF等标志位。(2)减法指令不带借位减法指令SUB格式:SUB目的操作数,源操作数功能:将目的操作数减去源操作数。对标志位的影响:与ADD指令类似,影响OF、SF、ZF、AF、PF、CF等标志位。减1指令DEC格式:DEC目的操作数功能:将目的操作数减1。对标志位的影响:影响OF、SF、ZF、AF、PF、CF等标志位。带借位减法指令SBB格式:SBB目的操作数,源操作数功能:将目的操作数减去源操作数,再减去该指令执行前的CF的。SBB指令与SUB指令基本相同,惟一区别是:指令执行之后目的操作数还要减去标志位CF的值。对标志位的影响:与SUB指令类似,影响OF、SF、ZF、AF、PF等标志位。(3)乘法指令无符号数乘法指令MUL格式:MUL源操作数功能:实现无符号数乘法运算。若源操作数为字节操作数,则将AL与源操作数的乘积送入寄存器AX;若源操作数为字操作数,则将AX与源操作数乘积的高两字节送入寄存器DX,低两字节送入寄存器AX。有符号数乘法指令IMUL格式:IMUL源操作数功能:实现有符号数乘法运算。若源操作数为字节操作数,则将AL与源操作数的乘积送入寄存器AX;若源操作数为字操作数,则将AX与源操作数乘积的高两字节送入寄存器DX,低两字节送入寄存器AX。对标志位的影响:影响OF、CF等标志位。(4)除法指令无符号数除法指令DIV格式:DIV源操作数功能:实现无符号数除法运算。若源操作数为字节操作数,则寄存器AX的内容除以源操作数的商送入AL,余数送入AH;若源操作数为字操作数,则寄存器DX、AX的内容连接成的双字数据除以源操作数的商送入AX,余数送入DX。有符号数除法指令IDIV格式:IDIV源操作数功能:实现有符号数除法运算。若源操作数为字节操作数,则寄存器AX的内容除以源操作数的商送入AL,余数送入AH;若源操作数为字操作数,则寄存器DX、AX的内容连接成的双字数据除以源操作数的商送入AX,余数送入DX。(5)符号位扩展指令CBW格式:CBW功能:将寄存器AL中数据的符号位扩展到AH中。若AL中的最高位(符号位)为0,则(AH)=00H,若AL中的最高位(符号位)为1,则(AH)=0FFH,对标志位的影响:无。例如:若(AL)=8DH,(AH)=98H,则执行CBW后,(AX)=0FF8DH。CWD格式:CWD功能:将寄存器AX中数据的符号位扩展到DX中。若AX中的最高位(符号位)为0,则(DX)=0000H,若AX中的最高位(符号位)为1,则(DX)=0FFFFH。对标志位的影响:无。例如:若(AX)=563DH,(DX)=1234H,则执行CWD后,(AX)=563DH,(DX)=0000H。逻辑运算和移位指令逻辑运算和移位指令8086提供了两类能够直接对寄存器或存储器操作数的位进行操作的指令:逻辑运算和移位指令。1逻辑运算指令(1)按位取反指令NOT格式:NOT目的操作数功能:对目的操作数按位取反,结果送回目的操作数。对标志位的影响:无。(2)按位与运算指令AND格式:AND 目的操作数,源操作数功能:对目的操作数和源操作数执行按位的逻辑与操作,结果送回目的操作数。对标志位的影响:该指令执行后,OF=0,CF=0。此外,运算结果还将影响SF、ZF、PF等标志位。AND指令常用于将寄存器或存储器操作数的指定位清0。(3)按位或运算指令OR格式:OR 目的操作数,源操作数功能:对目的操作数和源操作数执行按位的逻辑或操作,结果送回目的操作数。对标志位的影响:与AND指令相同。OR指令常用于将寄存器或存储器操作数的指定位置1。(4)按位异或运算指令XOR格式:XOR 目的操作数,源操作数功能:对目的操作数和源操作数执行按位的逻辑异或操作,结果送回目的操作数。对标志位的影响:与AND指令相同。XOR指令常用于将寄存器或存储器操作数的指定位的内容进行翻转。(5)测试指令TEST格式:TEST 目的操作数,源操作数功能:对目的操作数和源操作数执行按位的逻辑与操作,但结果不送回目的操作数。2移位指令(1)算术移位指令算术左移指令SAL格式:SAL目的操作数,移位次数功能:将目的操作数左移指定的次数,每左移一次,最低位补0,最高位送入CF。其功能如图3-16所示。算术右移指令SAR格式:SAR 目的操作数,移位次数功能:将目的操作数右移指定的次数,每右移一次,最高位保持不变,最低位送入CF。其功能如图3-17所示。(2)逻辑移位指令逻辑左移指令SHL格式:SHL目的操作数,移位次数功能:与算术左移指令SAL的功能完全相同。对标志位的影响:影响OF、SF、ZF、PF、CF等标志位。SHL指令常用于实现无符号操作数乘以2n(n为移位次数)的运算。逻辑右移指令SHR格式:SHR 目的操作数,移位次数功能:将目的操作数右移指定的次数,每右移一次,最高位补0,最低位送入CF。其功能如图所示。(3)循环移位指令循环左移指令ROL格式:ROL目的操作数,移位次数功能:将目的操作数左移指定的次数,每左移一次,左移前的最高位送入最低位以及CF。其功能如图3-19所示。循环右移指令ROR格式:ROR目的操作数,移位次数功能:将目的操作数右移指定的次数,每右移一次,右移前的最低位送入最高位以及CF。其功能如图3-20所示。带进位的循环左移指令RCL格式:RCL目的操作数,移位次数功能:将目的操作数左移指定的次数,每左移一次,左移前的最高位送入CF,CF的内容送入最低位。其功能如图3-21所示。带进位的循环右移指令RCR格式:RCR目的操作数,移位次数功能:将目的操作数右移指定的次数,每右移一次,右移前的最低位送入CF,CF的内容送入最高位。处理器控制指令处理器控制指令处理器控制指令包括标志操作指令和CPU控制指令。1标志操作指令一组可以对标志寄存器中的指定标志位进行设置的指令。这组指令都是零操作数指令,没有源操作数,而目的操作数是隐含的。(1)STC格式:STC功能:置CF=1。(2)CLC:格式:CLC功能:置CF=0。(3):CMC格式:CMC功能:将CF取反。(4)STD格式:STD功能:置DF=1。2CPU控制指令(1)空操作指令NOP格式:NOP功能:执行一次空操作。虽然没有做任何工作,但要耗费CPU时间。(2)停机指令HLT格式:HLT功能:使CPU处于暂停状态,等待中断或复位。(3)锁总线指令LOCK格式:LOCK功能:封锁总线,使指令执行原子操作。用于多处理器并行系统。3.3 80x86指令系统指令系统80286、80386、80486以及Pentium处理器的指令系统都包括了各自前期处理器的全部指令,并在此基础之上对前期处理器的指令系统进行了增强和扩展,从而为用户提供了更强大的功能和更方便的操作。人有了知识,就会具备各种分析能力,明辨是非的能力。所以我们要勤恳读书,广泛阅读,古人说“书中自有黄金屋。”通过阅读科技书籍,我们能丰富知识,培养逻辑思维能力;通过阅读文学作品,我们能提高文学鉴赏水平,培养文学情趣;通过阅读报刊,我们能增长见识,扩大自己的知识面。有许多书籍还能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号