现代微机原理与接口技术ppt课件_第1页
现代微机原理与接口技术ppt课件_第2页
现代微机原理与接口技术ppt课件_第3页
现代微机原理与接口技术ppt课件_第4页
现代微机原理与接口技术ppt课件_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第3章80 x86汇编语言程序设计(下),2,分支结构是指计算机根据实际情况或条件,作出判断和选择,转而执行不同的程序段的一种程序结构。,条件,程序段,条件,程序段A,程序段B,Y,N,Y,N,3.5分支结构程序设计,3,多路分支结构根据某个控制字的各“位”状态实行多路转移,多路条件测试,程序段1,程序段2,程序段n,4,3.5.1无条件转移指令JMP,1、段内转移,格式1:JMPSHORTOPR;段内相对短转移操作1:IP-(IP)+disp8说明:转移范围-128字节至+127字节,操作数OPR为段内某个标号。,段内相对短转移示例指令JMPSHORTADDT存放在CS:0200H中,标号ADDT对于IP指针的偏移量为1DH,则转移地址为0202H+001DH=021FHJMPSHORTADDT0200E811DADDT:MOVAL,40H2ADDAL,BL+1DH021FB002201D,5,格式2:JMPOPRJMPNEARPTROPR;段内相对近转移操作2:IP-(IP)+disp16说明:转移范围-32KB至+32KB,操作数OPR为段内某个标号。,格式3:JMPWORDPTROPR;段内间接转移操作3:IPSI.JMPWORDPTRSI;转移到CS:2000,6,2、段间转移,格式4:JMPFARPTROPR;段间直接转移操作4:IP-OAoprCS-(CS)opr,段间直接转移示例50新IP=0250H;代码段C10200新CS=2000HJMPFARPTRNEXT20;代码段C2C2段20000HNEXT:MOVAL,10HNEXT20250H,EAOP码,C1段,7,格式5:JMPDWORDPTROPR;段间间接转移操作5:IP-(DS)*16+OPR)CS=BJAEZF=1或JGESF=OFJNBCF=0JNL或ZF=1AOFJNAEJNGE且ZF=0AOFJNACF=1JNG或ZF=1,11,条件转移指令示例1将X中十六进制的ASCII码转换成其所对应的数值,存放到HEX中。如A应转换为10。,MOVAH,XCMPAH,39HJBENEXT;39H则转SUBAH,7;是A-F,减7NEXT:SUBAH,30H;减30HMOVHEX,AH,注意ASCII中09是30H39H,AF是41H46H,12,条件转移指令示例2CMPAX,0FFFFHJLEP3CMPAX,1JLP2MOVAX,1JMPDONEP2:MOVAX,0JMPDONEP3:MOVAX,-1DONE:,AX(-1),AX1,AX-1,AX-0,AX-(-1),Y,N,N,Y,如果条件转移目标地址超出-128+127的范围怎么办?,13,1、比较/转移利用比较和条件转移指令实现两路分支。比较结果记录在某些标志位中,条件转移指令根据约定的条件进行对照,满足条件时转移,不满足条件时不转移。,2、跳转表转移利用跳转表实现多路分支。比较/转移指令可嵌套,但程序结构复杂,跳转表可使程序结构清晰。,3.5.3分支结构程序设计,教材上的例子请看P99中的例3.18和例3.19,上机实现例3.18程序。,14,有一个首地址为ARRAY的N字数组,将其中正数的个数放在DI中,0的个数放在SI中,负数个数放在AX中,注意:负数个数=N-DI-SI,15,MOVCX,NMOVBX,0;初始化MOVDI,BX;正数个数计数器初始化MOVSI,BX;0的个数计数器初始化AGAIN:CMPWORRDPTRARRAYBX,0;数组当前元素与0比较JLELEEQ;小于等于0转移INCDI;正数计数JMPNEXTLEEQ:JLNEXT;小于0转移INCSI;0计数NEXT:ADDBX,2;数组表指针指向下一元素DECCXJNZAGAINMOVAX,N;负数个数=N-DI-SISUBAX,DISUBAX,SI,16,设字节单元N1、N2中存放无符号数(1)若两个均是偶数,则分别加1后送D1、D2中(2)若两个均是奇数,则直接送D1、D2中(3)若一个是奇数,一个是偶数,则把奇数送D1,偶数送D2中,AL-(N1),AH-(N2),(AL)0=0,(AH)0=0,AL-(AL)+1AH-(AH)+1,(AL)(AH),D1(ES:DI+2)转LEASI,ES:DI+2JEEXIT;相等,找到,就是第一个数STC;小于第一个数,失败JMPEXITCHK_LAST:MOVSI,ES:DI;取数组长度SHLSI,1;长度*2(DW型)ADDSI,DICMPAX,ES:SI;与最后的数比较JBSEARCH;小于则转JEEXIT;相等则结束STC;大于最后一个,失败JMPEXIT,23,SEARCH:MOVLOW_IDX,1;给LOW赋初值MOVBX,ES:DI;取数组长度MOVHIGH_IDX,BX;给HIGH赋初值MOVBX,DI;BX中放首地址MID:MOVCX,LOW_IDXMOVDX,HIGH_IDXCMPCX,DXJANO_MATCH;LOWHIGH,失败ADDCX,DXSHRCX,1;折半MOVSI,CXSHLSI,1;*2(DW型)COMPARE:CMPAX,ES:BX+SI;与中间数比较JEEXIT;相等,找到,24,JAHIGHER;大于中间数,转DECCXMOVHIGH_IDX,CX;调整查找区间到前半部分JMPMIDHIGHER:INCCXMOVLOW_IDX,CX;调整查找区间到后半部分JMPMIDNO_MATCH:STCEXIT:,25,任务需要重复执行某一程序段,这种情况采用循环结构来实现。,初始化,循环体,初始化,修改部分,N,Y,Y,N,修改部分,控制部分,循环体,控制部分,3.6循环结构程序设计,26,3.6.1循环指令格式:指令码标号;(CX中存放循环次数)操作符操作功能LOOPCX0,则循环LOOPZCX0且ZF=1,则循环相等时循环LOOPNZCX0且ZF=0,则循环不相等时循环,27,循环指令示例1求长度为10的字节数组ARRAY之和,并将和存入TOTAL中,其中语句LOOPAGAIN相当于:DECCXJNZAGAIN,LEASI,ARRAY;数组首地址-SIMOVCX,10;数组长度-CXMOVAX,0AGAIN:ADDAL,SI;求数组和ADCAH,0INCSI;修改指针LOOPAGAINMOVTOTAL,AX;存和,28,SUBBX,DI;串长度在BX中INCBXMOVCX,BX;串字节数-CXDECDIAGAIN:INCDI;修改指针CMPBYTEPTRDI,0;串元素=0?LOOPZAGAIN;循环查找JNZFOUND;找到非0字节跳转FOUND:,循环指令示例2在某一字节串中寻找第一个非0字节设串首地址在DI中,串末地址在BX中,29,串存储器中一序列字或字节单元,单元中的内容是字符或数据串操作对序列字或字节单元中的内容进行某种操作,串操作指令有7条:1、MOVS串传送指令2、CMPS串比较指令3、SCAS串扫描指令4、LODS装入串指令5、STOS存储串指令,6、INS串输入7、OUTS串输出,3.6.2串操作指令,30,与此配合使用的指令前缀有:REP重复REPE/REPZ相等/为零则重复REPNE/REPNZ不相等/不为零则重复,说明:每条指令有三种形式,分别对应于字节操作、字操作和双字操作如MOVSB字节操作MOVSW字操作MOVSD双字操作,31,例:将字节串从源区传送到目的区,源区首偏址-SI目的区首偏址-DI,串长-CX,CX=0,按DI所指存此字节,按SI所指取一字节,(SI)+1-SI,(DI)+1-DI,(CX)-1-CX,结束,Y,N,用一般传送指令实现的流程图,32,源区首偏址-SI目的区首偏址-DI串长-CX,0-DF,CX=0,串传送指令,(CX)-1-CX,结束,源区首偏址-SI目的区首偏址-DI串长-CX,0-DF,带前缀REP的串传送指令,Y,N,用串传送指令实现的流程图,用带前缀的串传送指令实现的流程图,33,使用串操作指令时微处理器设计有若干约定:,1、源串地址由DS:SI指定目的串地址在ES:DI中,2、串长送CX寄存器,3、设置方向标志位DF(在EFLAG寄存器中)当DF=0(指令CLD)时地址为增量修改(+1或+2或+4)当DF=1(指令STD)时地址为减量修改(-1或2或-4),34,方向标志对应的指针移动示意低地址方向A.源串AJ高地址方向,目的串,源串,目的串,1,n,n,.,正向传送反向传送DF=0DF=1,1,J,35,符号功能操作相关前缀MOVS串传送ES:DI-(DS:SI)REPSI-(SI)(+/-)1DI-(DI)(+/-)1CMPS串比较(DS:SI)-(ES:DI)REPZ/REPNZSI-(SI)(+/-)1DI-(DI)(+/-)1SCAS串扫描(ES:DI)-(AL)REPZ/REPNZDI-(DI)(+/-)1LODS装入串AL-(DS:SI)一般不联用SI-(SI)(+/-)1STOS存入串(ES:DI)-(AL)REPDI-(DI)(+/-)1,36,符号功能操作相关前缀INS串输入ES:DI(DX)REPDI(DI)(+/-)1OUTS串输出(DX)(DS:SI)REPSI(SI)(+/-)1,其中DX寄存器中存放的是接口电路的端口号,37,重复前缀终止条件否则REPCX=0CX-(CX)-1,继续SI,DI指向下一元素REPZCX=0或ZF=0CXDIMOVCX,4;重复次数-CXREPZCMPSB;重复比较JZNEXT;串相等转移.NEXT:,41,SCAS指令示例在串“ThatisCAI”中查找字符a,找到,则转到标号FOUND处,StringDBThatisCAI;定义串CLD;DF=0LEADI,String;串地址-DIMOVAL,a;查找字符-ALMOVCX,11;重复次数-CXREPNZSCASB;重复扫描JZFOUND;找到目的串元素转移FOUND:,42,LEASI,SOURCE;源串偏移量-SILEADI,DESTIN;目的串偏移量-DICLD;DF=0MOVCX,100;重复比较次数-CXREPZCMPSB;重复串比较JCXZMATCH;没有不匹配元素跳转DECSI;指向不匹配元素LODSB;装入不匹配元素到AL.MATCH:,LODS指令示例比较SOURCE和DESTIN(串长度为100个字节),并将串中的第一个不匹配元素装入AL寄存器中。,43,STOS指令示例给首地址为BUF,长度为1000个字节的存储器区域清零。,BUFFDB1000DUP(?);定义缓冲区CLD;DF=0LEADI,BUFF;缓冲区首地址-DIMOVCX,1000;重复次数MOVAL,0;0-ALREPSTOSB;重复存储串,44,综合应用例1将存储区A到A+i中的数据传送到存储区B到B+i中,要求存放的顺序与原先的顺序相反。,Aa+1b+2cA+i,B+1+2bB+ia,45,LEASI,ALEADI,BADDDI,I;DI指向存储区B的末尾MOVCX,I+1;串的长度LP:CLD;DF=0LODSB;从源区取一数据STD;DF=1,改变方向STOSB;存入目的区DECCXJNZLP,46,循环程序的组成:1、初始化部分设置初始值2、循环工作部分具体的操作和运算3、循环修改部分为执行下一循环而修改某些参数4、循环控制部分判断循环继续还是结束,循环控制方法有:(1)计数控制法增数法减数法(2)条件控制法,3.6.3循环结构程序设计,47,单重循环程序设计将以s1为起始地址的26个字母依次传送到以s2为起始地址的连续单元中。数据定义如下:.DATAS1DBABCDXYZ.DATAESTRAS2DB26DUP(?),48,方法1采用寄存器间接寻址方式MOVAX,SEGS1;初始化部分MOVDS,AXMOVAX,SEGS2MOVES,AXMOVSI,OFFSETS1MOVDI,OFFSETS2MOVCX,26LOP1:MOVAL,SI;工作部分MOVES:DI,ALINCSI;修改部分INCDILOOPLOP1;控制部分,49,方法2采用串处理指令MOVAX,SEGS1;初始化部分MOVDS,AXMOVAX,SEGS2MOVES,AXLEASI,S1LEADI,S2MOVCX,26CLDREPMOVSB;工作、修改、控制合为一条指令,50,计数控制法计数控制法适用于循环次数已知的场合,2、减数法初始化时循环计数器置为循环次数,每执行一次循环体后计数器减1,并测试循环计数器是否为0,如为0则终止循环。减数法一般用循环指令形成循环回路。,1、增数法初始化时循环计数器置0,每执行一次循环体后计数器加1,并与已知的循环次数比较,如相等则退出循环。增数法一般用比较指令和条件转移指令实现循环转移。,51,NUMDW1;.MOVCX,0;初始化MOVAX,0ROTATE:ADDAX,NUM;累加INCWORDPTRNUMINCCX;计数器加1CMPCX,50;与已知的循环次数比较JNZROTATEMOVS,AX.,增数法计算S=1+2+3+50,结果存入AX中,如何做N阶乘N!,52,减数法将内存中6个十进制数的ASCII码转换为非压缩BCD码,并存放在后继相应单元中,如错,存放0FFH。,ASCBUFDB35H,38H,30H,4DH,39H,32HDB6DUP(?).MOVDIOFFSETASCBUFMOVCX,6LAB_1:MOVBL,0FFH;设置错误标志MOVAL,DICMPAL,3AHJNBOK;大于等于3A则错SUBAL,30HJCOK;小于30H也错MOVBL,AL,OK:MOVAL,BLMOVDI+06H,ALINCDILOOPLAB1.,53,条件控制法在许多情况下,事先无法确定循环次数,这时可选用“条件”来控制循环。在问题的求解过程中,找出一个终止循环的条件。每循环一次,对条件进行一次检测,如满足终止循环的条件,便退出循环,否则继续循环。利用条件转移指令控制循环是否结束。有些情况下为防止死循环,可以附加一个合适的循环次数。,54,条件控制法求字符串长度。从STRN地址开始有一个字符串,以$作为结束标志,长度不超过100个字节,要求统计该字符串长度并存于LENG单元。分析:1)设DX存放统计的串长度,为防止程序死循环,可根据串长不超过100作为循环结束的附加条件。2)如果程序运行过程中找到$则正常退出循环,如找不到$,由于CX的初值为100,故不会使程序死循环。,定义数据段如下:.DATASTRNDBXCVFATTDEQJHI,$LENGDB0,55,MOVAX,0MOVDX,AX;DX清零LEADI,STRN;串指针赋初值MOVCX,100;初始值为100MOVAL,$LP:CMPAL,DIJEDONE;条件控制INCDX;串长+1INCDI;串指针后移一个字节LOOPLP;附加条件DONE:MOVLENG,DL;存字符串长度,56,多重循环程序设计多重循环就其本质而言,就是循环层1包含循环层2,循环层2可能又包含循环层3,循环层1为最外层,内层循环是外层循环的循环体的一部分。,57,多重循环程序设计,如果多重循环都使用LOOP语句,则要保护好外层循环的计数器CX,通常采用压栈或退栈的方法或者转存的方法。,58,有一个首地址为A的N字数组,使该数组中的数从大到小排序,MOVCX,NDECCXLOOP1:MOVDI,CX;暂存外循环计数值MOVBX,0LOOP2:MOVAX,ABXCMPAX,ABX+2;比较a(i)与a(i+1)JGECOTINUEXCHGAX,ABX+2;交换MOVABX,AXCOTINUE:ADDBX,2LOOPLOOP2MOVCX,DI;恢复外循环计数值LOOPLOOP1,冒泡排序法,59,3.7子程序设计,子程序调用(返回)指令过程定义伪指令子程序的调用和返回主程序与子程序的连接子程序调用中的数据保护与恢复主程序与子程序之间的参数传递子程序嵌套与递归,60,3.7.1子程序调用(返回)指令,格式1:CALL子程序名;段内直接调用操作1:SP-(SP)-2(SP)+1,(SP)-(IP)IP-(IP)+disp16,格式2:CALLreg/me

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论