汇编语言第十五次课_第1页
汇编语言第十五次课_第2页
汇编语言第十五次课_第3页
汇编语言第十五次课_第4页
汇编语言第十五次课_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第5章循环与分支程序设计 5 2分支程序设计 分支程序根据条件是真或假决定执行与否判断的条件是各种指令 如CMP TEST等执行后形成的状态标志 1 双分支结构典型的双分支结构程序的流程图 条件成立跳转执行第2个分支语句体 否则顺序执行第1个分支语句体 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后 第5章循环与分支程序设计 条件成立跳转 否则顺序执行分支语句体 注意选择正确的条件转移指令和转移目标地址 第5章循环与分支程序设计 第5章循环与分支程序设计 例 设存储单元A和B各有一无符号数 比较其大小 将较大数送A单元 DATASEGMENTADB39HBDB0B4HDATAENDSCODESEGMENTASSUMECS CODE DS DATA 第5章循环与分支程序设计 START MOVAX DATAMOVDS AXMOVAL ACMPAL BJNC JAENEXTXCHGAL BMOVA ALNEXT MOVAH 4CHINT21HCODEENDSENDSTART JC JBNEXTJMPEXITNEXT XCHGAL BMOVA AL 5 2分支程序设计 2 多分支程序设计多个条件对应各自的分支语句体 哪个条件成立就转入相应分支体执行 多分支可以化解为双分支或单分支结构的组合 例如 cmpah 0jzfunction0 ah 0 转向function0cmpah 1jzfunction1 ah 1 转向function1cmpah 2jzfunction2 ah 2 转向function2 第5章循环与分支程序设计 例 计算符号函数的值已知符号函数SNG X 的值Y有DATASEGMENTXDB0B9HYDB DATAENDSCODESEGMENTASSUMECS CODE DS DATA 第5章循环与分支程序设计 START MOVAX DATAMOVDS AXMOVAL XCMPAL 0JLNEXT1CMPAL 0JGNEXT2MOVY 0JMPRESNEXT1 MOVY 0FFHJMPRESNEXT2 MOVY 1 RES MOVAH 4CHINT21HCODEENDSENDSTART datasegmentarraydw12 11 22 33 44 55 66dw77 88 99 111 222 333numberdw55low idxdw high idxdw dataends 例 折半查找算法 在数据段中 有一个按从小到大顺序排列的无符号数字数组ARRAY 数组中的第一个单元存放着数组的长度 在AX中有一个无符号数 要求在数组中查找number 如果找到 则使CF 0 并在SI中给出该元素在数组中的偏移地址 如未找到 则使CF 1 12112233445566778899111222333 0123456789101112 si 0ahCf 0 si 10hCf 1 折半算法 第5章循环与分支程序设计 在一个长度为n的有序数组r中 查找元素k的折半查找算法可描述如下 1 初始化被查找数组的首尾下标 low 1 high n 2 若low high 则查找失败 置CF 1 退出程序 否则 计算中点mid low high 2 3 k与中点元素r mid 比较 若k r mid 则查找成功 程序结束 若kr mid 则转 5 4 低半部分查找 high mid 1 返回 2 继续查找 5 高半部分查找 low mid 1 返回 2 继续查找 地址跳跃表 值与地址有对应关系的表 例 根据AL寄存器中哪一位为1 从低位到高位 把程序转移到8个不同的程序分支 branch tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8 cmpal 0 AL为逻辑尺jecontinueleabx branch tableL shral 1 逻辑右移jncadd1jmpwordptr bx 段内间接转移add1 addbx typebranch table addbx 2jmpLcontinue routine1 routine2 寄存器间接寻址 cmpal 0jecontinuemovsi 0L shral 1 逻辑右移jncadd1jmpbranch table si 段内间接转移add1 addsi typebranch tablejmpLcontinue routine1 routine2 寄存器相对寻址 cmpal 0jecontinueleabx branch tablemovsi 7 typebranch tablemovcx 8L shlal 1 逻辑左移jncsub1jmpwordptr bx si 段内间接转移sub1 subsi typebranch table si 2loopLcontinue routine1 routine2 基址变址寻址 第6章子程序结构把功能相对独立的程序段单独编写和调试 作为一个相对独立的模块供程序使用 就形成子程序子程序可以实现源程序的模块化 可简化源程序结构 可以提高编程效率 6 1子程序的设计方法 6 1子程序的设计方法1 过程定义伪操作过程名 子程序名 为符合语法的标识符NEAR属性 段内近调用 的过程只能被相同代码段的其他程序调用 主程序和子程序在同一代码段FAR属性 段间远调用 的过程可以被相同或不同代码段的程序调用 主程序和子程序不在同一代码段 过程名PROC NEAR FAR 过程名ENDP 6 1子程序的设计方法 子程序调用方法说明一个子程序可以供多个用户编写的主程序调用 在不了解子程序内部算法的前提下能够很好地使用子程序也是子程序应具备的特性 一个完整的子程序 应包括子程序调用方法说明 主要包括以下6个方面内容 1 子程序名 供调用子程序时使用 2 子程序功能 供选择子程序时参考 3 占用寄存器 说明子程序执行时 要使用哪些寄存器 子程序执行完后 哪些寄存器的内容被改变 哪些寄存器的内容保持不变 4 入口参数 说明子程序执行应具备的条件 5 输出参数 说明子程序执行后的结果存放在何处 6 子程序调用示例 说明子程序的调用格式 6 1子程序的设计方法 子程序的调用与返回子程序调用 隐含使用堆栈保存返回地址 callnearptrsubp 1 保存返回地址 2 转子程序callfarptrsubp 1 保存返回地址 2 转子程序子程序返回 ret 6 1子程序的设计方法 3 保存与恢复寄存器一般通过堆栈来实现 主要在子程序中进行 例如 子程序subt中用到了寄存器ax bx cx和dx 则可能的保存与恢复寄存器如左 subtprocfarpushaxpushbxpushcxpushdx popdxpopcxpopbxpopaxretsubtendp 6 1子程序的设计方法 4 子程序的参数传送入口参数 输入参数 主程序提供给子程序出口参数 输出参数 子程序返回给主程序参数的形式 数据本身 传值 数据的地址 传址 传递的方法 寄存器 变量 堆栈 6 1子程序的设计方法 1 通过寄存器传送参数最常用的一种方式 但能传递的参数有限 适合于参数较少的情况 需要注意 用于传递出口参数的寄存器不能进行现场保护和恢复 6 1子程序的设计方法 例1 写一个大写字母改写为小写字母的子程序 子程序名 UPTOLW 功能 把大写字母转换为小写字母 入口参数 AL 字符ASCII码 出口参数 AL 字符ASCII码 说明 如果字符是大写字母 遇到转成小写字母 其他字符不变 UPTOLWPROCPUSHFCMPAL A JBUPTOLW1CMPAL Z JAUPTOLW1ADDAL 20HUPTOLW1 POPFRETUPTOLWENDP 6 1子程序的设计方法 例2写一个判别字符是否为数字字符的子程序 并利用子程序把一个字符串的所有数字字符删除DSEGSEGMENTSTRINGDB AB C950 asd 0DSEGSEGMENTCSEGSEGMENTASSUMECS CSEG DS DSEGISDECMPROC 略 ISDECMENDPSTART MOVAX DSEGMOVDS AXMOVSI OFFSETSTRINGMOVDI SI NEXT MOVAL SI INCSIORAL ALJZOK 判断是否为0CALLISDECMJNCNEXTMOV DI ALINCDIJMPNEXTOK MOV DI ALMOVAH 4CHINT21HCSEGENDSENDSTART 6 1子程序的设计方法 子程序ISDECM及其调用说明如下 子程序名 ISDECM 功能 判别一个字符是否为数字符 入口参数 AL 字符 出口参数 CF为0表示字符是数字符 否则为非数字ISDECMPROCCMPAL 0 JBISDECM1CMPAL 9 JAISDECM1CLCRETISDECM1 STCRETISDECMENDP 6 1子程序的设计方法 2 利用约定存储单元传递参数在传递参数较多的情况下 可利用约定的内存变量来传递参数例3写一个实现32位数相加的子程序 子程序名MADD 功能 32为数相加 入口参数 DATA1和DATA2缓冲区中分别存放要相加的32位数 出口参数 DATA3缓冲区中存放结果 说明 1 32位数存放次序采用 高高低低 原则 2 可能产生的进位存放在DATA3开始的第5字节中 6 1子程序的设计方法 MADDPROCPUSHAXPUSHCXPUSHSIMOVCX 2XORSI SIMADD1 MOVAX WORDPTRDATA1 SI ADCAX WORDPTRDATA2 SI MOVWORDPTRDATA3 SI AXINCSIINCSILOOPMADD1 MOVAL 0ADCAL 0MOVBYTEPTRDATA3 4 ALPOPSIPOPCXPOPAXRETMADDENDP 6 1子程序的设计方法 3 利用堆栈传递参数用堆栈传递入口参数 在调用子程序之前 把需要的参数依次压入堆栈 子程序从堆栈中取入口参数 如果用堆栈传递出口参数 子程序返回前 把需要返回的参数存入堆栈 主程序在堆栈中取出口参数例 写一个测量字符串长度的子程序 设字符串以0为结束标志 子程序名 STRLEN 功能 测量字符串的长度 入口参数 字符串起始地址的段值和偏移在堆栈中 出口参数 AX 字符串长度 6 1子程序的设计方法 STRLENPROCPUSHBPMOVBP SPPUSHDSPUSHSIMOVDS BP 6 MOVSI BP 4 MOVAL 0STRLEN1 CMPAL SI JZSTRLEN2INCSIJMPSTRLENSTRLEN2 MOVAX SISUBAX BP 4 POPSIPOPDSPOPBPRETSTRLENENDP主程序调用这个子程序的代码片段STRMESSDB MOVAX SEGSTRMESSPUSHAXMOVAX OFFSETSTRMESSPUSHAXCALLSTRLENADDSP 4 清栈里的段值 偏移值MOVLEN AX 6 1子程序的设计方法 例 写一个程序 它用二进制数形式显示所按键的ASCII码CSEGSEGMENTASSUMECS CSEG DS CSEGSTART MOVAH 1INT21HCALLNEWLINEMOVBL ALMOVCX 8NEXT SHLBL 1MOVDL 30HADCDL 0MOVAH 2INT21HLOOPNEXT MOVDL B MOVAH 2INT21HMOVAH 4CHINT21HCSEGENDSENDSTART 6 1子程序的设计方法 子程序 NWELINE 功能 回车和换行 光标移到下一行首 入口参数 无 出口参数 无 说明 通过显示回车符形成回车 通过显示换行符形成换行NEWLINEPROCPUSHAXPUSHDXMOVDL 0DH 显示回车符MOVAH 2INT21H MOVDL 0AH 显示换行符MOVAH 2INT21HPOPDXPOPAXRETNEWLINEENDP 6 2子程序的嵌套 1 子程序的嵌套子程序也可以作为调用程序去调用另一个子程序 这种情况就称为子程序的嵌套 嵌

温馨提示

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

评论

0/150

提交评论