




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章结构化程序设计 本章提要 本章针对Intel系列微处理器的指令系统 首先介绍利用宏汇编工具MASM6 X实现结构化程序设计的方法 然后介绍模块化程序设计和宏结构程序设计 最后叙述汇编语言源程序的汇编 链接和运行调试的过程 学习目标 熟练掌握顺序 分支 循环结构程序设计方法 熟练掌握子程序及宏机构程序设计方法 掌握利用宏汇编工具MASM6 X的专用伪指令实现程序结构控制 熟练掌握汇编与调试工具的应用 2020年2月12日星期三 6 1分支和循环结构程序设计 1 分支程序设计一 用转移指令实现假如要把连续存放在内存变量名DAT中的三个数按递减次序排列 2020年2月12日星期三 二 用MASM6 X伪指令实现MASM6 X引入了条件控制伪指令 格式 IF条件表达式 条件为真 非0 执行分支体分支体 ELSEIF条件表达式分支体 前面IF条件为假 并且当前ELSEIF条件为真执行分支体 ELSE 前面IF条件为假执行分支体分支体 ENDIF 分支结束例如 IFAX 0MOVBX 1 如果AX 0 则将1存入BX ELSEIFAX 0MOVBX 0 如果AX 0 则将0存入BX ELSEMOVBX 1 如果AX 0 则将 1存入BX ENDIF 2020年2月12日星期三 条件表达式中的操作符及功能 2020年2月12日星期三 的优先级高于 和 位测试运算符的用法为 数值表达式 数值 相当于执行TEST指令和相应的条件转移指令 以下为采用 运算符的分支结构程序片段 功能为 若AX内容为奇数 则把全1送BX 若AX内容为偶数 则把0送入BX IFAX 1 相当于TESTAX 1指令 也设置标志位 若ZF 0则执行第一分支MOVBX 0FFFFH 第一分支 ELSEMOVBX 0 第二分支 ENDIF 2020年2月12日星期三 例 用条件控制伪指令实现有实根判别的程序 MODELSMALL 386 STACK DATAASBYTE BSBYTE CSBYTE SIGNBYTE CODE STARTUPMOVAL BIMULALMOVBX AX BX中为B的平方MOVAL AIMULCMOVCX 4IMULCX AX中为4AC IFSWORDPTRBX AX 比较B的平方和4AC的大小MOVSIGN 1 条件成立 SIGN得到1 ELSEMOVSIGN 0 条件不成立 SIGN得到0 ENDIF EXIT0END 2020年2月12日星期三 6 1 2循环程序设计 一 用循环指令实现循环结构例 计算l 20的整数之和 并将结果存入字变量SUM中 MODELSMALL STACK DATASUMDW CODE STARTUPXORAX AX 被加数AX清零MOVCX 20AGAIN ADDAX CX 从20 19 2 1倒序累加到AXLOOPAGAIN 每循环一遍 CX自动减1MOVSUM AX 将累加和送入SUM单元 EXIT0END 2020年2月12日星期三 二 用MASM6 x循环控制伪指令实现循环结构 1 WHILE结构的循环控制伪指令的格式为 WHILE条件表达式 条件为真 执行循环体循环体 ENDW 循环体结束例 求5的阶乘1 2 3 4 5 并送入指定单元的程序片段可以编写为 MOVAX 1 积AX初值设为1MOVCX 2 WHILECL 5 该循环总共执行4遍MULCL 从1 2 3 4 5累乘INCCL ENDWMOVMEMWORD AX 将乘积送入指定单元 2 REPEAT结构的循环控制伪指令的格式为 REPEAT 重复执行循环体循环体 UNTIL条件表达式 直到条件为真结束循环如果要实现1 100之间偶数求和 循环体程序片段可以编写为 MOVAX 0MOVCX 100 REPEAT 是先执行后判断的结构ADDAX CXSUBCX 2 UNTILCX 0 直到CX内容为0结束 AX内容为偶数之和 2020年2月12日星期三 3 REPEAT结构还有一种格式 REPEAT 重复执行循环体循环体 UNTILCXZ 条件表达式 cx cx 1 直到cx 0或条件 为真结束不带表达式的 repeat untilcxz伪指令将汇编成一条loop指令 即重复执行直到cx减1后cx 0 带有表达式的 repeat untilcxz伪指令的循环结束条件是cx减l后等于0或指定的条件为真 untilcxz伪指令的表达式只能是比较寄存器与寄存器 寄存器与常数 以及存储单元与常数相等 或不等 4 BREAK伪指令和 CONTINUE伪指令 BREAK的功能是无条件退出当前循环 CONTINUE的功能是转向循环体的开始 直接进入下一轮循环 2020年2月12日星期三 例 设ARRAY是100字节的字符数组 分别统计出其中大写 小写字符的个数 并保存到相应单元 同时将所有字母单元内容改为数值55H 对0到9的阿拉伯数字不统计 也不修改 遇到其他字符则推出循环 程序如下 MODELSMALL STACK DATAARRAYDB A A 4 B G R 3 5 总共不超过100个UP ALPDB0 大写字母个数 初值为0DOWN ALPDB0 小写字母个数 初值为0 CODE STARTUPMOVBX 0 WHILEBX 41H ARRAY BX 61H ARRAY BX 30H ARRAY BX 39H 阿拉伯数字INCBX CONTINUE ELSE 其他字符 结束循环 BREAK ENDIFMOVARRAY BX 55H 大小写字母单元都该为55HINCBX ENDW EXIT0END 2020年2月12日星期三 6 1 3用中断指令实现简单输入输出 1 从键盘读入一个字符功能号 1入口参数 无出口参数 AL 输人字符的ASCII码功能 等待从键盘读入一个字符 将字符的ASCII码送给AL 同时将该字符显示在屏幕上 调用方法 MOVAH l AH中存放的是功能号INT21H说明 在输入一个字符后 不需要键入回车 若只键入回车 则出口参数AL得到的是回车符的ASCII码0DH 2 显示一个字符功能号 2入口参数 DL 要显示字符的ASCII码出口参数 无功能 在当前光标位置显示DL中的字符 然后光标右移 调用方法示例 下列指令序列用来显示字符 A MOVDL A MOVAH 2INT2lH 2020年2月12日星期三 功能号 9入口参数 DS DX 欲显示的字符串在内存的首地址 字符串必须以 作为结束标志 不属于被显示的字符串 出口参数 无功能 在当前光标位置 显示由DS DX所指的 以 为结束标志的字符串 然后光标右移 调用方法示例 STRINGDB Helloworld 下列指令序列用来显示String中的字符串 Helloworld MOVAX SEGSTRINGMOVDS AXLEADX STRINGMOVAH 9INT21H 3 显示一个字符串 2020年2月12日星期三 功能号 0AH入口参数 DS DX 输人缓冲区的首地址输入缓冲区格式 第0个字节给出输入缓冲区最多能容纳的字符个数 1 255 包括回车符 由应用程序设置 第1个字节将存放实际输人的字符个数 不包括回车符 由系统在读入字符串后自动设置 从第2个字节开始存放实际输入的字符串 最后为回车符的ASCII码0DH 出口参数 无功能 从键盘读入一个字符串 存入由DS DX所指的输入缓冲区 说明 在输入字符串后 必须以回车结束 当输人的字符数达到了输入缓冲区所能容纳的字符个数减l时 随后的输入将不被系统接收 且响铃警告 调用方法示例 BUFDB80 定义输入缓冲区 最多容纳79个字符与1个回车符DB 存放实际输入的字符个数 由系统自动设置DB80DUP 存放实际输入的字符串下列指令序列将从键盘读人字符串 并存入输入缓冲区BUF中MOVAX SEGBUFMOVDS AXMOVDX OFFSETBUFMOVAH 0AHINT21H 4 从键盘读入一个字符串 2020年2月12日星期三 一 过程设计在MASM6 X中 带有参数的过程定义伪指令PROC格式如下 过程名PROC 调用距离 语言类型 作用范围 起始参数 USES寄存器列表 参数 类型 参数 类型 LOCAL参数表 汇编语言语句过程名ENDP其中 过程所具有的各个选项参数如下 过程名 表示该过程名称 应该是遵循相应语言类型的标识符 调用距离 可以是NEAR或FAR 表示该过程是近或远调用 简化段格式中 默认值由 MODEL语句选择的存储模式决定 语言类型 可以是任何有效的语言类型 确定该过程采用的命名约定和调用约定 语言类型还可以由 MODEL伪指令指定 作用范围 可以是PUBLIC PRIVATE EXPORT 表示该过程是否对其他模块可见 默认是PUBLIC 表示其他模块可见 PRIVATE表示对外不可见 EXPORT隐含有PUBLIC和FAR 表示该过程应该放置在导出表中 起始参数 采用这个格式的PROC伪指令 汇编系统将自动创建过程的起始代码和收尾代码 用于传递堆栈参数以及清除堆栈等 起始参数表示传送给起始代码的参数 它必须使用尖括号 括起来 多个参数用逗号分隔 6 2子程序设计 2020年2月12日星期三 寄存器列表 指通用寄存器名 用空格分隔多个寄存器 只要利用 USES寄存器列表 罗列该过程中需要保存与恢复的寄存器 汇编系统将自动在起始代码产生相应的入栈指令 并对应在收尾代码产生出栈指令 参数 类型 表示该过程使用的形式参数及其类型 在16位段中 默认的类型是字WORD 在32位段中默认的类型是双字DWORD 参数类型可以是任何MASM有效的类型或PTR 表示地址指针 在C SYSCALL STDCALL语言类型中 参数类型还可以是VARARG 它表示长度可变的参数 如果过程使用局部变量 紧接着过程定义伪指令PROC 可以采用一条或多条LOCAL伪指令说明 它的格式如下 LOCAL变量名 个数 类型 其中 可选的 个数 表示同样类型数据的个数 类似数组元素的个数 在l6位段中 默认的类型是字WORD 在32位段中默认的类型是双字DWORD 使用LOCAL伪指令说明局部变量后 汇编系统将自动利用堆栈存放该变量 其方法与高级语言的方法一样 2020年2月12日星期三 PROTO是过程声明伪指令 用于事先声明过程的结构 它的格式如下 过程名PROTO 调用距离 语言类型 参数 类型 语句中的各个项必须与相应过程定义伪指令PROC的各个项一致 使用PROTO伪指令声明过程之后 汇编系统将进行类型检测 才可以使用INVOKE调用过程 与PROTO配合使用的过程调用伪指令是INVOKE 它的格式如下 INVOKE过程名 参数 它自动创建调用过程所需要的代码序列 调用前将参数压入堆栈 调用后平衡堆栈 其中 参数 表示通过堆栈将传递给过程的实在参数 可以是数值表达式 寄存器 ADDR标号 ADDR标号 传送的是标号的地址 如果是双字DWORD类型则是段地址和偏移地址 如果是字WORD类型则是偏移地址 2020年2月12日星期三 例 MODELSMALLARRAYSUMPROTOC WORD WORD 声明过程 STACK100 DATACOUNTEQU5 数组的元素个数ARRAYDB2H 60 10H 13H 5 数组RESULTDB 和 CODE STARTUPINVOKEARRAYSUM COUNT OFFSETARRAY 调用过程MOVRESULT AL 保存和 EXIT0 计算字节和的过程 入口参数 ARRAYCOUNT 数组的元素个数 ARRAYADDR 数组的偏移地址 出口参数 AL 和ARRAYSUMPROCCUSESBXCX ARRAYCOUNT WORD ARRAYADDR WORDMOVBX ARRAYADDR 数组的偏移地址送BXMOVCX ARRAYCOUNT 数组的元素个数送CXXORAL ALSUMD ADDAL BX 求和 AL AL十DS BX INCBXLOOPSUMDRETARRAYSUMENDPEND 2020年2月12日星期三 可以把不同的过程或功能模块放在不同的源文件中 分别编辑 汇编和调试 最后把各模块连接成一个可执行文件 1 EXTRN伪指令格式一 EXTRN过程名 属性 声明当前程序将要调用的存在于当前文件之外的过程名 调用属性可以是NEAR或FAR 默认的属性为NEAR 当模块规模比较大时可定义为FAR 格式二 EXTRN变量名 属性 声明当前程序将要用到的 但却是在其它文件中用PUBLIC语句定义的公共变量 属性可以是BYTE WORD或DWORD等 2 PUBLIC伪指令格式 PUBLIC变量名表 过程名表 定义当前文件中的变量名或过程名是可以被其它模块中使用的公共变量或者过程 二 多模块编程 2020年2月12日星期三 例6 7 MAIN ASM EXTRNSUBPROG1 FAR 定义远调用的外部的过程名SUBPROG1EXTRNSUBPROG2 FAR 定义远调用的外部的过程名SUBPROG2PUBLICVALUE1 VALUE2 SUM PRODUCT 声明4个全局变量 MODELSMALL STACK64 DATAVALUE1DW2050VALUE2DW500SUMDW2DUP PRODUCTDW2DUP CODE STARTUPCALLSUBPROG1 调用其他模块中的过程SUBPROG1实现相加运算CALLSUBPROG2 调用其他模块中的过程SUBPROG2实现相乘运算 EXIT0END 2020年2月12日星期三 子模块1 SUB1 ASM EXTRNVALUE1 WORD 声明3个被用到的变量及类型EXTRNVALUE2 WORDEXTRNSUM WORDPUBLICSUBPROG1 声明SUBPROG1是可被其他模块调用的过程 MODELSMALL CODESUBPROG1PROCFARSUBBX BX 实现BX及CF的清零MOVAX VALUE1MOVDX VALUE2ADDAX X 把VALUE1和VALUE2相加ADCBX 00 把进位放在BX中MOVSUM AX 16位和存放在SUM中MOVSUM 2 BX 进位存放在SUM的高字RETSUBPROG1ENDPEND 2020年2月12日星期三 子模块2 SUB2 ASM EXTRNVALUE1 WORD 声明3个被用到的变量及类型EXTRNVALUE2 WORDEXTRNPRODUCT WORDPUBLICSUBPROG2 声明它是可被其他模块调用的过程 MODELSMALL CODESUBPROG2PROCFARMOVAX VALUE1MOVCX VALUE2MULCX 实现VALUE1和VALUE2相乘MOVPRODUCT AX 积的低16位存入PRODUCTMOVPRODUCT 2 DX 积的高16位存入PRODUCT的高字SUBPROG2ENDPEND 模块结束 2020年2月12日星期三 上述3个文件分别汇编生成各自的目标程序 obj 文件之后 就可以把他们连接到一起形成一个可执行文件 exe 了 连接时 LINK程序根据自动各模块中用PUBLIC和EXTRN伪指令声明的变量及过程进行匹配 连接可以用的DOS命令为 LINKMAIN OBJ SUB1 OBJ SUB2 OBJ注意 各个模块的文件名与模块内部的过程名是没有关联的 模块之间的相互调用和返回都是通过过程名来实现的 与模块的文件名无关 2020年2月12日星期三 一 宏定义宏定义由MACRO伪指令和ENDM伪指令定义 其语句格式如下 宏指令名MACRO 宏体ENDM下例是定义有一个参数的宏DISPCHAR 在屏幕显示参数所对应的字符 DISPCHARMACRODISCHARMOVDL DISCHARMOVAH 2HINT21HENDM二 宏引用和宏扩展如有DISPCHAR42H宏引用 则汇编程序会自动将该宏扩展为如下语句序列 MOVDL 42H 显示 B MOVAH 2HINT21H注意 宏定义本身不生成任何目标代码 宏引用语句也不生成目标代码 它仅表示宏引用出现的位置 宏扩展时才生成代码 6 3宏结构程序设计 2020年2月12日星期三 宏注释符 用于表示在宏定义中的注释 采用这个符号的注释 在宏展开时不出现 例 对8086的4条移位指令 shl shr sal sar 现在我们用宏指令movereg替代 这时 需要用参数表示助记符 moveregMACROX Y Z PUSHCXMOVCL YS X Z CLPOPCXENDM 该宏调用在汇编后的宏展开为 PUSHCXMOVCL 3 用实参3代替形参YSHLAX CL 用实参HL代替形参Z并 与前面的S连接 用实参AX代替形参XPOPCX 三 几个宏操作符的使用 2020年2月12日星期三 为了方便09H号DOS调用 字符串的定义可以采用如下宏 DISPSTRINGMACROSTRDB 实参个数少于形参 则多余的形参为空值 2020年2月12日星期三 1 宏引用语句由宏汇编程序识别 并完成相应的处理 而调用过程的CALL语句是在执行程序时完成的 2 源程序在汇编过程中 要将宏指令所代替的程序段汇编成相应的机器代码 并插入到源程序的目标代码中 由于每引用一次宏指令 就要插入一次 因此宏引用不能缩短目标代码的长度 但是 被调用的过程经汇编后的机器代码是与主程序分开并独立存在的 其目标代码在存储器中只需保留一份 因此 采用过程调用能有效地缩短目标代码长度 即节省内存空间 3 过程调用时需要保护程序的断点和现场 待过程执行完毕后还要恢复现场和断点 这些操作需要耗费CPU的时间 而宏引用不需要进行这些操作 因此 过程调用节省存储空间 但降低程序的执行速度 而宏指令及其引用不能节省存储空间 但能有较快的执行速度 四 宏指令与过程的比较 2020年2月12日星期三 6 4汇编程序和汇编处理过程 一 源程序的汇编1 行汇编 按行对汇编语言源程序逐条汇编DEBUG EXE中的A命令就属于这种汇编类型例 C DEBUG A0AF5 0100MOVAH 0080 0AF5 0103ADDAH 100AF5 0105MOV 0081 AH0AF5 0108HLT0AF5 0109 C 2020年2月12日星期三 2 宏汇编 首先对扩展名为 ASM的汇编语言源程序进行汇编 产生扩展名为 OBJ的可重定位目标代码文件 然后用连接程序LINK连接一个或多个 OBJ模块 包括库文件 生成一个扩展名为 EXE的可执行目标文件 2020年2月12日星期三 MASM6 X包含了许多文件 最常用的文件如下 ML EXE汇编器LINK EXE连接器CV EXE调试器CodeView 1 汇编器ML EXE MasmandLink ML可以自动调用LINK 实现对程序的汇编和连接 设源文件为MYPRG ASM 汇编的基本命令格式为 ML cMYPRG ASM其中 源文件MYPRG的扩展名 ASM不能省略 若程序无语法错误 则汇编后将生成MYPRG OBJ文件 此外若不带参数 c 直接使用命令 MLMYPRG ASM则ML将自动调用连接器LINK进行连接 生成MYPRG OBJ与MYPRG EXE 这样就不需要单独使用LINK命令 MASM6 X介绍 2020年2月12日星期三 ML允许的选项 ML允许的选项有很多 常用选项如下 AT生成 COM文件 c只汇编 不连接 Fe 可执行文件名 指定生成的可执行文件名 Fl 列表文件名 产生列表文件 LST 缺省与源文件同名 Fm 映象文件名 产生映象文件 MAP 缺省与源文件同名 Fo 目标文件名 指定生成的目标文件名 I 包含路径名 指定include文件的路径名ML除了产生目标文件与可执行文件外 还可以根据需要生成些其他文件 如列表文件 Lst 与映象文件 map 例如命令 ML Fl Fmmyprg asm除了能生成myprg obj与myprg exe之外 还生成列表文件myprg lst与映象文件myprg map 2020年2月12日星期三 2 列表文件 是一个文本文件 其内容包括两部分 第一部分 从左到右依次列出数据或指令在段内的偏移地址 机器代码和源程序 若程序中有语法错误 则列出错误信息 第二部分 列出了程序中定义的所有标识符的信息 比如段的名称 大小与长度 变量与标号的名称 类型与偏移地址等 3 映象文件是一个文本文件 主要列出每个段的内存分配情况 其中给出了每个段的起点 终点 长度 段名 类别以及程序执行的起始地址等 2020年2月12日星期三 2020年2月12日星期三 关于DEBUG参数的说明 进制 在DEBUG中输入或显示的数据都是十六进制形式 分隔 命令和参数 参数和参数之间要用空格 逗号或制表符等分隔 地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上海房屋租赁合同样本:房屋租赁合同
- 2025年法院司法辅助人员题库检测试题打印带答案详解(黄金题型)
- 专业艺术品拍卖与交易合同
- 2025年发热试题及答案
- 2025年中国国新控股校园招聘笔试预测试题及答案
- 2025电子产品买卖标准合同
- 2025劳动合同的模板范本
- 多项目管理计划及监控平台
- 轻资产运营合同续签
- 社交商务投资协议
- 食品安全制度管理目录
- 【建筑专业】16J914-1公用建筑卫生间(完整)
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- 邮政市场业务员(中级)理论考试复习题库(附答案)
- DZ∕T 0070-2016 时间域激发极化法技术规程(正式版)
- 消化内镜进修总结汇报
- 兽医检验题库与答案
- 换电柜地租赁合同范本
- 影响安全生产的六种员工心理状态
- 儿童视角下幼儿园班级主题墙创设的策略研究
- (高清版)DZT 0432-2023 煤炭与煤层气矿产综合勘查规范
评论
0/150
提交评论