第 3 章 程序设计的基本技术
第二章 汇编语言和汇编程序
程序设计的基本技术 顺序程序:是最简单的程序,它的执行顺序和程序中指令
的排列顺序完全一致。 分支程序:执行顺序和指令存储顺序失去了完全的一致性。
把不同的处理方法编制成各自的处理程序,运行时由计算机根据不同的条件自动做出选择判别,绕过某些指令,仅执行相应的处理程序段。
循环程序:重复地执行某些指令。“先执行,后判断”;“先判断,后执行”两种。
子程序:不同的程序中或同一个程序中的不同位置常常用到功能完全一致的程序段。这种被独立出来的程序段被称为子程序。
3.1 顺序程序设计
第二章 汇编语言和汇编程序
第二章 汇编语言和汇编程序
3.1 顺序程序设计 顺序结构流程图
准备
结束
过程 1
过程 2
例:将内部 RAM 40H 单元中一压缩 BCD 数转换为二进制数。
关键知识点:压缩 BCD 数:例, 98H 表示 10 进制数 98 。十位 9 存放在40H 的高 4 位,个位 8存放在 40H 的低 4 位;十位乘以 10 ,再加上个位,为二进制数,即可实现转换;100的 10 进制数,为二进制的 64H;
第二章 汇编语言和汇编程序
3.1 顺序程序设计
MOV A, 40H ;将 BCD 数的十位放 A 的低 4 位SWAP AANL A, #0FHMOV B, #10MUL AB ; 十位乘以 10ANL 40H, #0FH ;将 BCD 数的个位保留在 40H 单元中ADD A, 40H ;10 位乘以 10 加个位MOV 40H, A
3.2 分支程序设计
第二章 汇编语言和汇编程序
第二章 汇编语言和汇编程序
3.2 分支程序设计 分支结构流程图
条件成立?
Y N
单分支 多分支
条件成立?Y
N
条件成立?
N
条件成立?Y
N
Y
过程
过程
过程
第二章 汇编语言和汇编程序
3.2 分支程序设计例:内部 RAM40H和 41H 单元中各有一无符号数,比较其
大小,将大数存放于内部 RAM60H 单元,小数存放于内部 RAM61H 单元,如两数相等,则分别送往这 2 个单元。
要点:用比较不等转移指令 CJNE 比较这 2 个无符号数,先
确定它们是否相等,若不相等时在根据借位标志确定这 2 个数的大小。
第二章 汇编语言和汇编程序
3.2 分支程序设计
MOV A, 40H MOV 61H, 41H CJNE A, 41H, $+3(指令字节数是
3, P60) JNC AGEQ ;A≥(41H) 则无借位 XCH A, 61H ;A<(41H) 有借位
AGEQ: MOV 60H,A ;A与 (61H) 交换 SJMP $ END
3.3 循环程序设计
第二章 汇编语言和汇编程序
第二章 汇编语言和汇编程序
3.3 循环程序设计 循环结构流程图
N
Y
条件成立?
处理部分
修改控制部分
初始化
先执行,后判断 先判断,后执行
条件成立?
修改控制部分
处理部分
Y
N
初始化
循环控制
第二章 汇编语言和汇编程序
3.3 循环程序设计例:计数控制的循环程序 有 20 字节无符号数存放在内部 RAM50H 开始的单元中,
求它们的和,将和放内部 RAM4EH和 4FH 单元中。要点:
加法共计进行 20 次,用 R7 计数,用 R0间 ( 接寻 ) 址。4EH和 4FH 两单元既存放最终结果也存放中间结果,开始时将它们清零。
第二章 汇编语言和汇编程序
3.3 循环程序设计MOV 4EH, #0MOV 4FH, #0MOV R7, #20 ; 设置计数器MOV R0, #50 ; 设置间接地址指针
LOOP: MOV A, 4FHADD A, @R0 ; 加一单元的内容MOV 4FH, ACLR A
ADDC A, 4EH ; 加累加时产生的进位 , 存在4EH 中
MOV 4EH, AINC R0 ; 修改间址指针DJNZ R7, LOOPSJMP $
END
3.4 子程序设计
第二章 汇编语言和汇编程序
第二章 汇编语言和汇编程序
3.4 子程序设计子程序是具有完整功能的程序段。子程序在结构上应具有通用性和独立性,在编写子程序应注意以下几点:子程序的第一条指令地址称为子程序的入口地址。该指令必须有标号,标号应以子程序的任务定名,以便一看就一目了然;主程序调用子程序是通过安排在主程序的调用指令实现的,子程序返回主程序必须执行安排在子程序末尾的一条 RET返回指令;主程序调用子程序和子程序返回主程,计算机能自动保护和恢复主程序的断点地址 (PC值 ) 。但对于各工作寄存器、特殊功能寄存器和内存单元中的内容,如果需要保护和恢复必须在子程序开头和末尾 (RET 指令前 ) 安排一些能够保护和恢复它们的指令。
第二章 汇编语言和汇编程序
3.4 子程序设计例:求内部 RAM 中两个无符号数字节串 ( 串长小于 16) 的
最大值的乘积。要点:
因为要求两个串中的字节数据的最大值,故将查找最大值的程序段编制为子程序。两个字节串均存放在内部 RAM 中,首地址分别为 60H和 70H 。
入口参数:串首地址存放在 R0 中,串长度存放在 R7中;
出口参数:串中的字节数据的最大值存放在 A 中。
第二章 汇编语言和汇编程序
3.4 子程序设计MOV R0, #60HMOV R7, #N6 ;N6 为串长ACALL MAXMOV B, A ; 存入一乘数MOV R0, #70HMOV R7, #N7 ;N7 为另一串长ACALL MAXMUL ABMOV 5EH,B ; 乘积的高字节放 5EH 单元MOV 5FH,A ; 乘积的低字节放 5FH 单元SJMP $
END
; 子程序,计算较大值MAX: PUSH B
CLR AMAX1: MOV B, @R0
CJNE A, B, $+3JNC ANCHAMOV A, @R0
ANCHA: INC R0DJNZ R7,MAX1POP BRET