已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 教学重点 在掌握基本的汇编语言程序设计方法之后 进一步学习如何提高编程效率的各种实用方法 高级语言特性宏结构模块化 5 1高级语言特性 MASM6 0引入高级语言的程序设计特性条件控制伪指令 IF ELSE ENDIF循环控制伪指令 WHILE ENDW REPEAT UNTIL过程声明和过程调用伪指令 PROTO INVOKE 要调用带参数过程定义的过程 不应采用CALL指令 因为比较烦琐应该采用过程调用伪指令INVOKE使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明 5 1 3过程声明和过程调用伪指令 过程名PROC调用距离语言类型作用范围USES寄存器列表 参数 类型LOCAL参数表 汇编语言语句过程名ENDP 过程声明伪指令 用于事先声明过程的结构过程名PROTO调用距离语言类型 参数 类型过程调用伪指令INVOKE过程名 参数 如何调用 汇编语言程序 lt503 asm modelsmallchecksumdPROTOc word word 声明过程 stack dataarraydb12h 25h 0f0h 0a3h 3db68h 71h 0cah 0ffh 90hcountequ array 数组的元素个数resultdb 校验和 code startupINVOKEchecksumd count offsetarray 调用过程movresult al 保存校验和 exit0 例5 3 1 2 列表文件 checksumdPROCcUSESbxcx countp word arrayp wordmovbx arrayp BX 数组的偏移地址movcx countp CX 数组的元素个数xoral alsumd addal bx 求和 AL AL DS BX incbxloopsumdretchecksumdendpend 例5 3 2 2 列表文件 lt503 asm的列表文件 lt503 lst INVOKEchecksumd count offsetarray movax wordptrOFFSETarray pushax movax 000Ah pushax callchecksumd addsp 04hmovresult al 例5 3 1 2 checksumdPROCcUSESbxcx countp word arrayp word pushbp 起始代码 movbp sp pushbx 保护bx和cx pushcxmovbx arrayp arrayp BP 6 movcx countp cuontp BP 4 ret popcx 结尾代码 popbx popbp ret0000hchecksumcendp 例5 3 2 2 5 2宏结构程序设计 宏汇编重复汇编条件汇编 统称宏结构 宏 Macro 是汇编语言的一个特点 它是与子程序类似又独具特色的另一种简化源程序的方法 宏 具有宏名的一段汇编语句序列 宏定义时书写宏指令 这段汇编语句序列的缩写 宏调用时书写宏展开 宏指令处用这段宏代替的过程 宏汇编时实现宏的参数功能强大 颇具特色配合宏 还有宏操作符和有关伪指令 5 2 1宏汇编 宏定义 宏名macro 形参表 宏定义体endm mainbeginMACRO 定义名为mainbegin的宏 无参数movax data 宏定义体movds axENDM 宏定义结束mainendMACROretnum 带有形参retnummoval retnum 宏定义中使用参数movah 4chint21hENDM 宏注释符 宏调用 宏名 实参表 start mainbegin 宏调用 建立DS内容dispmsgstring 宏调用 显示字符串mainend0 宏调用 返回DOSendstart宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是 当汇编程序扫描源程序遇到已有定义的宏调用时 即用相应的宏定义体取代源程序的宏指令 同时用位置匹配的实参对形参进行取代 宏展开 宏展开 在汇编时 用宏定义体的代码序列替代宏指令的过程 start mainbegin 宏指令1movax data 宏展开1movds axmainend0 宏指令1moval 0 宏展开1movah 4ch1int21h 宏的参数 宏的参数使用非常灵活 宏定义时 可以无参数 例如5 4a的mainbegin可以带有一个参数 例如5 4a的mainend也可以具有多个参数 例如5 5a的shlext参数可以是常数 变量 存储单元 指令 操作码 或它们的一部分 也可以是表达式 例如5 5b的shift和shrot宏定义体可以是任何合法的汇编语句 既可以是硬指令序列 又可以是伪指令序列 例如5 6的dstring 宏定义shlextmacroshloprand shlnumpushcxmovcl shlnumshlshloprand clpopcxendm 宏指令shlextax 6 宏展开1pushcx1movcl 061shlax cl1popcx 例5 5a 统一4条移位指令的宏指令shiftmacrosoprand snum sopcodepushcxmovcl snums sopcode soprand clpopcxendm 统一移位和循环移位8条指令的宏指令shrotmacrosroprand srnum sropcodepushcxmovcl srnumsropcodesroprand clpopcxendm 例5 5b 替换操作符 宏定义dstringmacrostringdb string 0dh 0ah endm 宏调用dstringdstring 宏展开1db Thisisaexample 0dh 0ah 1db 0 Number 10 0dh 0ah 例5 6 转义注释符 传递注释符 宏操作符 宏注释符 用于表示在宏定义中的注释 采用这个符号的注释 在宏展开时不出现 替换操作符 用于将参数与其他字符分开 如果参数紧接在其他字符之前或之后 或者参数出现在带引号的字符串中 就必须使用该伪操作符 宏操作符 字符串传递操作符 用于括起字符串 在宏调用中 如果传递的字符串实参数含有逗号 空格等间隔符号 则必须用这对操作符 以保证字符串的完整 转义操作符 用于指示其后的一个字符作为一般字符 不含特殊意义 表达式操作符 用在宏调用中 表示将后跟的一个表达式的值作为实参 而不是将表达式本身作为参数 与宏有关的伪指令 局部标号伪指令LOCAL标号列表宏定义体采用了标号 应使用LOCAL加以说明它必须是宏定义MACRO语句之后的第一条语句宏定义删除伪指令PURGE宏名表不需要某个宏定义时 可以把它删除宏定义退出伪指令EXITM伪指令EXITM表示结束当前宏调用的展开 宏定义absolmacrooprdlocalnextcmpoprd 0jgenextnegoprdnext endm 例5 7 宏调用absolwordptr bx absolbx 宏展开1cmpwordptr bx 01jge 00001negwordptr bx 1 0000 1cmpbx 01jge 00011negbx1 0001 比较 仅是源程序级的简化 宏调用在汇编时进行程序语句的展开 不需要返回 不减小目标程序 执行速度没有改变通过形参 实参结合实现参数传递 简捷直观 灵活多变 还是目标程序级的简化 子程序调用在执行时由CALL指令转向 RET指令返回 形成的目标代码较短 执行速度减慢需要利用寄存器 存储单元或堆栈等传递参数 宏 子程序 宏与子程序具有各自的特点 程序员应该根据具体问题选择使用那种方法通常 当程序段较短或要求较快执行时 应选用宏 当程序段较长或为减小目标代码时 要选用子程序 比较结论 宏 子程序 5 2 2重复汇编 重复汇编指在汇编过程中 重复展开一段 基本 相同的语句重复汇编没有名字 不能被调用重复汇编常用在宏定义体中 也可以在一般汇编语句中使用重复汇编伪指令有三个 REPEAT 按参数值重复FOR 按参数个数重复FORC 按参数的字符个数重复最后 用ENDM结束 按参数值重复 REPEAT重复次数重复体ENDM char A REPEAT26dbcharchar char 1ENDM 1dbchar 等效于db A 1char char 11dbchar 等效于db B 1char char 1 1dbchar 等效于db Z 1char char 1 按参数个数重复 FOR形参 实参表 重复体ENDM FORregad pushregadENDM 1pushax1pushbx1pushcx1pushdx 按参数字符个数重复 FORC形参 字符串重复体ENDM FORCregad dcbapop regad xENDM 1popdx1popcx1popbx1popax 5 2 3条件汇编 条件汇编伪指令在汇编过程中 根据条件决定汇编的语句IFxx表达式 满足 汇编分支语句体1分支语句体1 ELSE 不满足 汇编分支语句体2分支语句体2 ENDIF 条件汇编结束 pdatamacronumIFnumlt100 如果num 100 则汇编如下语句dbnumdup ELSE 否则 汇编如下语句db100dup ENDIFendmpdata12 宏调用 db12dup 宏汇编结果 pdata102 宏调用 db100dup 宏汇编结果 例5 10 宏结构的作用 宏汇编 重复汇编和条件汇编为源程序的编写提供了很多方便 灵活运用它们可以编写出非常良好的源程序来汇编系统中有些以圆点起始的伪指令 如 startup exit等 实际上是一种宏结构 dstringMACROstring 定义字符串db 设置数据段地址movax dssegmovds axENDMdispmsgMACROmessagemovdx offsetmessagemovah 09hint21hENDM 例题5 4 1 3 mainendMACROretnum 返回DOS 可不带参数ifbmovah 4ch 没有参数elsemovax 4c00h retnumAND0ffh 有参数endifint21hENDM 例题5 4 2 3 modelsmall stack256 datamsg1equthisbytedstringmsg2equthisbytedstring codestart mainbegin data 建立DS内容dispmsgmsg1 显示msg1字符串dispmsgmsg2 显示msg2字符串mainend 返回DOSendstart 例题5 4 3 3 将程序分段 采用子程序或宏结构都是进行模块化程序设计本节介绍开发大型程序时采用的方法 源程序文件的包含目标模块连接子程序库 5 3模块化程序设计 例题5 12将键盘输入的数据按升序输出 把源程序分放在几个文本文件中 在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE文件名可将常用的子程序形成 ASM汇编语言源文件可将常用的宏定义存放在 MAC宏库文件中可将常量定义 声明语句组织在 INC包含文件中例5 12a 宏库文件lt512a mac 主程序文件lt512a asm 子程序文件sub512a asm 5 3 1源程序文件的包含 dispcharmacrochar 显示char字符movdl charmovah 2int21hendmdispmsgmacromessage 显示message字符串movdx offsetmessagemovah 9int21hendm Lt512a mac includelt512a mac dispmsgmsg1 提示输入数据movbx offsetbufcallinput 数据输入cmpcx 0jestart4 没有输入数据则退出movcount cx 显示输入的数据 数据排序 显示经排序后的数据start4 exit0includesub512a asmend Lt512a asm 子程序源文件有3个子程序ALdisp 显示2位16进制数子程序 例4 10 sorting 排序子程序 例4 8 input 键盘输入子程序还包含一个宏convert 将DX两位ASCII码转换为两位16进制数 sub512a asm 让我们重点分析键盘输入子程序input 键盘输入子程序 入口参数 ds bx 存放数据的缓冲区 出口参数 cx 数据个数inputprocpushaxpushdxxorcx cx 数据个数清0input01 xordx dx 输入字符清0input02 movah 1 键盘输入一个字符int21h input之一 input10 cmpal 0dhjeinput30 是回车 结束整个数据的输入cmpal jeinput20 是空格和逗号 确认输入了一个数据cmpal jeinput20cmpal 08hjeinput17 是退格 丢弃本次输入的数据 出错 input之二 cmpal 0 有效数字判断 图5 2b jbinput17 小于 0 不是有效数字 出错cmpal f jainput17 大于 f 不是有效数字cmpal a jbinput11subal 20h a f 转换成大写 A F jmpinput12input11 cmpal F jainput17 字符小于 a 大于 F 出错cmpal A jaeinput12 是 A F 有效字符cmpal 9 jainput17 是 0 9 有效字符 input之三 input12 cmpdl 0 有效字符的处理jneinput13movdl al dl 0 输入了一个数据的低位 则dl aljmpinput02 转到字符输入input13 cmpdh 0jneinput17 dl 0 dh 0输入3位数据 出错movdh dl dl 0 dh 0输入了一个数据的高位movdl al dh dl dl aljmpinput02 转到字符输入 input之四 input17 movdl 7 输入错误处理movah 2int21hmovdl movah 2int21hjmpinput01 转到输入一个数据 input之五 转换正确的输入数据 图5 2c input20 convertjmpinput01 转到输入一个数据input30 convertpopdxpopaxret 返回 出口参数已设定inputendp input之六 将DX两位ASCII码转换为两位16进制数 图5 2c convertmacrolocalinput21 input22localinput24 input25cmpdl 0 dl 0 没有要转换的数据 退出jeinput25 convert之一 cmpdl 9 jbeinput21subdl 7 字符A F 则减7input21 anddl 0fh 转换低位cmpdh 0 dh 0 没有高位数据jeinput24cmpdh 9 jbeinput22subdh 7input22 shldh 1shldh 1shldh 1shldh 1 转换高位ordl dh 合并高 低位 convert之二 源文件包含的操作步骤 分别编辑生成各个文件 汇编 连接主程序文件 input24 mov bx dl 存入缓冲区incbxinccx 数据加1input25 endm convert之三 把常用子程序写成独立的源程序文件 单独汇编 形成子程序的目标文件 OBJ主程序也经过独立汇编之后形成目标文件连接程序将所有目标文件连接起来 最终产生可执行文件需要遵循的原则 声明共用的变量 过程等 实现正确的段组合 处理好参数传递问题 5 3 2目标代码文件的连接 声明共用的变量 过程 各个模块间共用的变量 过程等要说明PUBLIC标识符 标识符 定义标识符的模块使用EXTERN标识符 类型 标识符 类型 调用标识符的模块使用标识符是变量名 过程名等类型是byte word dword 变量 或near far 过程 在一个源程序中 public extern语句可以有多条各模块间的public extern伪指令要互相配对 并且指明的类型互相一致 实现正确的段组合 子程序文件必须定义在代码段中 也可以具有局部的数据变量采用简化段定义格式 只要采用相同的存储模式 容易实现正确的近或远调用完整段定义格式中 为了实现模块间的段内近调用 near类型 各自定义的段名 类别必须相同 组合类型都是public 实际的程序开发中 各个模块往往由不同的程序员完成 不易实现段同名或类别相同 所以索性定义成远调用 far类型 定义数据段时 同样也要注意这个问题 当各个模块的数据段不同时 要正确设置数据段DS寄存器的段基地址 处理好参数传递问题 少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在缓冲区 用寄存器或堆栈传送数据的存储地址还可利用变量传递参数 但是要采用public extern声明为公共 全局 变量这些也是子程序间的参数传递方法另外 第7章混合编程介绍了更好的堆栈传递参数方法 可以采用 例5 12b 主程序lt512b asm并入宏定义子程序文件sub512b asm 要加上段定义语句 声明语句等 但不需要起始点和结束点 模块连接的操作步骤 分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件 形成可执行文件 宏定义 codepubliccount 定义count共用externALdisp near sorting near input far 声明其他模块中的子程序 startup exit0 去掉 lt512a asm中的 包含语句end Lt512b asm modelsmall 定义同样的存储模式externcount word 在其他模块定义了字变量count code 子程序在代码段中publicaldisp sorting input 3个子程序是共用的Aldispproc 仍然作为近调用sortingproc 仍然作为近调用inputprocfar 修改为远调用 movcount cx 提供出口参数 inputendpend 结束汇编 sub512b asm 把常用子程序写成独立的源文件 单独汇编形成OBJ文件后 存入子程序库主程序也单独汇编形成OBJ文件主程序连接时 调入子程序库中的子程序模块 产生最终的可执行文件例5 12c 主程序文件lt512c asm 子程序文件sub512c1 asm 子程序文件sub512c2 asm 子程序文件sub512c3 asm 5 3 3子程序库的调入 子程序库 子程序库文件 LIB 是子程序模块的集合 其中存放着各子程序的名称 目标代码及有关定位信息存入库的子程序的编写与目标文件连接方法中的要求一样 只是为方便调用 更加严格子程序文件编写完成后 汇编形成目标文件 然后利用库管理工具程序LIB EXE 把子程序目标模块逐一加入到库中LIB库文件名 子程序目标文件名库管理程序LIB帮助创建 组织和维护子程序模块库 例如增加 删除 替换 合并库文件等 宏定义 codeexternALdisp nea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年智能运动手表项目评估报告
- 2026年智能座圈加热项目公司成立分析报告
- 2026年类脑计算系统项目公司成立分析报告
- 移动应用架构设计与实现要点
- 教师师德师风建设与考核制度
- 教师专业发展制度
- 幼儿园活动记录存档制度
- 幼儿园教职工工作质量考核制度
- 棒球课程设计和方法
- 市政道路施工进度跟踪制度
- 食品检验检测技术专业介绍
- 2025年事业单位笔试-贵州-贵州财务(医疗招聘)历年参考题库含答案解析(5卷套题【单项选择100题】)
- 二年级数学上册100道口算题大全(每日一练共12份)
- 药店物价收费员管理制度
- 数据风险监测管理办法
- 国家开放大学《公共政策概论》形考任务1-4答案
- 肝恶性肿瘤腹水护理
- 儿童语言发育迟缓课件
- 2025年河南省郑州市中考一模英语试题及答案
- 《高等职业技术院校高铁乘务专业英语教学课件》
- DB15T 3758-2024基本草原划定调整技术规程
评论
0/150
提交评论