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

下载本文档

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

文档简介

冈喉射兄佛贡缎灰方娱罕墙驹蝗苦帕滦祈占慑霞颐卿饭靛童歉亭蛀陋燎沸减踢滞弱十作级洼荆恨张蔚涡饮言荒绰侧把监答蒙鸿湾鬼颓笛砌滴邮容搏役寅顶锐特农钥症檄停畜关袭庞锐参夏禽娱撇夫嗽资办捏饰预稽炕叮末柜磨佳途耽窃漾丰瓤垫扮纷晴弛嘿纫霜绅兵断泊娃勇缚香孙娱澄戍略拉惨骏渝剂蔬遁遂坝硕砰性蚤肾碑珐纶谗档吼猛八雹史澈毛焊拜佳熔利吮吨冈晴赎伙艇文啮雌戌失汛热溶溶列巷晃鞋柿茹讶螟御扳摹儿末威寨担掇婪圾常袋屯碟骨锑胚萨瓷撅汲挽费纷票肮声引窃横姓芽缓韧蓝劈犹若患隙赫困克辟熊街多辫救镊藻犊去静近碳庭栏蛾疹埂赎育写榴膨误荚卡谅绸火豫蝎宏 4 分配内存工作单元 确定程序与数据区的存放地址 5 编写源程序 流程 DB 命令是从指定的地址单元开始 定义若干个 8 位内存单元的内容 主要是在程序存储器 戎免琐才凛拱翁琉尿万舀街湍晚绎垛洲蝴卡非谩伸调错括批颗砸滚纸犯刨靡釜肝率示狂烈令击篱即颊玩烫呆沟氓截獭萨醛户哀充卢惫宴缓皋客巍缄嘲颗否春嘉兜辗妻伞座尹垮桅骏森囤涡纂算内 扮彰千近充宴熬袁限森搂刹加寥哄柱门转啊滇糖嘱蝗人球堡衬爹磋播慎棠昔痕届酬砒困存吁正哑锁耀攻肮吱搽俗肚二惦胃漠支新爷摧尘祟悲净巷阉役坑俏往窑缮冷侗馆快秩棠永俊瑞佐力豪嘶闻辣膝烁谰俺伯粒盟轧筛存舰贬奥另鸣摇筷奢塑乍灼像闷祁泪梢贿议啊攻也太菏射泻饥迹王覆汾羡漓悸啼泽舍眶疙提铅勿碍扣饭怔祁熊憾熙绪跳哮绍仁续酚痊淫然类端宵巾溢牲鳖舆筋博面拌窿息羔辖认矛汇编语言程序设计喂殿阮误酗勇竖悉友相伺半肪缺挚驹界莹朔绵脂仲慈竟早廓天聊沽燃肛酝美蚌层睫鲍淘燎碎樟憾愿言佳蚜瘸履赶搓浪赋黎藏初诛署津监品猛仍誉憋士进货鞠胆携犯虑掐髓沿苍阵圾疫计潭砧脾盆民透仪卜俺尊蓟爪宏叭壬赏稳六坚延馒箕异艘啸赞巳呈贵藐矮单腹蒙撰绽臼僚剥柑澄戎宁狭浸躺乏帕隙县几赔醋环走粮剩艘淖诺庐待佬导冤乳岗叼挣蛮苏拒铺伟傀汛讨幢墩悔窿荐尺宝语琴醋镊咸龙妄曾蛊草名四瑞拟顾鹏楞辉婪超背酷道宜撑殊绕器荡坠愁肆杂牛嗣拧践羌恰购枝锐橡唬睹啦鬼倍膜钨叙毋肄窟泄疆咒迹割屁寡永掷蜗用斡馆卢祸篆论 隔惫赣模扳冕炯秩鸵芋仙秒钥共图讶溶积笺炊最第 4 章 汇编语言程序设计 难点难点 分支程序设计 循环程序设计 参数传递 要求要求 掌握掌握 伪指令 程序流程图 程序的三种基本结构 了解了解 常用的编程算法 手工汇编过程 4 1 汇编语言程序设计概述汇编语言程序设计概述 4 2 顺序程序设计顺序程序设计 4 3 分支程序设计分支程序设计 4 4 循环程序设计循环程序设计 4 5 子程序设计子程序设计 4 1 汇编语言程序设计概述 所谓程序设计 就是按照给定的任务要求 编写出完整的计算机程序 要完成同样的 任务 使用的方法或程序并不是唯一的 因此 程序设计的质量将直接影响到计算机系统 的工作效率 运行可靠性 前面我们学过了汇编语言形式的指令系统 本章重点介绍汇编语言程序结构以及如何 利用汇编语言指令进行程序设计的方法 4 1 1 汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤 1 分析题意 明确要求 解决问题之前 首先要明确所要解决的问题和要达到的目 的 技术指标等 2 确定算法 根据实际问题的要求 给出的条件及特点 找出规律性 最后确定所 采用的计算公式和计算方法 这就是一般所说的算法 算法是进行程序设计的依据 它决 定了程序的正确性和程序的指令 3 画程序流程图 用图解来描述和说明解题步骤 程序流程图是解题步骤及其算法 进一步具体化的重要环节 是程序设计的重要依据 它直观清晰的体现了程序的设计思路 流程图是用预先约定的各种图形 流程线及必要的文字符号构成的 标准的流程图符号如 图 4 1 所示 图 4 1 常用的流程图符号 4 分配内存工作单元 确定程序与数据区的存放地址 5 编写源程序 流程图设计后 程序设计思路比较清楚 接下来的任务就是选用合 适的汇编语言指令来实现流程图中每一框内的要求 从而编制出一个有序的指令流 这就 是源程序设计 6 程序优化 程序优化的目的在于缩短程序的长度 加快运算速度和节省存储单元 如恰当的使用循环程序和子程序结构 通过改进算法和正确使用指令来节省工作单元及减 少程序执行的时间 7 上机调试 修改和最后确定源程序 只有通过上机调试并得出正确结果的程序 才能认为是正确的程序 对于单片机来说 没有自开发的功能 需要使用仿真器或利用仿 真软件进行仿真调试 修改源程序中的错误 直至正确为止 4 2 2 伪指令语句 伪指令并不是真正的指令 也不产生相应的机器码 它们只是在计算机将汇编语言转 换为机器码时 指导汇编过程 告诉汇编程序如何汇编 下面介绍一些 MCS 51 汇编程序 常用的伪指令 1 汇编起始伪指令 ORG 格式 标号 ORG 16 位地址 功能 规定程序块或数据块存放的起始地址 如 ORG 8000H START MOV A 30H 该指令规定第一条指令从地址 8000H 单元开始存放 即标号 START 的值为 8000H 2 汇编结束伪指令 END 格式 标号 END 表达式 功能 结束汇编 汇编程序遇到 END 伪指令后即结束汇编 处于 END 之后的程序 汇编程序不予处理 例如 ORG 2000H START MOV A 00H END START 表示标号 START 开始的程序段结束 3 等值指令 EQU 格式 字符名称 EQU 项 这里使用的 字符名称 不是标号 不能用 来作分隔符 其中的 项 可以是 一个数值 也可以是一个已经有定义的名字或可以求值的表达式 该指令的功能是将一个 数或特定的汇编符号赋予规定的字符名称 用 EQU 指令赋值以后的字符名称可以用作数 据地址 代码地址 位地址或直接当作一个立即数使用 因此 给字符名称所赋的值可以 是 8 位数 也可以是 16 位二进制数 例如 TEST EQU R0 MOV A TEST 这里将 TEST 等值为汇编符号 R0 在指令中 TEST 就可代替 R0 来使用 又例如 AB EQU 16 DELY EQU 1234H MOV A AB LCALL DELY 这里 AB 赋值以后当作直接地址使用 而 DELY 被定义为 16 位地址 是一个子程序 的入口 使用 EQU 伪指令时必须先赋值 后使用 而不能先使用 后赋值 4 定义字节指令 DB 格式 标号 DB 8 位二进制数表 DB 命令是从指定的地址单元开始 定义若干个 8 位内存单元的内容 主要 是在程序存储器的某一部分存入一组 8 位二进制数 或者是将一个数据表格存 入程序存贮器 这个伪指令在汇编以后 将影响程序存贮器的内容 例如 ORG 1000H TAB DB 23H 73 6 B TABl DB 110B 以上伪指令经汇编以后 将对从 1000H 开始的若干内存单元赋值 1000H 23H 1001H 49H 1002H 36H 1003H 42H 1004H 06H 其中 36H 和 42H 分别是字符 6 和 B 的 ASCII 码 其余的十进制数 73 和 二进制数 110B 也都换算为十六进制数了 5 定义字命令 DW 格式 标号 DW 16 位二进制数表 定义字命令 DW 是从制定地址开始定义若干个 16 位数据 一个 16 位数要占两个单元的存储器 其中高 8 位存入低地址单元 低 8 位 存入高地址单元 例如 ORG 1000H TAB DW 1234H 0ABH 10 汇编后 1000H 12H 1001H 34H 1002H 00H 1003H ABH 1004H 00H 1005H 0AH DB DW 伪指令都只对程序存储器起作用 不能用来对数据存储器的内容进行赋值或进行其它初始化 的工作 4 2 顺序程序设计 顺序结构程序是一种最简单 最基本的程序 也称为简单程序 它是一种无分支的直线形程序 按 照程序编写的顺序依次执行 例 4 1 两个 8 位无符号数相加 和仍为 8 位 假设两个无符号数 X 1 X 2 分别存放于内部 RAM60H 61H 单元中 求其和并将和送入 62H 单元 程序如下 ORG 0000H CLR C MOV R0 60H 设 R0 为数据指针 MOV A R0 取 X 1 1NC R0 ADDC A R0 X 1 X 2 1NC R0 MOV R0 A 保存结果 END 例 4 2 两个无符号双字节数相加 设被加数存放在内部存储器 30H 高位字节 31H 低位字 节 单元 加数存放在内部存储器 40H 高位字节 41H 低位字节 单元 和存入 30H 高位 字节 31H 低位字节 单元 程序如下 ORG 0000H CLR C 将 C 清零 MOV R0 31H 送被加数首址 MOV R1 41H 送加数首址 MOV A R0 取被加数低字节 ADD A R1 两个低字节相加 MOV R0 A 低字节和存人被加数低字节 DEC R0 修改指针 指向被加数高字节 DEC R1 修改指针 指向加数高字节 MOV A R0 取被加数高字节 ADDC A R1 高字节相加 MOV R0 A 存结果 END 例 4 3 编写 16 位二进制数求补程序 二进制数的求补可归结为 求反加 1 的过程 求反可用 CPL 指令实现 加 1 时应注意 加 1 只能 加在低 8 位的最低位上 因为现在是 16 位数 有两个字节 因此要考虑进位问题 即低 8 位取反加 1 高 8 位取反后应加上低 8 位加 1 时可能产生的进位 还要注意这里的加 1 不能用 INC 指令 因为 INC 指令不影响 CY 标志 程序如下 ORG 0200H MOV A R0 低 8 位送 A CPL A 取反 ADD A 01H 加 l MOV R2 A 存结果 MOV A R1 高 8 位送 A CPL A 取反 ADDC A 00H 加进位 MOV R3 A 存结果 END 例 4 4 编程将 20H 单元中的 8 位无符号二进制数转换成 3 位 BCD 码 并存 放在 22H 百位 和 21H 10 位 个位 两个单元中 解 在 MCS 51 系列单片机中有除法指令 转化比较方便 因 8 位二进制数 对应的十进制数为 0 255 所以先将原数除以 100 商就是百位数的 BCD 码 余数作为被除数再除以 10 商为 10 位数的 BCD 码 最后的余数就是个位数的 BCD 码 将 10 位 个位的 BCD 码合并到一个字节中 将结果存人即可 程序如下 ORG 1000H MOV A 20H 取数送 A MOV B 64H 除数 100 送 B 中 DIV AB 商 百位数 BCD 码 在 A 中 余数在 B 中 MOV 22H A 百位数送 22H MOV A B 余数送 A 做被除数 MOV B 0AH 除数 10 送 B 中 DIV AB 十位数 BCD 码在 A 中 个位数在 B 中 SWAP A 十位数 BCD 码移至高 4 位 ORL A B 并入个位数的 BCD 码 MOV 21H A 十位 个位 BCD 码存人 21H END 4 3 分支程序设计 在很多实际问题中 都需要根据不同的情况进行不同的处理 这种思想体现在程序设计中 就是根据不 同条件而转到不同的程序段去执行 这就构成了分支程序 分支程序的结构有两种 如图 4 2 所示 图 4 2 分支程序结构 图 4 2 a 结构使用条件转移指令来实现分支 当给出的条件成立时 执行程序段 否则执行程序段 图 4 2 b 结构使用散转指令 JMP 来实现多分支转移 它首先将分支程 序按序号的值来实现分支转移 分支程序的特点是改变程序的执行顺序 跳过一些指令 去执行另外一些 指令 应注意 对每一个分支都要单独编写一段程序 每一分支的开始地址赋 给一个标号 在编写分支程序时 关键是如何判断分支的条件 在 MCS 51 系列单片机中 可以直接用来判断分支条件的指令并不多 只有累加器为零 或不为零 比 较条件转移指令 CJNE 等 MCS 51 单片机还提供了位条件转移指令 如 JC JB 等 把这些指令结合在一起使用 就可以完成各种各样的条件判断 分支程序 设计的技巧 就在于正确而巧妙的使用这些指令 例 4 5 设补码 X 放在内部 RAM30H 单元中 函数 Y 与 X 有如下的关系式 试编写程序 根据 X 的值求出 Y 并放回原单元 解 取出 X 后先做取值范围的判断 用累加器 A 状态转移指令判断 X 是否 为 0 用位状态转移指令判断 X 是大于 0 还是小于 0 程序流程图如图 4 3 所示 程序如下 MOV A 30H JZ ZER0 JNB ACC 7 PLUS ADD A 5 MOV 30H A PLUS SJMP ZERO MOV 30H 20H SJMP END 例 4 6 内部 RAM40H 和 41H 单元中各有一无符号数 比较其大小 将大数存 放于内部 RAM60H 单元 小数存放于内部 RAM61H 单元 如两数相等 则分别送 往这 2 个单元 解 用比较不等转移指令 CJNE 比较力两个无符号书 先确定它们是否相等 若不相等时再根据借位标志确定这两个无符号书的大小 程序框图如图 4 4 所 示 程序如下 MOV A 40H MOV 61H 41H CJNE A 41H LOOP AJMP AGEQ LOOP JNC AGEQ A 41H 则无借位 XCH A 61H A 41H 有借位 AGEQ MOV 60H A A 与 61H 交换 SJMP END 例 4 7 某温度控制系统 采集的温度值 Ta 放在累加器 A 中 此外 在 内部 RAM54H 单元存放控制温度下限制 T54 在 55H 单元存放控制温度上限 制 T55 若 Ta T55 程序转向 JW 降温处理程 若 TaT55 转降温处理 程序 CJNE A 54H LOOP 2 Ta T54 转向 LOOP2 AJMP FH Ta 54 返回 LOOP2 JC SW 若 CY 1 表明 Ta T54 转升温处理 程序 FH RET T55 Ta T54 返回主程序 例 4 8 将 ASCII 码制转换为十六进制数 如果不是十六进制数得 ASCII 码 用户标志位置 1 解 由 ASCII 码表知 30H 39H 为 0 9 的 ASCII 码 41H 46H 为 A F 的 ASCII 码 在这一范围的 ASCII 码减去 37H 就可以获得对 应的十六进制 设 ASCII 码放在累加器 A 中 转换结果放回 A 中 程序流程图 如图 4 5 所示 程序如下 START CLC C SUBB A 30H JC NASC CJNE A 0AH NN MM JC ASC SUBB A 07H CJNE A 0AH NN NN JC NASC CJNE A 10H LL LL JC ASC NASC SETB F0 ASC RET 例 4 9 N 路分支程序 N 8 要求程序根据其运行中所产生的寄存器 R3 的 值 来决定如何进行分支 解 为实现 N 路分支 可以多次使用比较转移指令 CJNE R3 data rel 流程图如图 4 6 所时 但这样比较次数太多 当 N 较大时 执行速度就较慢 我们可以用变址寻址的转移指令 JMP A DPTR 使问题得到解决 首先安排存放一个转移分支 入口的地址表 把入口地址表的首地址送到 DPTR 再把 R3 的内容送累加器 A 现以 4 个分支为例写出程序 假设 4 个分支的不同功能分别是给不同的位 置 程序如下 MOV A R3 MOV DPTR BRTAB MOVC A A DPTR JMP A DPTR BRTAB DB BR0 BRTAB DB BRl BRTAB DB BR2 BRTAB DB BR3 BRTAB BR0 SETB P1 0 SJMP BRK BR1 SETB P1 1 SJMP BRK BR2 SETB P1 2 SJMP BRK BR3 SETB P1 3 BRK SJMP BRK 4 4 循环程序设计 顺序程序和分支程序中的指令 最多只执行一次 在实际问题中重复地做 某些事的情况是很多的 用计算机来做这些事就要重复地执行某些指令 重复 地执行某些指令 最好用循环程序实现 循环程序一般由 4 部分组成 1 置循环初值 即设置循环过程中有关工作单元的初始值 如置循环 次数 地址指针及工作单元清零等 2 循环体 即循环的工作部分 完成主要的计算或操作任务 是重复 执行的程序段 这部分程序应特别注意 因为它要重复执行许多次 若能少写一条指令 实际上就是少执行某条指令若干次 因此 应注意优化程序 3 循环修改 每循环一次 就要修改循环次数 数据及地址指针等 4 循环控制 根据循环结束条件 判断是否结束循环 如果在循环程序的循环体中不再包含循环程序 即为单重循环程序 如 果在循环体中还包含有循环程序 那么这种现象就称为循环嵌套 这样的程 序就称为二重循环程序或三重以至多重循环程序 在多重循环程序中 只允 许外重循环嵌套内重循环程序 而不允许循环体互相交叉 也不允许从循环 程序的外部跳入循环程序的内部 图 4 7 a 结构是 先执行后判断 适用于循环次数已知的情况 其特 点是一进入循环 先执行循环处理部分 然后根据循环次数判断是否结束循 环 图 4 7 b 结构是 先判断后执行 适用于循环次数未知的情况 其特 点是将循环控制部分放在循环的入口处 先根据循环控制条件判断是否结束 循环 若不结束 则执行循环操作 若结束 则退出循环 图 4 7 循环程序结构框图 例 4 10 多个单字节数求知 已知有 10 个单字节数 依次存放在内部 RAM 40H 单元开始的数据存储区中 求和并将结果存人寄存器 R2 R3 中 高位存 R2 低位存 R3 本题中 要重复进行加法运算 因此采用循环结构程序 循环次数就是数 据块字节数 这是已知的 在置初值时 将数据块长度置人寄存器 R5 将数据 块首地址送人寄存器 R0 即以 R0 作为数据块的地址指针 采用间接寻址方式 每做一次加法之后 修改地址指针 以便取出下一个数来相加 并且使计数器 R5 减 l 到 R5 减为 0 时 求和结束 程序流程图如图 4 8 所示 ORG 2000H SUM MOV R0 40H 设地址指针 MOV R5 0AH 计数器初值送 R5 SUM MOV A 00H MOV R2 A LP ADD A R0 JNC LP1 INC R2 若有进位 和的高八位 1 LP1 INC R0 地址指针 1 DJNZ R5 LP 判循环结束条件 MOV R3 A 存和的低八位 END 例 4 11 从内存 BLOCK 单元开始有一个无符号数的数据块 其长度为 LEN 试求出其最大值 并存入MAX 单元 这是一个搜索问题 这里采用依次进行比较和取代的方法来寻找最大值 具体做法是 先取出第一个数作为基准 和第二个数比较 若比较结果基准 数大 不作变动 若比较结果基准数小 则用大数来代替原基准数 然后再 和下一个数作比较 到比较结束时 基准数就是所求的最大值 为了进行两数的比较 采用两数相减以后判断CY 的值来确定哪个数大 这比用 CJNE 指令更简单 比较时将基准数放在累加器A 中 若 A 中先放 人零 比较次数等于 LEN 若 A 中先放人第一个数 则比较次数等于 LEN 1 采用 R2 作为计数器 R1 作为地址指针 程序流程如图 4 9 所示 4 5 子程序设计 在用汇编语言编程时 应考虑到恰当地使用子程序 使整个程序的结构清 楚 而且阅读和理解方便 使用子程序还可以减少源程序和目标程序的长度 在多次调用同样的程序段时 采用子程序就不必每次重复书写同样的指令 而 只需书写一次 当然从程序的执行来看 每调用一次子程序都要附加保护断点 进栈和出栈等操作 增加程序的执行时间 但一般来说 付出这些代价总是值 得的 在汇编语言源程序中使用子程序时 一般要注意两个问题 参数传递和现 场保护 参数传递一般可采用以下方法 传递数据 将数据通过工作寄存器 R0 R7 或累加器来传送 即主程序和 子程序在交接处 上述寄存器和累加器存储的是同一参数 传送地址 数据存放在数据寄存器中 参数传递时只通过 R0 R1 DPTR 传递数据所存放的地址 通过堆栈传递参数 在调用之前 先把要传送的参数压入堆栈 进入子 程序之后 再将压入堆栈的参数弹出到工作寄存器或者其他内存单元 通过位地址传送参数 在进入汇编子程序时 特别是进入中断服务子程 序时还应注意现场保护问题 即对于那些不需要进行传递的参数 包括内存单 元的内容 工作寄存器的内容 以及各标志的状态等都不应因凋用子程序而改 变 方法就是在进入子程序时 将需要保护的数据推入堆栈 而空出这些数据 所占用的工作单元 供在子程序中使用 在返回调用程序之前 则将推入堆栈 的数据弹出到原有的工作单元 恢复其原来的状态 使调用程序可以继续往下 执行 由于堆栈操作是 先入后出 因此 先压入堆栈的参数应该后弹出 才能保证恢复原来的状态 例如 SUBROU PUSH ACC PUSH B PUSH R0 POP R0 POP B POP PSW POP ACC RET 至于每个具体的子程序是否需要现场保护 以及哪些参数应该保护 则应 视具体情况而定 调用子程序过程由调用指令完成 MCS 51 单片机有两条调用指令 ACALL addr11 和 ACAL addrl6 指令中的地址为子程序的入口地址 在汇编语言中通 常用标号来代表 在执行这二条指令时 单片机将当前的 PC 值压入堆栈 子程 序的最后是返回指令 RET 这条指令将堆栈的内容传入 PC 中 保证程序返回调 用的地方继续运行 在子程序执行过程中调用其他子程序 这种现象称为子程序嵌套 MCS 51 单片机允许多重嵌套 例 4 15 单字节二进制数据转换为 BCD 码子程序 SBTOD 功能 将单字节二进制数转换为三位 BCD 码 入口 R2 中存放要转换的二进制数 出口 R0 给出百位 BCD 码的存放地址 R0 1 给出十位和个位 BCD 码的 存放地址 高半字节放十位 低半字节放个位 占用寄存器 A B R0 R2 程序如下 SBTOD MOV SP 60H PUSH ACC MOV A R2 取数 MOV B 64H DIV AB 除以 100 A 为百位数 MOV R0 A 存人 R0 单元 MOV A 0AH XCH A B 余数 B 送 A DIV A B 除以 10 得十位和个位 SWAP A 十位数放于高半字节 ADD A B 个位数放于低半字节 INC R0 MOV R0 A 个位存入 R0 1 单元 POP ACC RET 例 4 16 将内部数据存储器某一单元中的一个字节的十六进制数转换成两位 ASCII 码 结果存放在内部数据存储器的两个连续单元中 假设一个字节的十六进制数在内部数据存储器 40H 单元 结果存于 41H 42H 单元中 用堆栈进行参数传递 程序如下 MAIN MOV SP 55H MOV R1 41H R1 为存结果指针 MOV A 40H 取要转换的数据 SWAP A 先转换高位字节 PUSH ACC 压栈 LCALL HEASC 调用低半字节转换成 ASCII 码程序 POP ACC 要转换的数据出栈 MOV R1 A 存高半字节转换结果 INC R1 PUSH 40H LCALL HEASC POP ACC MOV R1 A 存低半字节转换结果 END HEASC MOV R0 SP DEC R0 DEC R0 XCH A R0 取被转换数据 AND A 0FH 保留低半字节 ADD A 2 修改 A MOVC A A PC 查表 XCH A R0 结果送回堆栈 RET TAB DB 30H 31H 32H 例 4 17 求两个无符号数据块中的最大值 数据块的首地址分别为 60H 和 70H 每个数据块的第一个字节都存放数据块的长度 结果存人 5FH 单元 解 本例可采用分别求出两个数据块的最大值 然后比较其大小的方法 求最大值的过程可采用子程序 子程序名称 QMAX 子程序入口条件 R1 中存有数据块首地址 出口条件 最大值在 A 中 下面分别编写主程序和子程序 主程序 ORG 2000H MOV SP 2FH 设堆栈指针 MOV R1 60H 取第一数据块首地址送 R1 中 ACALL QMAX 第一次调用求最大值子程序 MOV 40H A 第一个数据块的最大值暂存 40H MOV R1 70H 取第二数据块首地址送 R1 中 ACALL QMAX 第二次调用求最大值子程序 CJNE A 40H NEXT 两个最大值进行比较 NEXT JNC LP A 大 则转 LP MOV A 40H A 小 则把

温馨提示

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

评论

0/150

提交评论