




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3 2分支程序设计 3 2 1简单分支程序 程序判断条件在两个以内 对两个操作数进行算术或逻辑运算 然后根据运算后结果对标志位的影响来产生分支 其程序可采用IF THEN ELSE结构实现 简单分支如图3 1所示 1 用比较指令实现 CMPDEST SRC 比较两个操作数JEEQUL EQUL 2 用测试指令实现 TESTDEST SRC 逻辑与测试JNZONE ONE 3 用逻辑指令实现 SHRDEST CL 对DEST进行逻辑右移JCNEXT CF 1 转移到NEXT NEXT 例3 26编程实现将键盘输入的小写字母转换成大写后输出 程序流程如图3 2所示 MODELSMALL a z的ASC 码61H 7AH A Z的ASC 码41H 5AH DATABLOCKDB ERROR 0DH 0AH CODE STARTUPMOVAH 1 读键入字符INT21HCMPAL a 判字符小于 a JBNEXTCMPAL z 判字符大于 z JANEXTANDAL 11011111B 将小写字母转换MOVDL AL 成大写字母MOVAH 02 显示输出INT21HJMPDONENEXT LEADX BLOCK 非小写字母处理MOVAH 9INT21H图3 2例3 26程序流程DONE EXITEND 例编写一段程序 计算函数值 其中变量X和Y是有符号字变量 x 10 x10 DATE1SEGMENTXDW YDW DATE1ENDSCODE1SEGMENT MOVAX XCMPAX 0JGEcase23ADDAX 10JMPresult Case23 CMPAX 10JGcase3MOVBX 30IMULBXJMPresultCase3 SUBAX 190Result MOVY AX CODE1ENDS DATE1SEGMENTADW BDW CDW DATE1ENDSCODE1SEGMENT MOVAX AADDAX BJLE ELSE 小于等于0TESTC 1 C 2 0 即看C的最低位是否为0JNZ ELSEMOVA 62JMPNEXT ELSE MOVA 21NEXT CODE1ENDS 例把下列C语言的语句改写成等价的汇编语言程序段 不考虑运算过程中的溢出 其中 变量a b和c都是有符号的整型 int 变量 If a b 0 c 2 0 a 62 elsea 21 例3 27在BLOCK缓冲区中 有一个按从小到大顺序排列的无符号数的数组 数组中的第一个单元存放着数组长度 在KEYWORD单元中有一个无符号数 要求在数组中查找这一无符号数 如找到则在KEYADDR单元中给出该元素在数组中的偏移地址 如未找到则使KEYADDR单元为0 算法 本例是一个已经排序的数组 可以用折半查找法以提高查找效率 折半查找法先取有序数组的中间元素与待查找元素进行比较 如果相符则查找结束 如果待查找元素大于中间元素 则再取高半部的中间元素与待查找元素相比较 如果待查找元素小于中间元素 则再取低半部的中间元素与待查找元素相比较 如此重复直到最终查找成功或者查找不成功为止 折半查找法的效率高于顺序查找法 对于长度为N的表格 顺序查找法平均要作N 2次比较 而折半查找法的平均比较次数约为log2N SEARCH MOVADDR DI 保存起始地址MOVSI DI 取数组长度GETEVEN TESTSI 1JZADDADDR 为0表示数组长度为偶数 则转INCSI 否则 数组长度为奇数则加1ADDADDR ADDDI SI 计算折半查找地址COMPARE CMPAX DI 待查找元素和确定元素比较MOVKEYADDR DIJEDONE 等于则结束JAHIGHADDR 高于 则对高位元素折半查找CMPSI 2 数组长度为 2 JENOFINDSHRSI 1 不等于则数组长度除以2TESTSI 1JZSUBADDR 为0表示数组长度为偶数 则转INCSI 数组长度为奇数则加1SUBADDR SUBDI SI 计算查找地址JMPCOMPARE 继续查找HIGHADDR CMPSI 2 数组长度 2 JENOFIND 等于则置KEYADDR为0 并结束SHRSI 1 不等于则数组长度除以2JMPGETEVEN 继续查找NOFIND MOVKEYADDR 0 等于则置KEYADDR为0DONE EXIT 结束END 例3 27 MODELSMALL DATABLOCKDW12 11 22 33 44 55 66 77 88 99 111 222 333KEYWORDDW KEYADDRDW ADDRDW CODE STARTUPLEADI BLOCKMOVAX KEYWORD 待查找元素送到AX中CMPAX DI 2 待查找元素和第一个元素比较JALAST 高于 则比较最后一个元素LEASI DI 2 低于或等于 取第一个元素地址MOVKEYADDR SIJEDONE 等于则结束MOVKEYADDR 0 低于则置KEYADDR单元为0JMPDONE 结束LAST MOVSI DI 取数组长度SHLSI 1 数组长度乘以2ADDSI DI 形成最后一个元素地址CMPAX SI 待查找元素和最后一个元素比较JBSEARCH 低于则折半查找MOVKEYADDR SIJEDONE 等于则结束MOVKEYADDR 0 高于则置KEYADDR为0JMPDONE 结束 3 2 2复杂分支程序当程序分支太多时 利用一般分支程序方法编程 结构会变的不清晰 为了方便且高效的实现多向分支 可以采用跳转表法 图3 4多路条件判断程序流程 跳转表算法 在存储器设置一地址表 将多个分支程序的地址顺序存放在表中 以供程序在条件选择某一分支程序时使用 存储器中地址表设置如下 TABDWSUB1 或者DDSUB2SUB3 SUBn 在变量名为TAB作为首地址的表中 SUBi为第i路分支程序的标号 如果TAB定义为字类型时 存放在表中的是每一路分支程序标号的16位偏移地址 如果TAB定义为双字类型 可以表示为32位模式下的偏移地址或16位模式下的偏移地址和段基址 根据分支条件确定对应分支程序的入口地址在地址表中的位置 序号 转去执行分支程序 例3 28接收单键命令 A G 根据命令进行相应的处理 否则不作处理 程序流程如图3 5所示 MODELSMALL 586 DATATABDDLAB0 命令A处理程序地址LAB1 命令B处理程序地址 LAB6 命令G处理程序地址 CODE STARTUPMOVAH 1 接收键入字符INT21HCMPAL A 字符 A JBDONECMPAL G 字符 G JADONESUBAL A 将字符A G转变成序号0 6ANDEAX 0000000FHJMPTAB EAX 4 转不同分支程序LAB0 命令A处理程序JMPDONELAB1 命令B处理程序JMPDONELAB6 命令G处理程序DONE EXITEND 例用地址转移表实现下列C语言语句 其中变量a和b是有符号的整型 int 变量 switch a 8 case0 b 32 break case1 case2 b a 43 break case3 b 2 a break case4 b break case5 case6 case7 printf Function5 6 7 break MODELSMALL DATAADW BDW TableDWcase0 case12 case12 case3 case4 case567 case567 case567MSGDB Function5 6 7 CODE STARTUPMOVAX AMOVBX AXANDBX 7 得到BX的低3位二进制数 实现a 8的计算SHLBX 1 地址表是字类型 其下标要乘2JMPTable BX 利用地址表实现多路转移 case0 MOVB 32JMPnextCase12 ADDAX 43MOVB AXJMPnextCase3 SHLAX 1MOVB AXJMPnextCase4 DECBJMPnextCase567 LEADX MSGMOVAH 9INT21HJMPnext next EXIT END 用地址表实现多路转移的关键在于 转移入口的地址表和转移情况可整数化 如果这两个要求有一个不满足或很难构造 则无法使用该方法 3 3循环程序设计 3 3 1单重循环程序单重循环程序按照判断循环条件的流程不同可分为两类结构 一 REPEAT UNTIL结构 先执行程序再判断循环条件 至少执行一次 二 WHILE DO结构 先判断循环条件 满足循环条件才进入循环体 图3 6REPEAT UNTIL循环程序结构图3 7WHILE DO循环程序结构 例3 29REPEAT UNTIL循环结构程序实现举例 1 MOVCX COUNT 设置循环初值AGAIN 循环程序入口LOOPAGAIN 循环控制 2 MOVCL COUNT 设置循环初值AGAIN DECCL 计数器减1JNZAGAIN 循环控制 例3 30WHILE DO循环结构程序实现举例 MOVCX COUNT 设置循环初值AGAIN JCXZNEXT DECCXJMPAGAINNEXT 例3 31从键盘输入21个字符 按键入次序寻找字典顺序最大的字符 并显示输出 不区分大小写 分析 判断ASCII码值大小时 小写字符ASCII码减去20H参与比较 41H 5AH和61H 7AH MODELSMALL DATABUFDB21 21DUP BLOCKDB0AH 0DH CODE STARTUPMOVDX OFFSETBUF 键入字符串MOVAH 0AHINT21HLEABX BUF 2 BX 第一个字符地址MOVCX BUF 1 CX 字符串长度DECCXMOVAL BX 缓冲区第一个字符送ALANDAL 11011111B 小写字符ASCII码减20HMOVSI BX 缓冲区第一个字符地址送SI AGAIN INCBXMOVDL BX 缓冲区字符送DLANDDL 11011111BCMPAL DL 比较两字符大小JAENEXTXCHGAL DL 大数存AL中MOVSI BX 大数地址送SINEXT LOOPAGAINMOVDL SI 最大字符送DLMOVBLOCK 2 DLMOVDX OFFSETBLOCK 显示输出MOVAH 9INT21H EXITEND 例 把数组score的平均值 取整 存入字变量Average中 数组以负数为结束标志 modelsmall datascoredw90 95 54 65 36 78 66 0 66 22 1Averagedw0 code startupXORAX AXXORDX DX 用 DX AX 保存数组元素之和XORCX CX 用CX保存数组元素个数LEASI score 用指针SI访问整个数组 again MOVBX SI CMPBX 0JLoverADDAX BXADCDX 0 求和INCCX 计数ADDSI 2 地址增量JMPagainover JCXZexit 防止零作除数 空数组 DIVCX 求平均值MOVAverage AXexit EXITEND 例3 32在BLOCK缓冲区中存放着未经排序的字数组 在数组的第一个字中存放着该数组的长度 在KEYWORD单元中存放着一个数 试编制一程序 在数组中查找该数 如果找到该数则把它从数组中删除 算法 未排序的数组 只能用顺序查找法 用串扫描指令 要找的元素 无 结束程序 有 在末尾 仅修改数组长度 不在末尾 高地址元素向低地址元素移动一个字 并修改数组长度 例3 32程序如下 MODELSMALL DATABLOCKDW08H 22H 55H 99H 44H 20H 56H 78H 52HKEYWORDDW CODE STARTUPMOVAX DATAMOVES AXLEADI BLOCKMOVAX KEYWORD 欲查找的关键字CLDMOVCX DI 取数组长度ADDDI 2 指向数组第一个元素 REPNESCASW 查找数组中是否有删除元素 AX ES DI DI DI 2 CX CX 1 JEDELETEJMPDONE 未找到删除字则结束DELETE JCXZDELLAST 找到要删除的元素为末尾元素 直接删除LP MOVBX DI 找到要删除的元素为中间元素 高位元素依次低移SUBDI 2MOV DI BXADDDI 4LOOPLPDELLAST DECBLOCK 删除该元素 数组长度减1DONE EXITEND 例3 33将正数N插入一个按递增排列的正数的字数组的正确位置 该数组的首地址和末地址分别为HEAD和REAR 算法 1 因为数组长度是确定的 因此找到插入位置作为循环的结束条件 2 从数组的尾部向头部查找 逐字取出数组中的一个数与插入元素作比较 三种可能性 如果插入元素大于数组中所有数 则插入到最后 如果插入元素小于本次比较的数组元素 则把本次比较的数组元素向地址增大的方向移动一个字 然后继续查找 如果插入元素小于数组中的所有数 通过在STOP单元中存放 1 这个数来结束循环 因为插入元素为正数 从数组的尾部向头部查找 有三种可能性 如果插入元素大于数组中所有数 则第一次比较就可以结束循环 如果插入元素小于本次比较的数组元素 则把本次比较的数组元素向地址增大的方向移动一个字 然后继续查找 直到插入元素大于数组中本次比较的元素 则把元素插入其地址高位 结束程序 为了空出要插入元素的位置 其地址高位的全部元素 都应向地址增大的方向移动一个字 如果插入元素小于数组中的所有数 通过在STOP单元中存放 1 这个数来结束循环 因为插入元素为正数 那它必然大于 1 例3 33程序如下 MODELSMALL DATASTOPDW0FFFFH 1的补码 作为插入元素小于数组中所有元素时循环结束的条件HEADDW1 3 5 35 56 65 88REARDW108 108是最尾部的元素NUMDW35 欲插入元素 CODE STARTUP MOVAX NUMMOVDI 0COMPARE CMPAX REAR DI 插入元素和高地址元素开始比较JGEINSERTWORD 大于等于MOVBX REAR DI 插入元素 高地址元素 则向地址增大方向移动一个字MOVREAR DI 2 BXSUBDI 2JMPCOMPAREINSERTWORD MOVREAR DI 2 AX 在数组中插入元素 EXITEND 例3 34设有数组X和Y X数组中有X1 X10 Y数组中有Y1 Y10 试编制程序计算 Z1 X1 Y1Z5 X5 Y5Z8 X8 Y8Z2 X2 Y2Z6 X6 Y6Z9 X9 Y9Z3 X3 Y3Z7 X7 Y7Z10 X10 Y10Z4 X4 Y4结果存入Z数组 这类问题 也可用循环程序结构来完成 已知循环计数值为10 每次循环有两种操作 加法和减法 可以设立标志位 如标志位为0做加法 为1则做减法 做10次操作设立10个标志位 放在一个存储单元LOGIC RULE中 这种存储单元一般称为逻辑尺 本例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床科室实习管理制度
- vocs安全管理制度
- 仓库现场组长管理制度
- 仓库物品预警管理制度
- yy工会ow管理制度
- 项目部电子文档管理制度
- 乡村参观接待管理制度
- 五金企业营销管理制度
- b站公司员工管理制度
- 人行支付结算管理制度
- 义务教育英语课程标准(2022年版)知识点汇总
- 普通货物运输安全管理制度(全套)
- 义务教育英语课程标准(2022年版)知识点汇总
- 溢流坝模板工程专项方案
- 监理旁站方案
- YY/T 1155-2019全自动发光免疫分析仪
- GB/T 9855-2008化学试剂一水合柠檬酸(柠檬酸)
- GB/T 5211.5-2008颜料耐性测定法
- 第十九章.40年代诗歌
- GB/T 17362-2008黄金制品的扫描电镜X射线能谱分析方法
- GA 1800.1-2021电力系统治安反恐防范要求第1部分:电网企业
评论
0/150
提交评论