程序设计的其他方法和技术.ppt_第1页
程序设计的其他方法和技术.ppt_第2页
程序设计的其他方法和技术.ppt_第3页
程序设计的其他方法和技术.ppt_第4页
程序设计的其他方法和技术.ppt_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

1 字符串操作2 宏功能程序设计3 模块化程序设计 5 1 2串操作指令 1 MOVS MoveString 串传送语法格式 MOVSBMOVSWMOVSOPD OPS功能描述 MOVS B W 将DS SI所指源串的1个元素 字节 字 复制到ES DI所指的内存单元 然后 SI和DI增加或减少1 2 若DF 0 则增加 否则减少 对标志位的影响 无 2 CMPS CompareStrings 串比较语法格式 CMPSOPD OPSCMPSBCMPSW功能描述 CMPS B W 将DS SI所指源串的1个元素 字节 字 与ES DI所指目的串的1个元素 字节 字 进行比较 根据比较结果设置标志位 然后 SI和DI增加或减少1 2 若DF 0 则增加 否则减少 对标志位的影响 同CMP 5 1 2串操作指令 3 SCAS ScanString 串扫描语法格式 SCASOPDSCASBSCASW功能描述 SCAS B W 将AL AX与ES DI所指目的串的1个字节 字进行比较 根据比较结果设置标志位 然后 DI增加或减少1 2 若DF 0 则增加 否则减少 5 1 2串操作指令 4 LODS LoadString 串装入语法格式 LODSOPSLODSBLODSW功能描述 LODS B W 将DS SI所指源串的1个元素 字节 字 复制到AL AX 然后 SI增加或减少1 2 4 若DF 0 则增加 否则减少 对标志位的影响 无 5 1 2串操作指令 5 STOS StoreString 串存储语法格式 STOSOPDSTOSBSTOSW功能描述 STOS B W 将AL AX的值复制到ES DI所指的内存单元 然后 DI增加或减少1 2 若DF 0 则增加 否则减少 对标志位的影响 无 5 1 2串操作指令 6 重复前缀REP 当CX0时 重复执行后面的串指令 每执行1次 CX CX 1 只能用在MOVS LODS或STOS B W 之前REPZ REPE 当CX0且ZF 1时 重复执行后面的串指令 每执行1次 CX CX 1 只能用在CMPS B W D 或SCAS B W 之前REPNZ REPNE 当CX0且ZF 0时 重复执行后面的串指令 每执行1次 CX CX 1 只能用在CMPS B W D 或SCAS B W 之前说明 若CX初值为0 则不执行任何操作 而且标志位不变 5 1 2串操作指令 1 串指令的共性源串 地址由DS SI表示 目的串 地址由ES DI表示 自动修改地址 每次数据操作后 SI和DI自动递增或递减 取决于操作的数据类型 字节 字 以及DF的值 若DF 0 则SI和DI自动增加1 2 否则 减1 2 可以使用CLD或STD指令设置DF 计数器 使用重复前缀时 由CX表示数据个数 每重复1次操作 CX减1 5 1 1串操作指令简介 总结 2 串指令的用途串指令主要用于处理连续的内存单元 与重复前缀配合使用更有效 例如 MOVS用于将一个内存块的数据复制到另一块 CMPS用于比较两个内存区的数据 SCAS可以在一个内存区中扫描与给定值首次匹配或不匹配的元素 STOS能将一个内存区的所有单元初始化为给定值 LODS一般不用重复前缀 5 1 1串操作指令简介 总结 5 1字符串操作 实例 例1将以STR1为首址的字节存储区中存放的字符串传送到以STR2为首址的字节存储区 DATASEGMENTSTR1DBABCDEFGHIGKLL COUNT STR1STR2DBCOUNTDUP 0 DATAENDSSTACKSEGMENTSTACKDB100DUP 0 STACKENDSCODESEGMENTASSUMECS CODE DS DATA ES DATA SS STACK BEGIN MOVAX DATAMOVDS AXMOVES AXLEASI STR1LEADI STR2MOVCX COUNTCLDREPMOVSBMOVAH 4CHINT21HCODEENDSENDBEGIN 5 1字符串操作 实例 例2从键盘输入一字符串至STR1为首址的字节缓冲区 试比较该串与字节字符串STR2是否相等 若相等 那么0 BX 否则 0FFFFH BX 5 1字符串操作 实例 例3在字符串STR中搜索子串 AM 出现的次数送入BX P REPNESCASBJEAJMPOUT1A CMPBYTEPTR DI M JNEBINCBXB CMPCX 0JNEPOUTA 5 1字符串操作 实例 例5在TAB命令存储区中存放着若干条命令 其中每条命令的前一个字节存放着命令串的长度加1 后面一个字存放着该命令处理子程序的入口地址 设计一命令解释程序 其功能为 检查用户输入的命令 如果在TAB存储区能查到该命令 则转入相应的命令处理子程序执行 如果查不到 则给出错误提示后再输入 如果用户未输入命令 则退出本程序的执行 TAB DB4 DIR DWDIRDB7 RENAME DWRENAMEDB4 DEL DWDELDB5 COPY DWCOPY 5 2宏功能程序设计 8086宏汇编语言提供的宏功能主要包括 宏指令的定义与调用 重复汇编和条件汇编等 宏指令允许用户为重复的语句序列定义一个名字 然后在程序中用这个名字代替这个语句序列 并允许传递多个参数 参数传递方式比子程序简单 宏指令的使用步骤 1 宏定义 MACRO ENDM 2 宏调用 3 宏扩展 5 2 1宏定义 格式 宏指令名MACRO 形参表 宏体ENDMMACRO 宏定义的开始 宏指令名 宏定义为宏指令序列规定的名称 形参 个数不限 但字符个数不得超过132个 形参间用逗号隔开 宏体 宏指令代替的程序段 由一系列机器指令语句和伪指令语句组成 ENDM 表示宏定义的结束 与MACRO成对出现 5 2 1宏定义 注意事项 宏指令一定要先定义后调用 因此 宏定义一定要放在它的第一次调用之前 宏指令名可以与伪指令 机器指令的助记符同名且具有比机器指令 伪指令更高的优先级 当它们同名时 宏汇编程序将它们一律处理成相应的宏扩展 5 2 1宏定义 例 某程序中要经常输出缓冲区中的字符串 通过反复进行9号DOS功能调用完成 LEADX BUF1MOVAH 9INT21H LEADX BUF2MOVAH 9INT21H WRITEMACROALEADX AMOVAH 9INT21H 可定义为宏 5 2 2宏调用 格式 宏指令号 实参表 注意 实参要与宏定义中的形参按位置关系一一对应 如果实参的个数多于形参个数 多余的实参被忽略 如果实参少于形参 则缺少的实参被处理为空白 例如 对前面的宏定义可按下面的形式调用 WRITEBUF1 WRITEBUF2 5 2 3宏定义与宏调用中的参数 一 带间隔符的实参在宏调用中 有时实参是一串带间隔符 如空格 逗号等 的字符串 为了防止混淆 应该用尖括号将它们括起来 尖括号中的内容为一个实参 例如对堆栈段的宏定义 STACKMMACROASTACKSEGMENTSTACKDBASTACKENDSENDM 5 2 3宏定义与宏调用中的参数 一 带间隔符的实参在当前程序中 需要建立一个500字节 初值均为0的堆栈段 宏调用为 相应的宏扩展为 STACKM 500DUP 0 STACKSEGMENT STACK DB500DUP 0 STACKENDS 5 2 3宏定义与宏调用中的参数 二 数字参数在某些情况下 需要以实参符号的值而不是符号本身来替换形参 这种参数的替换称数字参数的替换 特殊宏操作符 将其后的表达式转换成它所代表的数值 并将此数值的ASCII码字符嵌入到宏扩展中 例如 DATA1MACROA B C DDWA B CDBDDUP 0 ENDM 5 2 3宏定义与宏调用中的参数 二 数字参数如果宏调用为 DW12 5 30DB15DUP 0 DWX 2 5 X YDBY 5DUP 0 X 10Y 20DATA1 X 2 5 X Y Y 5DATA1X 2 5 X Y Y 5 则相应的宏扩展为 5 2 3宏定义与宏调用中的参数 三 宏参数的连接在宏定义中 有些形参夹在字符串中 为了将这种形参标识出来 需在这样的形参前面加符号 如果形参后面还跟有字符串 则还应在形参后面加符号 例如 SHIFTMACROA B CMOVCL AS BC CLENDM 5 2 3宏定义与宏调用中的参数 三 宏参数的连接如果宏调用为 MOVCL 4SALAX CLMOVCL 2SARBH CL SHIFT4 AL AXSHIFT2 AR BH 则相应的宏扩展为 5 2 3宏定义与宏调用中的参数 四 宏体中的变量与标号在宏定义中 常常需要定义一些变量与标号 当这些宏定义在同一程序中多次调用并扩展后 会出现变量或标号重复定义的错误 例如 SUMMACROA BMOVCX AMOVBX BMOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXTENDM 5 2 3宏定义与宏调用中的参数 四 宏体中的变量与标号如果宏调用为 MOVCX 50MOVBX 1MOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXT SUM50 1SUM20 10 则相应的宏扩展为 MOVCX 20MOVBX 10MOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXT 5 2 3宏定义与宏调用中的参数 四 宏体中的变量与标号为避免宏扩展后出现变量或标号重复错误 8086宏汇编语言了伪指令LOCAL来解决这一问题 语句格式 LOCAL形式参数 形式参数 功能 在宏扩展时 汇编程序自动为其后的形参生成特殊符号 0000 FFFF 并用这些特殊符号来取代宏体中的形参 注意 LOCAL语句只能作为宏体的第一条语句 5 2 3宏定义与宏调用中的参数 四 宏体中的变量与标号对于前面求若干个奇数 偶数 各的宏定义 可以改写为如下形式 SUMMACROA BLOCALNEXTMOVCX AMOVBX BMOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXTENDM MOVCX 50MOVBX 1MOVAX 0 0000 ADDAX BXADDBX 2LOOPNEXT MOVCX 20MOVBX 10MOVAX 0 0001 ADDAX BXADDBX 2LOOPNEXT 5 2 6宏库的使用 一 宏库的定义对于经常使用的宏定义 可将它们集中在一起 供随时调用 例如建立宏库MACRO LIB READMACROALEADX AMOVAH 10INT21HENDMWRITEMACROALEADX AMOVAH 9INT21HENDM 5 2 6宏库的使用 二 宏库的使用当程序中需要调用时 首先将宏库加入自己的源文件 然后按宏库中各宏定义的规定调用 语句格式 INCLUDE文本文件名功能 将指定的文本文件从本行起加入汇编 直到该文本的最后一行汇编完后 再继续汇编INCLUDE后面的语句 5 2 6宏库的使用 二 宏库的使用示例 从键盘输入一串字符到BUF缓冲区 将其中的小写字母转换成大写字母 其余字符不变 后仍在显示器上输出 实现方案 利用MACRO LIB中的宏定义READ OUT1 CRLF实现字符串的输入 显示一个字符 输出回车换行 READMACROALEADX AMOVAH 10INT21HENDMCRLFMACROMOVAH 2MOVDL 0AHINT21HMOVDL 0DHINT21HENDMOUTCHMACROAMOVDL AMOVAH 2INT21HENDM STACKMMACROASTACKSEGMENTSTACKDBASTACKENDSENDM 文件MACRO LIB中的宏定义 INCLUDEMACRO LIBDATASEGMENTBUFDB79DB0DB80DUP 0 DATAENDSSTACKMCODESEGMENTASSUMEDS DATA SS STACK CS CODESTART MOVAX DATAMOVDS AXREADBUFLEASI BUF 2MOVCL BUF 1MOVCH 0 CLDCRLFY1 LODSBCMPAL a JBY2CMPAL z JAY2SUBAL 20HY2 OUTCHALLOOPY1CRLFMOVAH 4CHINT21HCODEENDSENDSTART 利用宏定义实现题目要求的功能 5 2 7宏指令与子程序的比较 处理时间不同 宏指令在汇编期间由宏汇编程序处理 子程序调用是在目标程序执行期间由CPU直接执行 处理方式不同 宏指令必须先定义 后调用 宏调用是用宏体置换宏指令名 实参置换形参 汇编结束 宏定义也随之消失 子程序调用不发生代码和参数的置换 目标程序的长度不同 宏指令导致目标程序长 占用空间大 而子程序无论调用多少次 子程序的目标代码仅出现一次 因此目标程序短 占用存储空间小 5 2 7宏指令与子程序的比较 执行速度不同 调用子程序需要使用堆栈保护和恢复现场 需要专门的指令传递参数 因此执行速度慢 宏指令不存在这些问题 因此执行速度快 参数传递方式不同 宏调用可实现参数的置换 参数的形式不受限制 简单 方便 灵活 不容易出错 而子程序的参数一般为地址或操作数 传递方式由用户编程时具体安排 参数较多时容易出错 5 3模块化程序设计 对大型的复杂问题 如果将整个程序放在一个模块中实现会存在以下问题 无法进行多人合作共同完成任务 影响编程的效率和质量 难以保证程序的可靠性 程序调试困难 调试过程中需要多次汇编 源程序越长 汇编的速度越慢 浪费时间 5 3模块化程序设计 正确地解决大型 复杂问题的方法 采用自顶向下 逐步求精的模块化和结构化的设计方法 将一个任务按其需要实现的主要功能分解为若干相对独立的模块 并确定好各模块之间的调用关系和参数传递方式 对其中的公共部分还可以抽出来作为独立的公用子程序模块供大家调用 然后将这些模块分配给各个开发人员 分别编写 调试 最后再将它们的目标模块连接装配成一个完整的系统 5 3模块化程序设计 模块划分与设计的参考规则 如果一个程序段被多个模块公用 则它应是一个独立的模块 如果若干个程序段处理的数据是公用的 则这些程序应放在一个模块中 若两个程序段的租用率差别很大 则应分属于两个模块 模块的规模要适当 既不能过大 也不能过小 5 3模块化程序设计 模块划分与设计的参考规则 应力求使模块具有通用性 各模块应在功能 逻辑上相互独立 避免用转移语句在模块间转移 各模块间的接口应该简单 要尽量减少公共符号的个数 尽量不共用数据存储单元 每个模块的结构应尽量设计成单入口 单出口的形式 5 3模块化程序设计 汇编语言程序设计中使模块化程序设计成为可能的关键 可重定位技术和连接程序 LINK 连接程序将多个目标模块连接在一起时 必须要有以下两方面的信息 各模块间的通信方式 一个模块访问其它模块中定义的标号 包括过程名 变量或常量 各段之间的组合方式 每个模块都可能包含多个段 将多个模块连接在一起时 这些段以什么方式进行组合 这些信息是在编程时 使用伪指令通过宏汇编程序产生的目标文件提供给连接程序 5 3 1组合方式 段定义伪指令的完整格式 段名SEGMENT 定位方式 组合方式 类别 段名ENDS功能 定义一个段 其定位方式 组合方式 类别 为赋给段的属性用方括号括起来表示可以省略 若不省略 各项的顺序不能错 且用空格分隔 类别 的引号不能省 5 3 1组合方式一 定位方式 从汇编语言的角度来看 8086 8088物理地址的构成 PA 所在段的段寄存器 左移四位 EA当EA 0时 物理地址的最低四位总是0 即段首地址能被16整除 实际上 连接程序允许段首地址从任何字节开始 或者从某一字开始 或从某一页开始 并由用户自由选择 这就是定位方式的选择 定位方式 是对该段的起始地址所提出的要求 即告诉连接程序 在将各段装配到一起时 前一段放完后 后面的段从什么样的起始边界开始存放 5 3 1组合方式一 定位方式 定位方式有四种选择 PARA 从能被16整除的地址开始 即段首PA最低4位为0 WORD 从偶数地址开始 即段首PA最低1位为0 BYTE 可以从任何物理地址开始存放 PAGE 从能被256整除的地址开始 即段首PA最低8位为0 其中PARA为系统隐含的定位方式 5 3 1组合方式一 定位方式 例 已知程序中的DATA1段和DATA2段的定义如下 如果这两个段分别为当前数据段和附加数据段 试分析不同的定位方式下连接程序对它们边界的处理方法 DATA1SEGMENTADB55HDUP 0FFH DATA1ENDSDATA2SEGMENTDB64HDUP 0 DATA2ENDS 5 3 1组合方式二 类别 段的 类别 是用单引号括起来的字符串 可以是任何合法的名称 连接程序在进行处理时 将把 类别 相同的所有段 不一定同名 存放在连续的存储区中 先出现的在前 后出现的在后 但仍然是不同的段 且每段都有自己的起始地址 5 3 1组合方式二 类别 例 ASEGMENT DATA BSEGMENT CODE CSEGMENT TO DSEGMENT DATA ESEGMENT TO ASEGMENT DATA DSEGMENT DATA BSEGMENT CODE CSEGMENT TO ESEGMENT TO 连接后 复习 同名段如何处理 问题 同名不同类别段如何处理 5 3 1组合方式二 类别 验证1 同名段 DATA1SEGMENTDB DATA1 DATA1ENDSDATA1SEGMENTDB DATA2 DATA1ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1组合方式二 类别 验证2 不同名同类别段 DATA1SEGMENT D1 DB DATA1 DATA1ENDSDATA2SEGMENT D1 DB DATA2 DATA2ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1组合方式二 类别 验证3 同名段不同类别段 DATA1SEGMENT D1 DB DATA1 DATA1ENDSDATA1SEGMENT D2 DB DATA2 DATA1ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1组合方式三 组合方式 8086只允许同时访问4个段 为简便起见 前面学习时采用的方式 将相同性质的段 如全部代码段 全部数据段 组合在一起成为一个代码段 一个数据段 限制 组合起来的各段总长度必须小于64K 为了解决这一问题 连接程序还提供了其它组合方式 由段定义中的 组合方式 属性指定 包括不选择 PUBLIC COMMON AT表达式 STACK和MEMORY 5 3 1组合方式三 组合方式

温馨提示

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

评论

0/150

提交评论