5_高级汇编语言程序设计.ppt_第1页
5_高级汇编语言程序设计.ppt_第2页
5_高级汇编语言程序设计.ppt_第3页
5_高级汇编语言程序设计.ppt_第4页
5_高级汇编语言程序设计.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1 封面 2 第五章高级汇编语言程序设计 第五章高级汇编语言程序设计5 1高级语言特性5 2宏结构程序设计5 3模块化程序设计5 4输入输出程序设计本章重点及习题分析 MASM6 X新特性 3 5 1高级语言特性 5 1高级语言特性通过引入一些伪指令 使汇编语言程序设计具有高级语言程序设计的特性 即可以采用类似高级语言的形式设计分支 循环和子程序结构 大大减轻了使用汇编语言编程的工作量 5 1 1条件控制伪指令5 1 2循环控制伪指令5 1 3过程声明和调用伪指令 返回第五章 4 5 1 1条件控制伪指令 5 1 1条件控制伪指令 IF ELSEIF ELSE ENDIF 类似高级语言的IF THIN ELSE和ENDIF的相应功能 汇编时展开 自动生成相应的比较和条件转移指令 实现分支结构 IF条件表达式 条件为真 执行分支体1分支体1 ELSEIF条件表达式 前面IF 及前面ELSEIF 为假 分支体2 当前条件为真 执行分支体2 ELSE 前面IF 及前面ELSEIF 为假 分支体3 执行分支体3 ENDIF 分支结束 5 条件控制伪指令 不考虑多层嵌套 有4种基本格式 IF条件表达式 条件表达式为真 执行分支体 分支体 否则执行后面 ENDIF 语句 IF条件表达式分支体1 ELSE分支体2 ENDIF 分支体1 2必做其一 6 条件控制伪指令 IF条件表达式分支体1 ELSEIF条件表达式分支体2 分支体1和分支体2可能 ENDIF 都不做 IF条件表达式 条件为真 执行分支体1分支体1 ELSEIF条件表达式 前面IF 及前面ELSEIF 分支体2 为假当前条件为真 执行分支体2 ELSE 前面IF 及前面ELSEIF 为假 分支体3 执行分支体3 ENDIF 分支结束 7 条件表达式的三个问题 三个问题 1 关于条件表达式中的操作符2 条件表达式举例3 条件表达式中的有符号数和无符号数的规定 8 1 关于条件表达式中的操作符 1 关于条件表达式中的操作符1 表5 1列出的操作符用于伪指令的条件表达式 第三章介绍的操作符用于数值表达式和地址表达式 构成指令的操作数 两类操作符不可混淆 例如表示相等 条件表达式用 数值表达式用 EQ 表示逻辑与 条件表达式用 数值表达式用AND 2 操作符可分为 比较 逻辑运算和测试三类 其中测试又可分为 标志测试 位测试 寄存器测试 存储单元测试 reg mem 3 操作符中 单目操作符为 标志测试 寄存器测试和存储单元测试 其他都是双目操作符 4 操作符的优先级可用圆括号规定 9 2 条件表达式举例 1 2 条件表达式举例reg 寄存器不为0 条件为真 为0 条件为假 ifaldecal endifmem 存储器不为0 条件为真 为0 条件为假 ifbyteptr bx decal endifcarry overflow 位测试操作符使用格式 数值表达式 位数如 AL 5 测试AL寄存器的D5 10 2 regOPreg OP为表5 1中任意双目操作符ax bx al bl al寄存器不为0 条件为假 为0 条件为真注释 1 条件控制伪指令不支持数值表达式 如 if x 1 dx 11 3 条件表达式中的符号数 1 3 条件表达式中比较的两个数据可能是无符号数 也可能是有符号数 可分成以下情况 数据为变量 用DB DW DD等定义的变量一律作为无符号数 若需要进行有符号数比较 必须使用SBYTE SWORD SDWORD定义 数据为寄存器或存储单元 默认为无符号数 若需要进行有符号数比较 必须使用操作符SBYTEPTR或SWORDPTR指明类型 SBYTEPTRBXSBYTEPTR BX SI DISP Vardb 1varsbyte 1 Ifal sbyteptrvar ifal var 12 2 若表达式中有一个数据为有符号数 则强制另一个数据也作为有符号数进行比较 如 IFSWORDPTRBX AX AX被强制作为有符号数看待 对变量不适用 若变量作为有符号数使用 必须用sbyte sword sdword定义 13 条件控制伪指令 end 6 本节新增内容 用于条件表达式的操作符有符号数专用的变量定义伪指令有符号数专用的类型说明操作符 分析教材举例 浏览汇编结果 例题5 1 实根判断 回5 1 14 5 1 2循环控制伪指令 5 1 2循环控制伪指令 WHILE和 ENDW 当型循环结构 REPEAT和 UNTIL REPEAT和 UNTILCXZ 直到型 BREAK 退出循环 CONTINUE 转向循环体开始格式1 WHILE条件表达式 表达式为真 执行循环体循环体 ENDW 循环体结束 15 循环控制伪指令 格式2 REPEAT 重复执行循环体循环体 UNTIL条件表达式 直到条件表达式为真格式3 REPEAT 重复执行循环体循环体 UNTILCXZ 条件表达式 CX CX 1 直到CX 0 或条件表达式结果为真 16 循环控制伪指令 注释 对 REPEAT UNTILCXZ 条件表达式 1 不带表达式 结束循环的条件为CX 1减到0 循环控制被汇编为LOOP指令 2 带条件表达式 结束循环的条件为CX减到0或表达式为真 表达式只能比较寄存器与寄存器 存储单元 常数 以及存储单元与常数相等 或不等 所以 汇编后的指令为LOOPE或LOOPNE 分析教材举例 浏览汇编结果 例题5 2 求数组前若干非负数之和 浏览例题5 2汇编结果 回5 1 17 5 1 3过程声明和调用伪指令 5 1 2过程声明和过程调用伪指令利用堆栈传递参数为常用方式 但传统的编程方法容易出错 MASM6 X扩充了PROC伪指令的功能 并新增了几条伪指令 使调用子程序具有高级语言的特性 按使用顺序介绍 1 过程声明PROTO过程名PROTO语言类型 参数名 类型 注释 1 使用带参数的过程调用 必须定义语言类型 一般用C或STDCALL 2 参数必须用逗号打头 多个参数之间用逗号分割 3 参数名可省略 类型不可省略 例5 3CHECKSUMDPROTOC V1 WORD V2 WORD 18 过程定义格式 2 过程定义PROC过程名PROC语言类型 USES寄存器列表 形参1 类型 形参2 类型 LOCAL参数表 过程名ENDP注释 1 语言类型与USES之间用空格分割 2 寄存器列表 用空格分割的通用寄存器 决定保护现场和恢复现场 3 参数用逗号打头 且用逗号分割 参数名为形参名 调用时被实参替换 4 如果过程用到局部变量 用LOCAL伪指令定义 19 几个可选项的说明 过程定义中其他几个可选项的说明 1 调用距离 为NEAR或FAR 简化段定义格式中 由 model语句选择的存储模式决定 small模式下 调用距离为NEAR 可省略 2 作用范围 为PUBLIC PRIVATE等 表示该过程是否对其他模块可见 可引用 默认为PUBLIC 表示该过程其他模块可见 可引用 可省略 3 起始参数 是一个可带参数的宏的名字 该宏决定过程的起始代码和结束代码 例如控制参数如何设置 如何保存寄存器等 MASM调用的宏由用户自行定义 可省略 20 过程定义举例 例5 3过程定义checksumdPROCcUSESbxcx countp word arryp wordmovbx arrypmovcx countp retchecksumdENDP 语言类型 寄存器列表 形参 形参类型 21 过程调用 3 过程调用伪指令INVOKEINVOKE过程名 实参1 实参2 INVOKEchecksumd count offsetarray调用时 实参用逗号打头 且用逗号分隔 实参1替换形参1 实参2替换形参2 例题5 3源程序 语言类型 C 例题5 3汇编结果 例题5 3a源程序 语言类型 STDCALL 例题5 3a汇编结果 22 过程定义的说明 end 几点说明 如果在过程中使用参数 必须指定语言类型 如果在 MODEL语句中和过程定义中都没有指定语言类型 会产生汇编错误 如果在 MODEL语句中指定了语言类型 则过程声明和过程定义中可以省略语言类型 MODELSMALL C 指定了C语言类型 过程定义和过程声明必须一致 如编程过程中修改了一个 忘记修改另一个 则会造成错误 为避免此种情况发生 可以把全部过程定义放在代码段内开始的部分 STARTUP之前 而省略过程声明 返回第五章 回5 1 23 5 2宏结构程序设计 5 2宏结构程序设计对常用的 具有独立功能的程序段 除了可定义为过程外 还可定义为宏结构或宏指令 宏指令提供了简化程序设计的另一种方法 通常与宏指令配合使用的伪指令还有重复汇编和条件汇编 宏指令 重复汇编和条件汇编统称宏结构 本节介绍宏指令的定义和调用 以及重复汇编和条件汇编 5 2 1宏汇编5 2 2重复汇编5 2 3条件汇编 返回第五章 24 5 2 1宏汇编宏的定义和调用 5 2 1宏汇编1 宏的定义和调用 宏展开宏定义宏名MACRO 形参1 形参2 宏定义体 指令语句的组合ENDM宏调用宏名 实参1 实参2 例题5 4a 5 4b 25 宏展开 宏展开汇编时 用宏体取代宏调用 用实参取代形参 称为宏展开 宏展开时 实参替代形参按位置匹配的原则 实参与形参的个数可以不等 参数替换时 多余的实参不于考虑 多余的形参以空格替代 实参替代形参时 不进行类型检查 完全是字符串的替代 替代后是否合法有效 由汇编程序翻译时进行语法检查 宏展开后5 4B 26 宏的参数及宏操作符 2 宏的参数参数的形式灵活多变 可以是常数 变量 存储单元 指令操作码或它们的一部分 也可以是表达式 使用灵活多变的参数 同一个宏定义甚至可以执行不同的操作 几个宏操作符 替换操作符 用于将参数与其他字符分开 用在宏体中 如果参数紧接在其他字符之前或之后 或者参数出现在带引号的字符串中 就必须使用该伪操作符 27 宏操作符 字符串传递操作符 用在宏调用的实参中 在宏调用中 如果传递的字符串实参数含有逗号 空格等间隔符号 则必须用这对操作符 以保证字符串的完整 转义操作符 指示其后的一个字符作为一般字符 无特殊意义 如 宏注释符 用于表示在宏定义中的注释 采用这个符号的注释 在宏展开时不出现 例题5 5A 5 5B 5 6 REQ 默认值 可参考 宏汇编大全 28 与宏有关的伪指令1 3 与宏有关的伪指令 局部标号伪指令LOCAL标号列表 当宏定义体内有标号 同一程序内多次调用 会造成标号的重复定义 用LOCAL说明的标号 第一次宏展开时 产生的标号为 0000 第二次宏展开时产生的标号为 0001 ffff 注释 只能在宏体内使用 只能紧接在宏定义语句之后使用 29 与宏有关的伪指令2 如宏定义 ABSOLMACROOPRDLOCALNEXTCMPOPRD 0JGENEXTNEGOPRDNEXT ENDM宏调用1 ABSOLWORDPTR BX 宏调用2 ABSOLBX 30 与宏有关的伪指令3 宏展开后的代码 CMPWORDPTR BX 0JGE 0000NEGWORDPTR BX 0000 CMPBX 0JGE 0001NEGBX 0001 第一个宏展开 第二个宏展开 31 与宏有关的伪指令2 宏定义删除PURGE宏名表 在各类名字中 只有宏名可以和指令同名 当同名时 宏定义优先级最高 宏定义退出 宏展开退出 EXITM 对EXITM后面的语句停止宏展开 32 宏与子程序 4 宏与子程序相同点 简化源程序的设计和结构不同点 处理时间段不同 对目标程序的长度影响不同 对目标程序执行速度的影响不同 传递参数的方式不同 传递参数过程中如出现错误 错误的性质不同 宏 语法 子程序 逻辑 通常 当程序段较短 要求较快执行时 用宏定义 当程序段较长 或为减小目标代码长度 用子程序 回5 2 33 5 2 2重复汇编 5 2 2重复汇编重复汇编指在汇编过程中 重复展开一段 基本 相同的语句 如果程序中需要连续重复一段相同的语句或基本相同的语句 可以使用重复汇编伪指令 也就是让汇编程序代替程序员完成重复的工作 重复汇编伪指令常在宏体内使用 但也可以在宏体外使用 重复汇编没有名字 不能被调用 重复汇编伪指令有3条 3条伪指令区别在于如何规定重复次数 34 按参数值重复伪指令 1 按参数值重复伪指令REPEAT重复次数重复体ENDM 例5 8定义26个大写字母char A AztabelEQUTHISBYTEREPEAT26DBcharchar char 1ENDM 汇编结果 DBcharchar char 1DBcharchar char 1 DBcharchar char 1 35 按参数个数重复伪指令 1 按参数个数重复伪指令FOR形参 重复体ENDM 例5 9a保护常用寄存器FORregad PUSHregadENDM 汇编结果 PUSHAXPUSHBXPUSHCXPUSHDX 形参 重复体中使用的参数注意 形参只有一个实参 汇编展开时使用的参数 用其替换重复体中出现的形参 按实参个数重复 必须使用 括起 36 按参数字符个数重复伪指令 1 按参数字符个数重复伪指令FORC形参 字符串 FORC形参 重复体ENDM 例5 9b恢复常用寄存器FORCregad dcbaPOP regad xENDM 汇编结果 POPDXPOPCXPOPBXPOPAX 回5 2 37 5 2 3条件汇编 5 2 3条件汇编条件汇编伪指令使汇编程序根据某种条件是否成立决定是否汇编某段语句序列条件汇编伪指令格式 IFxx表达式分支语句体1 ELSE分支语句体2 ENDIF伪指令中的 xx 为组成条件汇编伪指令的其他字符 不同的 xx 表达的条件不同 如 IF表达式 表达的条件为 如表达式的值不为0 则条件满足 IFE表达式 表达的条件为 如表达式的值为0 则条件满足 见教材表5 3 38 条件汇编伪指令 IF IFE 中的表达式 条件汇编伪指令 IF IFE 中的表达式 运算符使用第三章介绍的关系运算符 EQ NE GT LT GE LE注意 不同于条件控制伪指令 IF 中使用的运算符 表达式用0FFFFH 或任意非0数 表示真 用0表示假 39 例5 10 例5 10 定义一个元素个数不超过100个的数组 PDATAMACRONUMIFNUMLT100DBNUMDUP ELSEDB100DUP ENDIFENDM 宏调用 PDATA12宏展开 DB12DUP 宏调用 PDATA105宏展开 DB100DUP 40 例5 11 1 例5 11编写宏MAXNUM 计算3个以内的数据中的最大值 并将结果送入AX寄存器 要求根据宏调用时的实参个数展开相应代码 分析 1 至少应有一个参数 故第一个参数设为不可缺少 2 宏指令应能够作到 根据实参情况产生不同的程序段 进行不同的处理 实参可分三种情况 A 只有一个参数B 有两个参数C 有三个参数显然 应使用条件汇编 41 2 MAXNUMMACROWX REQ WY WZLOCALMAXNUM1 MAXNUM2MOVAX WX 只有一个实参替换WXIFNB 还有WY时CMPAX WYJGEMAXNUM1MOVAX WYENDIFMAXNUM1 IFNB 当有WZ时 汇编本段CMPAX WZJGEMAXNUM2MOVAX WZENDIFMAXNUM2 ENDM 42 3 宏调用 汇编结果 Maxnumbx 只有1个参数 Movax bx 只有1个参数 Maxnum3 4 有2个参数 Movax 3Cmpax 4Jge 0000Movax 4 0000 43 4 宏调用 汇编结果 Maxnumn1 n2 n3 有3个参数 movax n1cmpax n2jge 0000movax n2 0000 cmpax n3jge 0001movax n3 0001 注意区别条件控制伪指令和条件汇编伪指令 44 P149例题 1 P149例题 用宏结构实现信息显示 dstringMACROstring 定义字符串db 显示 形参为偏移地址movdx offsetmessagemovah 09hint21hENDM 45 2 mainendMACROretnum 返回DOS 可不带参数ifb 宏调用没有实参数movah 4chelse 有参数movax 4c00h retnumAND0ffh endifint21hENDM 保证不破坏AH的内容 46 3 modelsmall stack256 datamsg1equthisbytedstringmsg2equthisbytedstring codestart mainbegin data 建立DS内容dispmsgmsg1 显示msg1字符串dispmsgmsg2 显示msg2字符串mainend 返回DOSendstart 回5 2 返回第五章 47 5 3模块化程序设计 5 3模块化程序设计开发大型或较复杂的程序时 往往需要结合使用其他方法 如源程序文件的包含 目标代码文件的连接 子程序库的使用等等 本节简单介绍以上三种方法 5 3 1源程序文件的包含5 3 2目标代码文件的连接5 3 3子程序库的使用 返回第五章 48 5 3 1源程序文件的包含 5 3 1源程序文件的包含对大型源程序 可以分成几个源文件 待汇编时在用包含伪指令INCLUDE将它们结合成一个文件进行汇编 格式为 INCLUDE文件名汇编时 汇编程序将指定的文件插在伪指令所在的位置 与其他部分同时汇编 适用于 汇集常用的子程序为一个源文件 asm 汇集常用的宏定义为一个宏库文件 mac 汇集常用的常量定义和声明为一个包含文件 inc 当源程序需要使用上述文件中的某些内容时 不用重新编写 只要使用包含伪指令将文件包含即可 49 例5 12a 例5 12a利用源程序包含的方法实现将输入的数据按升序输出 要求 最多输入100个无符号字节数据 以十六进制形式输入 按照升序排序并显示 源程序由三个单独的文件组成 宏库文件lt512a mac 显示字符和字符串 子程序文件sub512a asm 输入 排序 主程序文件lt512a asm 提供入口参数 处理出口参数 排序 显示 50 宏库文件lt512a mac 1 宏库文件lt512a macdispcharmacrochar 显示char字符movdl charmovah 2int21hendmdispmsgmacromessage 显示message字符串movdx offsetmessagemovah 9int21hendm 51 子程序文件sub512a asm 2 子程序文件sub512a asm子程序源文件有3个子程序ALdisp 显示2位16进制数子程序 例4 10 sorting 排序子程序 例4 8 input 键盘输入子程序 后面分析 还包含一个宏convert 将DX两位ASCII码转换为两位16进制数 52 主程序文件lt512a asm 3 主程序文件lt512a asmincludelt421a mac 包含宏库文件 置于主程 model stack data code等序头部dispmsgmsg1 提示输入数据movbx offsetbufcallinput 数据输入cmpcx 0jestart4 没有输入数据则退出movcount cx 显示输入的数据 数据排序 显示经排序后的数据start4 exit0includesub421a asm 包含子程序文件end 将三个文件分别编辑 主程序文件用两条包含伪指令将宏库文件和子程序文件包含 注意包含伪指令的位置 然后汇编并连接主程序文件 即可得到可执行文件 53 键盘输入子程序 1 键盘输入子程序 每次输入1位或2位十六进制数字 空格或逗号确认输入 退格键删除当前输入的数据 回车表示所有数据输入结束 入口参数 ds bx 存放数据的缓冲区 出口参数 cx 数据个数 54 2 inputprocpushaxpushdxxorcx cx 数据个数清0input01 xordx dx 输入字符清0input02 movah 1 键盘输入一个字符int21h 55 3 input10 cmpal 0dhjeinput30 是回车 结束整个数据的输入cmpal jeinput20cmpal jeinput20 是空格和逗号 确认输入了一个数据cmpal 08hjeinput17 是退格 丢弃本次输入的数据 出错 56 4 cmpal 0 有效数字判断 图5 2b jbinput17 小于 0 不是有效数字 出错cmpal f jainput17 大于 f 不是有效数字cmpal a jbinput11 检查是否再 a F 之间subal 20h a f 转换成大写 A F jmpinput12 有效数据处理input11 cmpal F jainput17 字符小于 a 大于 F 出错cmpal A jaeinput12 是 A F 有效字符cmpal 9 jainput17 字符小于 A 大于 9 出错 57 5 input12 cmpdl 0 有效字符的处理jneinput13 dl 0 已经有一位数据 movdl 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 转到字符输入 58 6 input17 movdl 7 输入错误处理 07h 控制码 鸣镝 movah 2int21hmovdl movah 2int21hjmpinput01 转到输入一个数据 59 7 确认一个数据后 转换正确的输入数据 图5 2c input20 convertjmpinput01 转到输入一个数据 收到回车符 最后一个数据输入结束 转此input30 convertpopdxpopaxret 返回 出口参数已设定inputendp 60 宏 convertmacro 1 将DX两位十六进制形式的ASCII码转换为两位16进制数 8位二进制数 convertmacrolocalinput21 input22localinput24 input25cmpdl 0jeinput25 dl 0 没有要转换的数据 退出 61 2 cmpdl 9 jbeinput21subdl 7 字符A F 则减7input21 anddl 0fh 转换低位cmpdh 0 dh 0 没有高位数据jeinput24cmpdh 9 jbeinput22subdh 7 字符A F 则减7input22 shldh 1 高位乘16shldh 1shldh 1shldh 1 转换高位ordl dh 合并高 低位 62 3 end input24 mov bx dl 存入缓冲区incbxinccx 数据个数加1input25 endm Back5 3 63 5 3 2目标代码文件的连接 5 3 2目标代码文件的连接将常用子程序写成一个或多个源文件 并对其进行汇编 得到一个个单独的OBJ文件 对主程序也单独进行汇编得到OBJ文件 最后利用连接程序把多个OBJ文件连接 形成可执行文件 用这种方法可缩短汇编时间 但宏结构文件 常量定义 声明文件等文件通常仍编辑成包含文件 因此这种方法往往和 源程序文件的包含 共同使用 需要遵循的原则 声明共用的变量 过程等 实现正确的段组合 处理好参数传递问题 64 原则1 原则1各个模块间公用的变量 过程等要说明PUBLIC标识符 标识符 定义标识符的模块使用EXTERN标识符 类型 标识符 类型 调用标识符的模块使用标识符是变量名 过程名等类型是byte word dword 变量 或near far 过程 在一个源程序中 public extern语句可以有多条各模块间的public extern伪指令要互相配对 并且指明的类型互相一致 65 原则2 原则2子程序文件必须定义在代码段中 也可以具有局部的数据变量采用简化段定义格式 只要采用相同的存储模式 容易实现正确的近或远调用完整段定义格式中 为了实现模块间的段内近调用 near类型 各自定义的段名 类别必须相同 组合类型都是public 实际的程序开发中 各个模块往往由不同的程序员完成 不易实现段同名及类别相同 所以索性定义成远调用 far类型 定义数据段时 同样也要注意这个问题 当各个模块的数据段不同时 要正确设置数据段DS寄存器的段基地址 66 原则3 原则3少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在缓冲区 用寄存器或堆栈传送数据的存储地址还可利用变量传递参数 但是要采用public extern声明为公共 全局 变量这些也是子程序间的参数传递方法另外 更好的传递参数方法是用堆栈传递参数 67 例5 12b 例5 12b利用目标代码文件连接的方法 实现将输入的数据按升序输出 宏定义并入主程序lt512b asm 子程序文件sub512b asm 要加上段定义语句 声明语句等 但不需要起始点和结束点 模块连接的操作步骤 分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件 形成可执行文件 68 例5 12b主程序 例5 12b主程序 宏定义 也可以使用包含语句 codepubliccount 定义 本模块的 count公用externALdisp near sorting near input far 声明其他模块中的子程序 startup exit0 去掉 lt512a asm中的 包含语句end 69 例5 12b子程序 end 例5 12b子程序 modelsmall 定义同样的存储模式externcount word 在其他模块定义了字变量count code 子程序在代码段中publicaldisp sorting input 3个子程序是共用的Aldispproc 仍然作为近调用sortingproc 仍然作为近调用inputprocfar 修改为远调用 movcount cx 提供出口参数 inputendpend 结束汇编 Back5 3 70 5 3 3子程序库的使用 5 3 3子程序库的使用将子程序源文件生成OBJ文件 然后和主程序连接 由于被连接的每个OBJ文件的全部代码都会成为可执行程序的一部分 在最后生成的可执行文件中 会包括无用的子程序 造成可执行程序庞大 为此 可使用子程序库 子程序库 LIB文件 是子程序模块的集合 库文件中存放着各子程序的名称 目标代码以及有关的定位信息 执行连接程序时 只要指定所需要的库文件 连接程序将从库文件中摘取主程序调用的子程序 而未调用的子程序不会进入最后的可执行程序 库文件由MASM提供的LIB EXE程序管理 71 例题5 12c 1 例题5 12c利用子程序库的调入方法 实现将输入的数据按升序输出 实现步骤 1 编辑4个文件 主程序文件lt512c asm 子程序文件sub512c1 asm 显示 子程序文件sub512c2 asm 排序 子程序文件sub512c3 asm 输入 72 例题5 12c 2 2 分别汇编 得到4个目标模块 obj文件 3 生成子程序库文件 或加入其它子程序库 LIB库文件名 子程序目标文件名LIBsub512c lib sub512c1 obj sub512c2 obj sub512c3 obj4 运行连接程序 linklt512c obj提示输入库文件时 输入sub512c lib 也可在主程序源文件中使用子程序库包含伪指令includelibsub512c lib 73 例题5 12主程序 例题5 12主程序 宏定义 codeExternALdisp near sorting near input near 声明其他模块中的子程序 startup callinput exit0end 74 sub512c1 asm sub512c1 asm modelsmall codepublicaldispAldispproc Aldispendpend 75 sub512c2 asm sub512c2 asm modelsmall codepublicsortingsortingproc sortingendpend 76 sub512c3 asm end sub512c3 asm modelsmall codepublicinputinputproc inputendpend Back5 3 返回第五章 77 5 4输入输出程序设计 5 4输入输出程序设计完成CPU与外设端口之间数据传送的程序称为输入输出程序 通常有3种端口 数据口 状态口以及控制口 分别对应接口中的数据寄存器 状态寄存器以及控制寄存器 每个端口有一个端口地址 CPU使用该地址访问接口中的相应寄存器 执行输入输出的指令为IN指令和OUT指令 输入输出 数据交换 的方式分为两大类 程序控制输入输出方式和直接存储器存取方式 DMA方式 由于该部分内容是 微机原理和接口技术 的主要内容之一 本节只进行简单介绍 返回第五章 78 数据交换方式 79 1 无条件传送方式 1 无条件传送方式CPU可以在任何时刻向端口写入数据和从端口读入数据 也就是说 CPU假设外设接口电路总是处于准备好的状态 采用无条件传送方式 只适用于简单外设 或定时关系以知的外设 如输出设备为数码显示电路 或输入设备为一组提供某种数据的开关 在这种情况下 CPU执行输出或输入操作不需要任何先决条件 无条件传送方式局限性比较大 对大部分外设不适用 因而采用较少 80 2 查询方式 2 查询方式CPU在执行输入输出操作时 先查询外设的状态口 当状态口表示外设已准备好时 CPU执行输入输出操作 当状态口反映外设未准备好时 CPU继续查询状态口 直到外设准备好 再执行输入输出操作 查询方式适用于大部分外设 但CPU的利用率较低 81 3 中断传送方式 3 中断传送方式中断传送方式基于计算机的中断控制系统 当外设准备好传送数据时 向CPU发出中断请求 如有关条件满足 则CPU响应中断请求 执行相应中断服务程序 完成数据的输入或输出 然后继续执行原来的程序 中断传送方式相对查询方式 可提高CPU的利用率 以上三种传送方式虽然各不相同 但有一点是相同的 即通过CPU执行输入输出程序实现数据的传送 因而数据传输率低 要得到高数据传输速率 应采用直接存储器存取方式 即DMA方式 用DMA控制器控制数据的传输过程 返回第五章 回5 4 82 本章重点及

温馨提示

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

评论

0/150

提交评论