指令系统是CPU指令的集合,Intel8086指令系统共有117条基本指令,按功能分为六大类:(1)数据传送类;(2)算术运算类;(3)逻辑运算和移位(位操作类);(4)控制转移类;(5)串操作;(6)处理器控制。4、指令系统分类3.38086CPU指令系统控制转移类3.38086CPU指令系统一、无条件、条件转移指令二、循环指令三、子程序调用及返回指令四、中断指令五、系统功能调用控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,用于实现分支、循环、子程序等程序结构,是仅次于传送指令的常用指令,要求很好掌握重点:Jmp、Jcc、Loop、CALL/RET、Int指令的理解难点:Jmp、Jcc、Loop、Int指令的应用一、无条件转移指令JMP指令分成4种类型:⑴段内直接转移⑵段内间接转移⑶段间直接转移⑷段间间接转移JMPlabel格式:程序转向label标号指定的地址处执行功能:说明:3.38086CPU指令系统解释段内涵义(1)段内近转移(near)在当前代码段64KB范围内转移(±32KB范围)(2)段内短转移(short)转移范围当前代码段±127B范围内转移(可用一个字节表达,在段内-128B~+127B范围的转移)段内转移不需要更改CS段地址,只要改变IP偏移地址代码段代码段3.38086CPU指令系统解释段间涵义段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针。代码段代码段3.38086CPU指令系统段内与段间转移说明:对于段内转移,在指令中可以统写成JMPlabel形式,转移过程也基本相同,即都是在同一段内实现从当前IP所指的地址转移到label所指的目标地址,只是转移的范围不同。但在具体指令中用户不必考虑是短转移还是近转移,具体在汇编时,汇编程序通过计算程序中JMP的下一条指令与目标地址间的相对位移量,就可以判定出是短转移还是近转移对于段间指令,指令需用操作符farptr强制说明3.38086CPU指令系统直接:转移地址象立即数一样,直接出现在指令中间接:转移地址在寄存器或内存单元中用标号表达用寄存器或存储器操作数表达直接与间接的解释:3.38086CPU指令系统段内直接转移举例JMPr16/m16例如:jmpaxjmpwordptr[2000h]段内间接转移JMPlabel例如:jmpoutput……output:movresult,alJMPfarptrlabel例如:;IP←label的偏移地址;CS←label的段地址jmpfarptrotherseg段间直接转移;IP←label的偏移地址JMPfarptrmem例如:段间间接转移JMPfarptr[bx]3.38086CPU指令系统二、条件转移指令功能:若指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行;若条件不成立,顺序执行下一条指令说明:(1)Jcc?(2)操作数label是采用段内短转移(3)Jcc指令不影响标志,但要利用标志Jcclabel格式:Jcc指令的分类根据利用的标志位不同,16条指令分成3种情况:(1)判断单个标志位状态(2)比较无符号数高低(3)比较有符号数大小3.38086CPU指令系统3.38086CPU指令系统1.判断单个标志位状态这组指令单独判断5个状态标志之一⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)。JZ/JE表示结果为零(或相等),则转移⑵JS和JNS:利用符号标志SF,判断结果是正是负,JS表示结果为负,则转移。⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出,JO表示溢出则转移⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇,JP表示偶数个1⑸JC和JNC:利用进位标志CF,判断结果是否进位或借位,进位或借位为1则转移例题例题例题3.38086CPU指令系统2、比较无符号数高低无符号数高低有4种关系:⑴高于(不低于等于):JA(JNBE)⑵高于等于(不低于):JAE(JNB)⑶低于(不高于等于):JB(JNAE)⑷低于等于(不高于):JBE(JNA)3.38086CPU指令系统例:编写一程序段,实现比较两个无符号数的大小,将较大者存放在AX寄存器中cmpax,bx;比较ax和bx,(AX)-(BX)jaenext;若ax≥bx,转移xchgax,bx;若ax<bx,交换next:...结果:AX保存较大的无符号数3.38086CPU指令系统3、比较有符号数大小两数的大小分成4种关系:⑴大于(不小于等于):JG(JNLE)⑵大于等于(不小于):JGE(JNL)⑶小于(不大于等于):JL(JNGE)⑷小于等于(不大于):JLE(JNG)例:比较有符号数大小,将较大的数存放在AX寄存器中cmpax,bxjgenextxchgax,bxnext:...注意:根据数的不同选取不同的指令3.38086CPU指令系统三、循环指令循环指令默认利用CX计数器,方便实现计数循环的程序结构LOOPlabel;CX←CX-1,;CX≠0,循环到标号labelLOOPZlabel;CX←CX-1,;CX≠0且ZF=1,循环到标号labelLOOPNZlabel;CX←CX-1,;CX≠0且ZF=0,循环到标号labelJCXZlabel;CX=0,转移到标号label3.38086CPU指令系统例:LOOP指令应用例子。编写一程序段,实现求1+2+…+100之和,并把结果存入AX中。┆XORAX,AXMOVCX,100MOVBX,1AGAIN:ADCAX,BXINCBXLOOPAGAIN┆┆XORAX,AXMOVCX,100AGAIN:ADCAX,CXLOOPAGAIN┆方法1:利用循环计数器CX进行累加方法2:不用循环计数器CX进行累加3.38086CPU指令系统例:LOOPZ与JCXZ指令的应用例子为检查当前数据段64KB存储单元能否正确地进行读写操作,一般做法是:先向每个字节单元写入一位组合模式,如01110111B(77H)或10111011B(BBH),然后读出来进行比较,若读/写正确则转入正确处理程序段,否则转入出错处理程序段┆XORCX,CXXORBX,BXMOVAL,01110111BCHECK:MOV[BX],ALINCBXCMP[BX-1],ALLOOPZCHECKJCXZRIGHTERROR:┆RIGHT:┆3.38086CPU指令系统四、子程序指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行演示CALL指令和RET指令都不影响状态标志位3.38086CPU指令系统1、子程序调用指令CALL指令分成4种类型CALL子程序名;段内直接调用CALLWORDPTRr16/m16;段内间接调用CALLfarptr子程序名;段间直接调用CALLDWORDptrmem;段间间接调用CALL指令需要保存返回地址:段内调用——在同一代码段内进行,也称近调用偏移地址IP入栈SP←SP-2,SS:[SP]←IP段间调用——在不同代码段之间进行,也称远调用偏移地址IP和段地址CS入栈SP←SP-2,SS:[SP]←IPSP←SP-2,SS:[SP]←CS3.38086CPU指令系统CALLDISPLAY;段内直接调用CALLBX;段内间接调用CALLWORDPTR[BX];段内间接调用CALLDWORDPTR[BX];段间间接调用例:段间直接调用示例CODE1SEGMENTCODE2SEGMENT┆┆START:…START:…┆┆CALLFARPTRSUBRSUBRPROCFARMOVBUF,AX┆┆SUBRENDPCODE1ENDSCODE2ENDSENDSTARTENDSTARTCALL指令调用示例3.38086CPU指令系统2、子程序返回指令说明:根据段内和段间、有无参数,具体分成4种情况(1)RET;无参数返回(2)RETn;有参数返回需要弹出CALL指令压入堆栈的返回地址(3)段内返回——偏移地址IP出栈IP←SS:[SP],SP←SP+2(4)段间返回——偏移地址IP和段地址CS出栈IP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2n参数的作用格式:RET[n]功能:弹出堆栈中由CALL指令压入的返回地址值,迫使CPU返回到主程序中CALL指令的下一条指令去继续执行,该指令常放在子程序的最后3.38086CPU指令系统五、中断指令中断是又一种改变程序执行顺序的方法。1、中断指令INT格式:INTn功能:产生一个中断类型号为n的内部中断,其n值是一个0~FFH范围内的整数INTn指令的具体执行步骤和操作在8.2.3中介绍2、溢出中断指令INTO格式:INTO功能:产生一个溢出中断3、中断返回指令IRET功能:退出中断过程,返回到中断时的断点处继续执行。所有的中断程序,不管是由软件引起还是由硬件引起,其最后一条指令必须是IRET3.38086CPU指令系统一、数据传送类;二、算术运算类;三、逻辑运算和移位类;四、串操作类;五、控制转移类;六、处理器控制类;3.38086CPU指令系统1、标志位操作这组指令共有7条,均为无操作数指令,它们的操作数隐含在标志寄存器的某些标志位上,即能直接对指定的标志位进行操作,但不影响别的标志位处理器控制类指令3.38086CPU指令系统2、空操作指令NOPNOP指令不执行任何操作,但却要消耗3个时钟周期的时间NOP常用于程序调试在需要预留指令空间时用NOP填充代码空间多余时也可以用NOP填充还可以用NOP实现软件延时,相当于“XCHGAX,AX”指令3.38086CPU指令系统教学要求1、重点掌握基本指令:JMP/Jcc、LOOP/LOOPZ/LOOPNZ、CALL/RET、INTn、CLC/STC,CLD/STD,CLI/STI2、了解不常使用的指令:JCXZ、NOP、CMCWAIT、IRET、INTO等3.38086CPU指令系统作业3.38086CPU指令系统