微机原理第四章汇编程序2.ppt_第1页
微机原理第四章汇编程序2.ppt_第2页
微机原理第四章汇编程序2.ppt_第3页
微机原理第四章汇编程序2.ppt_第4页
微机原理第四章汇编程序2.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1 4 2 4过程定义伪指令PROC ENDP 过程就是子程序 一个过程可以被其它程序所调用 用CALL指令 过程的最后一条指令一般是返回指令 RET 过程定义伪指令的格式为PROC 类型 RETENDP注意 PROC和ENDP必须成对出现 2 过程的类型有两种 NEAR 默认类型 表示段内调用FAR 表示段间调用调用一个过程的格式为 CALL 3 4 2 5宏定义伪指令 如果需要多次使用同一个程序段 可以将这个程序段定义为一个 宏指令 然后在需要时 可简单地用宏指令名来代替这个程序段 指令的格式为 MACRO 形参表 ENDM 4 例 两个数之和的宏定义和宏调用 宏定义为 DADDMACROX Y ZMOVAX XADDAX YMOVZ AXENDM X Y Z是形式参数 调用宏DADD时可写为 DADDDATA1 DATA2 SUMDATA1 DATA2 SUM是实际参数 由它们替换定义中的X Y Z 5 宏调用与过程 子程序 调用都是一次定义 多次调用 它们之间的差别是 执行形式 宏命令伪指令由宏汇编程序在汇编过理中进行处理 而CALL RET则是由CPU执行的指令 汇编结果 宏命令伪指令汇编后被展开 执行速度 宏命令执行速度较快 因无调用转移 占用内存 宏指令简化了源程序 但不能简化目标程序 并不节省内存单元 使用过程可以节省代码占用的内存空间 6 宏展开 汇编程序会把宏调用按宏定义展开 例如 宏定义为 DisplayMACROstringLEADX stringMOVAH 9INT21HENDM程序中宏调用 DISPLAYERROR MESSAGEDISPLAYEXIT MESSAGE汇编后的结果 带有 号的指令为宏展开后的结果 LEADX ERROR MESSAGE MOVAH 9 INT21H LEADX EXIT MESSAGE MOVAH 9 INT21H 7 4 2 6汇编结束伪指令END 汇编语言源程序的最后 要加汇编结束伪指令END 以使汇编程序结束汇编 格式 END 表达式 END后跟的表达式通常就是程序第一条指令的标号 指示程序的启动地址 要执行的第一条指令的地址 8 DOS系统功能调用介绍 系统功能调用 由OS提供的一组实现特殊功能的子程序供程序员在程序中调用 以减轻编程工作量 系统功能调用有两种 一种称为DOS功能调用 另一种称为BIOS功能调用 用户程序在调用这些系统服务程序时 不是用CALL命令 而是采用软中断指令INTn来实现 在DOS系统中 功能调用都是用软中断指令INT21H来实现的 9 INT2lH功能大致可以分为四个方面 设备管理 目录管理 文件管理和其它 D0S系统功能调用的使用方法如下 AH 功能号 设置该功能所要求的其他入口参数 执行INT21H指令 分析出口参数 以下介绍INT21H的几个最常用的功能 10 关于数据输入和输出我们这里只讨论键盘输入和显示输出 调用系统功能需要提供入口参数及所调用的功能号 调用结束返回结果 1 DOS键盘功能调用 1 从键盘输入一个字符 功能号 1 MOVAH 1INT21H 11 例 程序中有时需要用户对提示做出应答 GET KEY MOVAH 1 等待键入字符INT21H 结果在AL中CMPAL Y 是 Y JZYES 是 转YESCMPAL N 是 N JZNO 是 转NOJMPGET KEY 否则继续等待输入YES NO 12 2 输入字符串 功能号 0AH 此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中 MOVAH 0AHLEADX INT21H 13 2 DOS显示功能调用 1 在显示器上显示一个字符 功能号 2 MOVAH 2MOVDL INT21H例 在显示器上显示一个字符 A MOVAH 2MOVDL A 或MOVDL 41HINT21H 14 MOVAH 9LEADX INT21H注意 被显示的字符串必须以 结束 2 显示字符串 功能号 9 15 例 在屏幕上显示 HELLO WORLD 在数据段定义字符串 DATASEGMENTSTR1DB HELLO WORLD DATAENDS 在代码段中进行显示输出MOVAH 9LEADX STR1INT21H 16 BIOS功能调用 BIOS 基本输入输出系统 是固化在EPROM中的一组实现基本输入输出功能的子程序 BIOS调用通过多个软中断提供 调用方法为 MOVAH INTBIOS中的几个主要中断类型如下 INT10H 屏幕显示INT13H 磁盘操作INT14H 串行口操作INT16H 键盘操作INT17H 打印机操作每类中断由包含许多子功能 调用时通过功能号指定 17 汇编语言程序设计 1 汇编语言程序设计的步骤 1 根据实际问题抽象出数学模型 确定算法2 画出程序框图 流程图 3 分配内存工作单元和寄存器4 根据框图编写源程序 存成 ASM文件5 对源程序汇编 生成 OBJ目标文件6 把 OBJ文件连接成 EXE执行文件7 运行 调试2 程序的基本结构 顺序 分支 循环 过程 18 1 用方框表示工作框 框中用简明语言标明要完成的功能 2 用菱形框表示判断框 框中标明比较 判断和条件 如何绘制程序框图 流程图 N Y 19 4 各框之间用直线连起来表示程序走向 框中标明子程序名字 入口参数等 3 用框表示调用子程序或过程 20 汇编语言上机过程 Y Y Y N N N 有错 有错 有错 结束 汇编 输入 修改 源程序 连接 运行 查错 开始 用EDIT NOTEPAD等任何文本编辑器 源程序存为 ASM文件 用MASM宏汇编程序进行汇编 汇编后生成 OBJ目标文件 命令格式 MASM 用LINK连接程序进行连接 连接后生成 EXE可执行文件 命令格式 LINK 用TD DEBUG等调试程序进行调试 命令格式 TD 用TD DEBUG等调试程序进行调试 命令格式 TD 有错 21 标号 条件满足 处理 顺序程序分支程序 N Y IF THEN结构 程序结构 测试 比较指令 TEST CMP 条件转移指令 Jx标号 处理体标号 其他指令 22 程序结构 TEST CMP指令Jx标号1处理体P1JMP标号2标号1 处理体P2标号2 其他指令 条件满足 处理P1 处理P2 标号1 标号2 条件1 条件2 IF THEN ELSE结构 23 标号1 条件1成立 P1 N Y CASE结构 程序结构 TEST CMP指令 测试条件1 Jx标号1 不满足转标号1处理体P1 JMP标号n 1标号1 TEST CMP指令 测试条件2 Jx标号2 不满足转标号2处理体P2 JMP标号n 1标号2 TEST CMP指令 测试条件3 Jx标号3 不满足转标号3处理体P3 JMP标号n 1标号3 TEST CMP指令 测试条件4 标号n 1 公共出口 条件2成立 条件n成立 Pn 1 标号2 标号n 标号n 1 P2 Pn N N Y Y 24 例 编程序将AL中的二进制数 转换成16进制数的ASCII码 存于DI指向的内存2个单元中 解 1 分析题目2 确定算法 1 把二进制数置AL中 AL中的数从左到右 转换成ASCII码 用循环左移ROL和AND指令 2 0 9的ASCII码 30 39HA F的ASCII码 41H 46H 判断是否为数字0 9 若是 加30H 否则 是A F 再加07H 得字母的ASCII码 DI指向结果单元 BL 2 AL 一个字符的16进制数 10 AL AL 30H存ASCII码 Y AL AL 07H N lp BL 0 BL BX 1 N Y 存ASCII码 3 程序流图 26 MOVBL 2 需转换2次MOVBH AL AL中的数暂存BHMOVCL 4 置移位位数ROLAL CL 循环左移4位lp ANDAL 0FH 得到4位CMPAL 10 BL 10 JBS BL 10 转ADDAL 07H 大于10 加7S ADDAL 30HMOV DI AL 存ASCII码INCDI 修改地址MOVAL BHDECBLJNZlp 2个数没转换完 继续 27 循环程序 1 DO UNTIL结构先执行 再判断条件 工作部分至少执行一次 初始化 循环体 循环控制 继续循环 Y N 28 2 DOWHILE结构先判断条件 再执行 工作部分有可能一次都不执行 初始化 循环体 循环控制 继续循环 Y N 29 注意 循环可以嵌套 多重循环 但多个循环体之间不能交叉 控制条件不能混淆 例 数据从大到小排序 冒泡法 实例 3 7 2 8 6 8 7 6 3 2 内外两层循环 每轮内循环使一个最小的数沉底 因为最小的数沉底 下轮内循环就不用再比较最底下的数 所以内循环的循环次数每一轮比上一轮要逐次减1 外循环用于控制有多少轮内循环 若有n个数据 则外循环次数为n 1 30 例 排序程序设计 1 设计要求设源程序代码段中有无序字符表 将其按代码值大小升序排序 显示排序前后字符表 显完 提示OK字符 2 程序算法冒泡排序是一种常用的排序方法 它的规则是 表中相邻两元素 一比较 并把大值元素向下交换 直至表尾 大值元素落底 此时 称为一次冒泡 程序中一次大循环 以后重复冒泡排序 直至最小元素冒到表顶为止 若在一次冒泡排序中没有出现两元素交换 设标志为0 则停止排序 31 353947324930 353947324930 353947324930 353932474930 353932474930 第1趟 6个数 将最大的数降到底部 6个数需比较5次COUNT 5 BX 0 第一趟 DL 5 外循环 CX 5 0 内循环 修改 BX BX 1 1DL DL 1 4 剩4趟 353932473049 32 353932473049 353932473049 353239473049 353239473049 353239304749 第2趟 将最大的数降到底部 5个数需比较4次COUNT 4 BX 1 第2趟 DL 4 外 CX 5 CX CX BX 5 1 4 内循环次数 修改 BX BX 1 1 1 2DL DL 1 3 剩3趟 33 353239304749 323539304749 323539304749 323530394749 第3趟 将最大的数降到底部 4个数需比较3次COUNT 3 BX 2 第3趟 DL 3 外 CX 5 CX CX BX 5 2 3 内循环次数 修改 BX BX 1 3DL DL 1 2 剩2趟 34 323530394749 323530394749 323035394749 第4趟 将最大的数降到底部 3个数需比较2次COUNT 5 BX 3 第4趟 DL 2 外循环次数 CX CX BX 5 3 2 内循环次数 修改 BX BX 1 4DL DL 1 1 剩2趟 35 323035394749 303235394749 第5趟 将最大的数降到底部 2个数需比较1次COUNT 5CX CX BX 5 4 1 内 BX 5 第5趟 BX BX 1 4 1 5DL 1 外 DL DL 1 0 结束 36 3 框图 37 NAMEEX4一4CODESSEGMENTORG0100HASSUMECS CODESSTAR JMPSSTTASCllDB GAJXYDEBFIPKWR 定义字符串DB QOUZVCHMST4135 COUNT ASCll 1OKDBODH OAH OK SSTT MOVAX CSMOVDS AX 初始化数据段MOVDL COUNT 置外循环次数MOVDH 1 设有交换标志XORBX BX 38 L0 ORDH DH 交换标志 0 JZL3 无交换 已排好序 退出MOVDH 0 重置交换标志 0MOVCX COUNT 字符数减一SUBCX BX 内循环次数L1 MOVSI OFFSETASCll 指向表首MOVAL SI 字符送ALINCSI 指向下个字符CMPAL SI 比较表中相邻字符JBEL2 小于转XCHGAL SI 否则交换 大字符下沉MOV SI 1 AL 小字符上浮 39 MOVDH 1 有交换 DH 1L2 LOOPL1 内循环结束 INCBX 内循环一次加一DECDL 外循环次数减一JNZL0 外循环次数非零 继续L3 MOVDX OFFSETASCIIMOVAH 9INT21H 显示排好序的字符MOVAH 4CHINT21H 返回DOSCODEENDSENDSTAR 40 掌握以下几点 调用子程序用CALL指令 返回调用程序用RET指令 子程序允许嵌套调用 进入子程序后首先要保护主程序的运行状态 标志位 和使用的寄存器内容 称为保护现场 退出子程序前要恢复现场 调用前要预先确定子程序中要使用哪些寄存器 并定义入口参数和出口参数 参数传递可利用寄存器 存储单元或堆栈 要用BP寻址 子程序设计举例 41 例1 二进制数 0 F 转换成ASCII 0 F 的子程序 BIN2ASCPROC 要转换的数在AL的低四位 转换结果仍在AL中CMPAL 9JAA2FADDAL 30HJMPDONEA2F ADDAL 37HDONE RETBIN2ASCENDP调用方法 在主程序中 MOVAL 0CHCALLBIN2ASC AL中有0CH的ASCII码43H C 42 例2 字符串处理程序设计此例取自p182 例4 17 对字符串进行操作时 往往需要确定它的长度 通常字符串结束标志以CR或 作标志 所以可以用扫描CR或 的方法计算出串长 在计算串长时 应注意串长一般应小于255个字节 以下是流程图和源程序 43 简化的流程图 开始 求串长 串长 256 显示串长高位 显示串长低位 结束 Y 警告 太长 求串长 当前字符是 搜索CR字符同时指针增量 返回 N 串长加1 存串长 N 找到 N Y Y 初始化指针 计数器 44 程序如下 DATASEGMENTSTRINGDB Thisisastring 0DH LENGTH1DW 串长度存放在这里CRDB0DHMESSAGEDB Thestringistoolong 0DH 0AH DATAENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFARBEGIN MOVAX DATAMOVES AXMOVDS AX 45 CALLSTRLEN 调用子程序计算串长MOVDX LENGTH1 结果在DX寄存器中CMPDX 100HJBNEXT1 若 DX 100H 转LEADX MESSAGE 若 DX

温馨提示

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

最新文档

评论

0/150

提交评论