程序设计高级汇编技术待修改.ppt

上传人:sh****n 文档编号:6829489 上传时间:2020-03-05 格式:PPT 页数:31 大小:335.84KB
返回 下载 相关 举报
程序设计高级汇编技术待修改.ppt_第1页
第1页 / 共31页
程序设计高级汇编技术待修改.ppt_第2页
第2页 / 共31页
程序设计高级汇编技术待修改.ppt_第3页
第3页 / 共31页
点击查看更多>>
资源描述
3 5汇编语言程序设计 指令或语句就是告诉计算机为完成某一计算步骤需要执行的操作 程序是为了求解某个问题所必须的完整的指令序列或语句串加上必要的数据 程序设计是编写程序的过程 当在设计一个程序时 应该考虑满足以下目标 1 程序的正确性 2 增强程序的可读性 3 所写程序应该是结构化的 易修改 易调试 即程序的可维护性 2 程序的基本结构程序是指令 语句 的有序集合 是对系统任务处理步骤的描述 程序的执行是有一定顺序的 依据执行顺序可将程序分为如下基本结构 顺序结构 分支 选择 结构 循环结构和子程序结构 1 顺序结构 按语句先后次序执行一系列顺序操作 2 分支结构 也叫条件选择结构 根据不同情况做出判断和选择 以便执行不同的程序段 3 循环结构 循环实际上是分支结构的一种扩展 循环是否继续是依靠条件判断语句来完成的 按照条件判断的位置 可以把循环分为 当型循环 和 直到型循环 每个结构只有一个入口和出口 3种结构可以任意组合和嵌套构成结构化的程序 3 3 5 1顺序结构程序设计顺序结构程序从执行开始到最后一条指令为止 指令指针IP中的内容呈线性增加 设计这种程序只要遵照算法步骤依次写出相应的指令即可 顺序结构程序设计时 主要考虑如何选择简单有效的算法 如何选择存储单元和工作单元 4 例从键盘输入一个小写英文字母 将其转换成大写英文字母后在屏幕上显示出来 分析 利用DOS功能调用INT21H指令实现 键盘输入一个字符可用01H调用 屏幕上显示字符可用02H调用 从ASCII码表中可知 将小写字母转换成大写字母只要将其ASCII码减去32即可 为简化程序设计 假设从键盘输入的字符一定是小写字母 5 STACKSEGMENTSTACK 定义堆栈段DB100DUP 开辟100个存储单元STACKENDS 堆栈段结束CODESEGMENT 定义代码段ASSUMECS CODE SS STACKSTART MOVAH 01H 1号调用 从键盘输入一字符存入ALINT21HSUBAL 20H 将AL中字符的ASCII码减去20H变成大写字母MOVDL AL 结果送DLMOVAH 02H 2号调用 在屏幕上显示DL中的内容INT21HMOVAH 4CH 返回DOSINT21HCODEENDS 代码段结束ENDSTART 程序汇编结束 注意 复制时候标点符号修改 英文输入法 6 3 5 2分支结构程序设计分支程序的结构可以有两种形式 双分支结构多分支结构 例 已知在内存中有一个字节单元X 存有带符号数据 要求计算出它的绝对值后 放入RESULT单元中 分析 根据数学中绝对值的概念知道 一个正数的绝对值是它本身 而一个负数的绝对值是它的相反数 要计算一个数的相反数 需要完成减法运算 即用0减去这个数 8086指令系统中有专门的求相反数的指令NEG 源程序设计如下 DATASEGMENTXDB 25 定义变量RESULTDB 定义结果保存单元DATAENDSCODESEGMENTASSUMEDS DATA CS CODESTART MOVAX DATAMOVDS AX 初始化DSMOVAL X X取到AL中TESTAL 80H 测试AL正负JZNEXT 为正 转NEXTNEGAL 否则AL求补NEXT MOVRESULT AL 送结果MOVAH 4CHINT21H 返回DOSCODEENDSENDSTART 汇编结束 9 例 设变量X为带符号整数 试编写一个程序 完成下面的分段函数计算 题目分析 为实现分段函数计算 先利用上一个例题求出X的绝对值 然后根据X绝对值判断Y取值 程序段如下 AL送Y单元 1 X送AL 0送AL AL大于等于5 开始 将X取到AL中 AL中的内容求绝对值 结束 10 DATASEGMENTXDB 36YDB DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVAL XCMPAL 0JGENEXT 为正 转NEXTNEGAL AL中的内容求补NEXT CMPAL 5 X 和5比较JGEP1 5 转P1MOVAL 1 否则1送ALMOVBL X X送BL中SUBAL BL 结果送AL中JMPEXIT 转EXITP1 MOVAL 0 0送AL中EXIT MOVY AL 结果送Y单元MOVAH 4CHINT21H 返回DOSCODEENDSENDSTART 汇编结束 例 设计一个程序 统计在内存W单元保存的无符号字变量中有多少个二进制 1 统计结果送内存N单元保存 分析 要统计内存W单元保存的无符号字变量中有多少个二进制 1 可以将该数据送寄存器AX中 通过移位指令将AX中的每一位依次移入进位标志CF中 若CF 1则计数器CL的值加1 这样就可以统计出AX中1的个数 设计源程序如下 DATASEGMENTWDW00FFH 定义字数据NDB 定义结果保存单元DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATA 初始化DSMOVDS AXMOVCL 0 计数器清零MOVAX W 取数到AXAA ANDAX AX 逻辑与 判AX 0 JZCC 结果为0转移到CCSHLAX 1 逻辑左移1位JNCBB 无进位转BBINCCL 有 1 则计数BB JMPAA 无条件转AACC MOVN CL 结果送N单元MOVAH 4CH 返回DOSINT21HCODEENDSENDSTART 汇编结束 13 3 5 3循环结构程序设计1 循环程序的基本组成循环结构程序主要由以下4个部分组成 1 初始化部分 2 循环体 3 参数修改部分 4 循环控制部分 14 2 单循环程序设计 例 编程完成求1 50之间自然数中奇数之累加和 结果送RESULT单元中 该题属于循环次数已知 即将50以内的25个奇数进行累加和计算 可采用递增计数法来实现求累加和 程序设计如下 15 DATASEGMENTRESULTDW 定义结果保存单元CNEQU25 定义计数次数变量DATAENDSCODESEGMENTASSUMEDS DATA CS CODESTART MOVAX DATAMOVDS AX 初始化DSMOVAX 0 循环初始化MOVCX CNMOVBX 1NEXT ADDAX BX 求累加和ADDBX 2 BX BX 2LOOPNEXT CX 1 0转NEXTMOVRESULT AX 计算完毕保存结果MOVAH 4CHINT21H 程序结束CODEENDSENDSTART 汇编结束 16 例 编制程序完成求1 2 3 N的累加和 直到累加和超过1000为止 统计被累加的自然数的个数送CN单元 累加和送SUM单元 该题的循环次数预先是不确定的 只能按照循环过程中的某个特定条件来决定循环是否继续执行 可通过测试条件是否成立来实现对循环的控制 程序设计如下 17 DATASEGMENTSUMDW CNDW DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 初始化DSMOVAX 0 0送AXMOVBX 0 0送BXLP INCBX BX加1ADDAX BX 求累加和CMPAX 1000 比较JBELP 结果 1000转LPMOVSUM AXMOVCN BX 送结果MOVAH 4CHINT21H 返回DOSCODEENDSENDSTART 汇编结束 18 3 多重循环程序设计 1 内循环应完整包含在外循环内 内外循环不能交叉 2 内循环在外循环中位置可根据需要任意设置 3 内循环可嵌套在外循环中 也可几个循环并列存在 4 防止出现死循环 5 每次完成外循环再次进入内循环时初始条件须重新设置 例 数据段中有一组带符号数据 存放在从A单元开始的区域中 试编程序实现将它们按从小到大的顺序排序 要求排序后依然放在原来的存储区中 我们采用冒泡法来设计该程序 从第一个数开始依次对两两相邻的两个数进行比较 如果次序符合要求 即第i个数小于第i 1个数 不做任何操作 否则两数交换位置 这样经过第一轮的两两比较 N 1次 最大数放到了最后 第二轮对前N 1个数做上面的工作 则把次大数放到了倒数第二个单元 依次类推 做N 1轮同样的操作 就完成了从小到大排序 通过上述分析可以知道 该算法要用双重循环实现 外循环次数为N 1次 内循环次数分别为N 1次 N 2次 N 3次 2次 1次 所以内循环的循环次数和外循环的计数器值有关 即等于外循环计数器的值 20 DATASEGMENTADB23 15 34 67 19 0 12 89 120 55CNEQU ADATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 初始化DSMOVCX CN 1 外循环次数送计数器CXLP1 MOVSI OFFSETA 赋指针PUSHCX 外循环计数器入栈LP2 MOVAL SI CMPAL SI 1 相邻两个数比较JLENEXT 小于或等于转NEXTXCHGAL SI 1 否则A SI 和A SI 1 交换MOV SI ALNEXT INCSI 指针加1LOOPLP2 CX 1不为0转LP2POPCX 否则退出内循环 将CX出栈LOOPLP1 CX 1不为0转LP1MOVAH 4CHINT21H 返回DOSCODEENDSENDSTART 汇编结束 21 3 5 4子程序设计程序设计中 常把多处用到的同一个程序段或具有一定功能程序段单独存放在某一存储区域中 需要执行的时候 使用调用指令转到这段程序执行 执行完再返回原来程序 这个程序段就称为子程序 调用子程序的程序段称为主程序 主程序中调用指令的下一条指令的地址称为返回地址 22 1 主 子程序调用及功能分析 例 设计一个子程序 完成统计一组字数据中的正数和0的个数 DATASEGMENTARRDW 123 456 67 0 34 90 89 67 0 256CNEQU ARR 2ZERDW PLUSDW DATAENDSCODESEGMENTASSUMEDS DATA CS CODESTART MOVAX DATAMOVDS AX 初始化DSMOVSI OFFSETARR 数组首地址送SIMOVCX CN 数组元素个数送CXCALLPZN 调用近过程PZNMOVZER BX 0的个数送ZERMOVPLUS AX 正数的个数送PLUSMOVAH 4CHINT21H 返回DOS 23 子程序名 PZN 子程序功能 统计一组字数据中的正数和0的个数 入口参数 数组首地址在SI中 数组个数在CX中 出口参数 正数个数在AX中 0的个数在BX中 使用寄存器 AX BX CX DX SI及PSWPZNPROCNEARPUSHSIPUSHDXPUSHCX 保护现场XORAX AXXORBX BX 计数单元清0PZN0 MOVDX SI 取一个数组元素送DXCMPDX 0 DX中内容和0比较JLPZN1 小于0转PZN1JZZN 等于0转ZNINCAX 否则为正数 AX中内容加1JMPPZN1 转PZN1ZN INCBX 为0 BX中内容加1PZN1 ADDSI 2 数组指针加2调整LOOPPZN0 循环控制POPCXPOPDXPOPSI 恢复现场RET 返回主程序PZNENDP 子程序定义结束CODEENDS 代码段结束ENDSTART 汇编结束 从本例可以看出子程序的基本结构包括以下几个部分 1 子程序说明 用来说明子程序的名称 功能 入口参数 出口参数 占用工作单元的情况 明确该子程序的功能和调用方法 2 现场保护及恢复 由于汇编语言所处理的对象主要是CPU寄存器或内存单元 主程序在调用子程序时已经占用了一定的寄存器 子程序执行时又要用到这些寄存器 执行完毕返回主程序后 为了保证主程序按原有的状态继续正常执行 需要对这些寄存器的内容加以保护 这就是保护现场 子程序执行完毕后再恢复这些被保护的寄存器的内容 称为恢复现场 现场保护及恢复通常采用堆栈操作 3 子程序体 这一部分内容用来实现相应的子程序功能 4 子程序返回 子程序的返回语句RET和主程序中的调用语句CALL相互对应 才能正确实现子程序的调用和返回 返回指令用来恢复被中断位置的地址 汇编语言中子程序实现参数传递的方法主要有3种 1 寄存器传递 适合于需要传递的参数较少的情况 在调用子程序之前把参数放到规定的寄存器中 由这些寄存器将参数带入子程序中 执行子程序结束后的结果也放到规定的寄存器中带回主程序 2 堆栈传递 通过堆栈这个临时存储区来实现参数传递 主程序将入口参数压入堆栈 子程序从堆栈中取出参数 子程序将出口参数压入堆栈 主程序从堆栈中取出参数 3 存储器传递 若调用程序和子程序在同一个程序模块内 采用存储器传递参数是最简单的方法 通常在数据段内定义出要传送的数据变量 也称为数据缓冲区 子程序对这些定义的变量直接访问即可 26 DOS调用程序设计 例 编程实现用DOS功能调用完成屏幕光标的回车和换行处理功能 分析 采用子程序调用DOS功能 先在AH寄存器中设置系统功能调用号 其次在指定寄存器中设置入口参数 最后采用中断调用指令来实现功能调用 源程序 CRLFPROCFAR 定义过程名为CRLFPUSHAX 保护现场PUSHDXMOVDL 0DH 入口参数 回车CR的ASCII码MOVAH 02H 设置系统子功能号INT21H DOS调用 显示单个字符MOVDL 0AH 入口参数 换行LR的ASCII码MOVAH 02H 设置系统子功能号INT21H DOS调用 显示单个字符POPDX 恢复现场POPAXRET 子程序返回CRLFENDP 过程结束 27 例 在屏幕上给出 输入一个字符串 的提示信息 要求从键盘输入相应字符串 并在屏幕上显示输出 源程序 DATASEGMENTSTRDB pleaseinputastring 定义字符串BUFDB20DB DB20DUP CRLFDB0AH 0DH 回车及换行的ASCII码DATAENDSSTACKSEGMENTSTACK 定义堆栈区DB20DUP STACKENDS 28 CODESEGMENTASSUMEDS DATA SS STACK CS CODESTART MOVAX DATAMOVDS AXLEADX STR 取字符串首地址MOVAH 09H DOS调用显示字符串INT21HMOVAH 0AH DOS调用输入字符串LEADX BUF 取内存预留字符串首地址INT21HLEADX CRLF 调回车及换行MOVAH 09HINT21HMOVCL BUF 1 取初始数据LEASI BUF 2 取地址NEXT MOVDL SI 取单个字符到DLMOVAH 02H 输出单个字符INT21HINCSI 地址加1DECCL 数据个数减1JNZNEXT 非0转NEXTMOVAH 4CHINT21HCODEENDSENDSTART 汇编语言是面向机器的程序设计语言 它使用指令助记符 符号地址及标号编制程序 要熟悉汇编语言源程序的基本格式 正确运用语句格式来书写程序段 掌握伪指令的功能和应用 并通过上机操作 熟悉编辑程序 汇编程序 连接程序和调试程序等软件工具的使用 掌握源程序的建立 汇编 连接 运行 调试等技能 汇编语言小结 顺序结构是按照语句实现的先后次序执行一系列的操作 是最简单的一种结构 分支结构是程序设计中常用的结构之一 它有两分支和多分支两种形式 循环结构用来实现需要重复执行的操作 通常由循环初始化 循环处理部分 循环修改部分和循环控制部分4部分组成 子程序设计是把多处用到的同一个程序段或者具有一定功能的程序段单独存放在某一存储区域中 需要执行的时候 使用调用指令转到这段程序来执行 执行完再返回原来的程序 这样做提高了程序段的利用率 也有利于模块化的程序设计和开发 汇编语言小结 31 本章小结 汇编语言用指令助记符 符号地址及标号编制程序 要熟悉源程序基本格式 掌握伪指令功能和应用 要掌握源程序建立 汇编 连接 运行 调试等技能 顺序结构按照语句先后次序执行一系列操作 分支结构有两分支和多分支两种形式 循环结构实现需要重复执行的操作 由循环初始化 循环处理 循环修改和循环控制组成 子程序把多处用到的同一程序段单独存放 执行时调用 执行完返回原来程序 编写源程序还可使用宏汇编 重复汇编和条件汇编 采用高级汇编技术能减少程序员的工作量 减少程序出错的可能性
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!