您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 2章56控制0822
微机原理与应用主讲教师:姜涛教学内容:第一章微型计算机基础第二章微型计算机指令系统第三章汇编语言程序设计第四章半导体存储器第五章数字量输入输出第六章模拟量输入输出微机原理与应用第1章、微型计算机基础1.3微型计算机系统的组成、分类和配置1.3.1微型计算机系统的组成4微型计算机的物理结构CPU北桥南桥RAMCacheAGPCRTBIOSKBD,Mouse串行/并行接口HDD/CDROM(IDE)FDDUSBPCIISA前端总线/CPU总线接口卡外设总线扩展槽5微型计算机的物理结构6第2章微型计算机指令系统movax,12hcalldisplayJmp1234h7主要内容:2.0指令系统概述2.1寻址方式2.28086/8088指令系统2.2.1------------2.2.2------------2.2.3------------2.2.4------------2.2.5控制转移指令控制转移指令分为:–转移指令–循环控制指令–调用和返回指令–中断指令转移指令的实质:改变IP(或CS)的内容。所有转移指令不会影响标志位。分为无条件转移和条件转移两种。1.转移指令(1)无条件转移指令-JMP本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令分成4种情况。①段内直接转移:JMPdisp指令中给出的8/16位的位移量加到IP。CS保持不变。②段内间接转移:JMPreg/memreg/mem中的16位偏移地址送IP。CS保持不变。③段间直接转移JMPsegment:offset指令中给出的16位的段和16位的偏移地址送到CS和IP。④段间间接转移JMPmem32mem32中的16位的段和16位的偏移地址送到CS和IP。转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个相对于IP的位移量:位移量转移范围汇编语言中格式8位-128~+127JMPSHORTOPRD16位-32768~+32767JMPNEARPTROPRD例:JMP0120H;直接转向0120HJMPSHORTLP;转向LPJMPNEARPTRBBB;转向BBB由于是段内转移,故转移后CS内容保持不变①段内直接转移②段内间接转移转移的目标地址由寄存器或存储单元的内容给出。例1:JMPSI若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。例2:JMP[BX+DI]设指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:JMPWORDPTR[BX+DI]表示所取得的目标地址是一个字。③段间直接转移在指令中直接给出要转移到的目的段地址和偏移地址。例:JMP2000H:1000H执行时,(IP)←1000H,(CS)←2000H注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FARPTR。例:JMPFARPTRfar_label其中的far_label为远类型的标号。转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如:JMPDWORDPTR[SI]设指令执行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H则指令执行后:(IP)=1000H,(CS)=4A00H于是转到4B000H处开始执行指令。例中的DWORDPTR表示转移地址是一个双字。④段间间接转移40001212+)41212DSSI0010004A4121241213412144121510004A00IPCS段间间接转移操作示意图1111111111101100JMPDWORDPTR[SI]的机器码DS:[SI]条件转移指令可实现程序的条件分支。条件转移指令根据标志位的状态来决定是否进行分支转移。格式:JXXlabel;xx为条件名称缩写指令的转移范围为-128~+127字节。主要的条件转移指令参见p112表2-7。(2)条件转移指令-JXX①根据单个标志位设置的条件转移指令JB/JC;低于,或CF=1,则转移JNB/JNC/JAE;高于或等于,或CF=0,则转移JP/JPE;奇偶标志PF=1(偶),则转移JNP/JPO;奇偶标志PF=0(奇),则转移JZ/JE;结果为零(ZF=1),则转移JNZ/JNE;结果不为零(ZF=0),则转移JS;SF=1,则转移JNS;SF=0,则转移JO;OF=1,则转移JNO;OF=0,则转移这类指令主要用来判断两个数的大小。一般指令序列为:CMPdist,src;比较Jxxlabel;根据比较结果转移判断无符号数的大小JA高于则转移(dist>src)转移条件为:CF=0∧ZF=0JNA/JBE低于或等于则转移(dist≤src)转移条件为:CF=1∨ZF=1②根据组合条件设置的条件转移指令JG;大于则转移(dist>src)转移条件为:(SF⊕OF=0)∧ZF=0JGE;大于或等于则转移(dist≥src)转移条件为:(SF⊕OF=0)∨ZF=1JL;小于则转移(dist<src)转移条件为:(SF⊕OF=1)∧ZF=0JLE;小于或等于则转移(dist≤src)转移条件为:(SF⊕OF=1)∨ZF=1判断有符号数的大小③根据CX内容来决定是否转移的转移指令JCXZlabel若(CX)=0,则转移到label处开始执行。条件转移指令举例:以十六进制数形式显示BX中的内容。MOVBX,1234HMOVCH,4;CH做循环计数器ROT:MOVCL,4;CL做移位计数器ROLBX,CL;将最高4位移到低4位MOVAL,BLANDAL,0FH;取出低4位ADDAL,30H;转换为ASCII码CMPAL,39H;与’9’比较JBEDISP;若(AL)≤‘9’,则转显示ADDAL,7;若(AL)>’9’,再加7转为‘A’-‘F’DISP:MOVDL,AL;(DL)←字符MOVAH,2INT21H;显示输出DECCH;4个十六进制数显示完否?JNZROT;没有,循环MOVDL,48H;‘H’MOVAH,2INT21H;最后显示’H’2.循环控制指令用在循环程序中以确定是否要继续循环。循环次数通常置于CX中。转移的目标应在距离本指令-128~+127的范围之内。循环控制指令不影响标志位。(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,则转至label处执行;否则退出循环,执行LOOP后面的指令。注:LOOP指令与下面的指令段等价:DECCXJNZlabel(2)LOOPZ(LOOPE)格式:LOOPZlabel操作:(CX)-1→CX;若(CX)≠0∧ZF=1,则转至label处执行;否则退出循环,执行LOOP后面的指令。(3)LOOPNZ(LOOPNE)格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0∧ZF=0,则转至label处执行;否则退出循环,执行LOOP后面的指令。例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0H)MOVAX,1A00HMOVDS,AX;1A00H段MOVDI,-1MOVCX,256GOON:INCDIDECBYTEPTR[DI]LOOPNZGOONHLT例2:在8000H开始的长度为1000字节的字符串中查找’S’,若找到,把其偏移地址记录在ADDR中,否则ADDR单元置为0FFFFH。MOVDI,8000HMOVCX,1000MOVAL,’S’MOVADDR,0FFFFHGOON:SCASBLOOPNZGOONJNZDONEDECDIMOVADDR,DIDONE:HLT3.过程调用和返回指令过程(子程序)一段具有特定功能的,供其它程序调用的公用程序。特点调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,多次调用;可带参数调用,以完成不同的功能。优点程序代码短,结构清晰,便于编程、调试、修改和阅读。两条相关指令:子程序调用指令CALL子程序返回指令RET一般格式:CALLsub;sub为子程序的入口根据子程序入口的寻址方式,子程序调用有四类。①段内直接调用子程序的偏移地址直接由CALL指令给出。格式:CALLnear_procCALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。注:汇编以后的调用地址是相对于CALL的下一条指令的位移量。例:CALL0120H;子程序偏移地址由指令给出(1)调用指令CALL位移量由汇编程序在汇编时进行计算,如下例:CS:0102CALL0120H;3字节CS:0105……则位移量为:0120-0105H=001BH于是CALL0120H的机器码为E81B00CS:0102E8CS:01031BCALL0120HCS:010400CS:0105……子程序的偏移地址在寄存器或存储器中。格式:CALLmem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:CALLBX;子程序地址由BX给出CALLWORDPTR[SI];子程序地址在存储器中②段内间接调用CALLIPHIPL代码段数据段CALLWORDPTR[SI]指令的操作图示:假定:(DS)=8000H,(SI)=1200H81200H81201H子程序的段地址和偏移地址直接由CALL指令给出。格式:CALLfar_proc;far_proc为远过程的地址指令的操作为:CS内容压栈IP内容压栈CS←段地址IP←偏移地址例:CALL2000H:1000HCALLTIMER;TIMER为远过程③段间直接调用子程序的段和偏移地址为存储器的连续4个单元中的内容。格式:CALLmem32指令的操作为:SP←(SP)-2((SP)+1,(SP))←(CS);CS压栈CS←(mem32+2)SP←(SP)-2((SP)+1,(SP))←(IP);IP压栈IP←(mem32)例:CALLDWORDPTR[DI]调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。④段间间接调用CALL代码段数据段IPHIPLCSHCSL[DI][DI]+1[DI]+2[DI]+3段间间接调用示意图CALLDWORDPTR[DI]例:下面的程序执行后,(AX)=?(DX)=?CS:2000HMOVAX,2012H2003HMOVCX,200CH2006HPUSHCX2007HCALL4000H200AHADDAX,BX200CHADDAX,DX200EHHLT…………CS:4000HMOVBX,200AH;BX=200AHPOPDX;DX=200CHRET段内返回指令RET的操作为:恢复子程序执行前IP的内容。段间返回指令RET的操作为:恢复子程序执行前IP和CS的内容。另有一种带立即数的返回指令“RETn”,其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。例:RET4;返回后再丢弃栈顶的4个字节(2)返回指令RET4.中断指令8086/8088CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。被中断的指令地址处称为“断点”。有关中断的详细情况将在第五章讨论。中断指令共有三条:(1)INTn执行类型n的中断服务程序,N=0~255(2)INTO执行溢出中断的中断服务程序(3)IRET从中断服务程序返回调用程序(1)INTn格式:INTn说明:n×4=向量地址。该向量地址中的内容即为中断服务程序入口地址(段:偏移),入口地址也称为“中断向量
本文标题:2章56控制0822
链接地址:https://www.777doc.com/doc-2916184 .html