第四章20121210上海大学单片机.ppt

第四章汇编语言程序设计 主要内容 4 1简介4 2伪指令4 3汇编程序设计4 4总结 4 1简介 编出理想的程序 需要具备 要对硬件结构和所要使用的其它硬件有详细的了解 要对所使用的指令系统有一个充分 详细的认知和理解 在用汇编语言编程时 需要考虑合理分配寄存器 内存 端口等硬件 要统筹安排 汇编语言程序设计步骤分析题意 明确问题 目的和技术指标等 确定具有可操作性的方法 根据实际问题的要求 给出的条件及特点 找出规律性 确定所采用的计算或处理方法 画程序流程图 用图解来描述和说明解题步骤 直观清晰的体现了程序的设计思路 4 1简介 分配硬件资源 包括存储单元和I O口等 编写源程序 选用合适的汇编语言指令来实现流程 程序优化 加快运算速度和节省存储单元 上机调试 确定正确的源程序 需要使用仿真器或利用仿真软件进行仿真调试 4 1简介 4 2伪指令 伪指令不能命令CPU执行某种操作 不生成对应的机器代码 它的作用仅用来给汇编程序提供某种帮助信息 指定目标程序或数据存放的起始地址给指定的标号赋值在内存中预留一些工作单元表示源程序结束 1 设置起始地址ORG格式 标号 ORG16位地址功能 表明程序的起始地址例 ORG2000HSTART MOVA 00HMOVR1 A 4 2伪指令 4 2伪指令 对ORG使用要求 要求定义的空间必须是从小到大 不能够重叠 例 ORG3000HMOVA 30HMOVB 50HORG2700H 定义由大到小错误MOVR1 56HMOVR7 36H 例 ORG2000HMOVA 20HORG2001H 产生了定义重叠错误MOVB 12H 4 2伪指令 假如源程序开始没有ORG命令 机器汇编会从0000H单元开始存放目标程序 2 汇编结束指令END格式 标号 ENDEND命令通知汇编程序结束汇编 在END之后所有的汇编语句均不被处理 4 2伪指令 3 定义字节命令DB格式 标号 DB字节常数或ASCII字符串功能 从指定单元开始存储若干个字节的数据或ASCII字符 常用来定义数据 例 ORG2000HSTR DB07H 76HDB 1 2 ASCII码31 32 4 2伪指令 4 定义字命令DW 格式 标号 DW字常数或ASCII码字符串功能 连续存放字常数 先放高八位 后存放低八位 例 ORG2000HTAB DW1234H 56H 56H是按字存放 4 2伪指令 5 定义存储空间命令DS格式 标号 DS表达式功能 从指定的地址开始预留一个存储区 以备后用 例 ORG2000HTEMP DS08HDB30H 40H 4 2伪指令 6 赋值命令EQU格式 字符名称EQU数或汇编符号功能 给数或汇编符号赋予字符名称 可用作数 数据地址 代码地址或位地址 可是8位或16位 例1 REEQUR1 汇编符号MOVA RE例2 B18EQU11HMOVA B18DELYEQU07E8HLCALLDELY 4 2伪指令 7 位地址符号命令BIT格式 名称BIT位地址功能 给位地址赋予字符名 例 A1BITP1 0A2BIT08H 4 2伪指令 4 3汇编程序设计 4 3 1顺序结构4 3 2分支结构4 3 3循环结构4 3 4子程序 4 3 1顺序结构 1 简介顺序结构是程序设计中的最基本结构 程序走向只有一条路径 1 引用一些标识符 置初值 2 读入数据或信息 3 执行某些运算或处理 4 输出一些结果 是最简单 最基本的程序 4 3 1顺序结构 例4 1 双字节取反加1程序 设数据在R4R5中 问题分析 R4R5 取反 1 R4R5 处理方法由于单片机没有双字节操作指令 要一个字节一个字节的操作 分别取反 进行加1操作时 要考虑到低字节向高字节进位的问题 遵循加法运算的一般规则 先低位后高位 硬件分配 变量或寄存器任务分配 用到的工作单元只有寄存器R4 R5 A 4 3 1顺序结构 第四步绘制流程图 确定逻辑结构 4 3 1顺序结构 第五步写源程序第六步程序调试 ORG0200HMOVA R5 取低字节CPLA 低字节取反ADDA 1 低字节加1MOVR5 AMOVA R4 取高字节CPLA 高字节取反ADDCA 0 加进位MOVR4 A END 4 3 1顺序结构 例4 2 将片内RAM20H单元中存放的二进制数转换为3位BCD码 转换结果的百位存于21H单元 十位和个位存于22H单元中 第一步问题分析二进制的X要求转换为十进制的Y 结果的百位放21H 十位和个位放在22H 第二步算法8位的二进制数范围在0 255 用数学的方式表示为 X A 100 B 10 C Y求出A B C存放于相应单元 用到除法 第三步工作单元分配用到的寄存器为A B AB 4 3 1顺序结构 第四步流程图 4 3 1顺序结构 第五步编写源程序 ORG0200HMOVA 20H 待转换数据送AMOVB 100 除数100送BDIVAB A B A BMOV21H A 百位送21HMOVA B 余数送AMOVB 10 除数10送BDIVAB A B A BSWAPA 十位BCD送高4位ORLA B 十位与个位BCD的组合MOV22H A 存入22HEND 4 3 2分支结构 1 简介仅靠顺序结构是难以实现特定目标 满足特定条件或根据运算过程中的一些中间结果决定进行不同的运算 高级程序设计语言也提供分支结构 if else if elseif else switch case 分类 双分支 多分支 三分支 4 3 2分支结构 2 分支特点主程序中必然包含条件判断 选择符合条件要求的处理路径 根据运算结果的状态标志 或者通过对某种状态的检测 选用对应的条件转移指令来实现分支结构 编程的要点 合理选用具有逻辑判断功能的指令 4 3 2分支结构 3 编程实现每个分支程序设定地址标号 每个选择分支均需单独一段程序 在程序的起始地址赋予一个地址标号 以便当条件满足时转向指定的地址单元去执行 51系列的判跳指令极其丰富 功能极强 特别是位处理判跳指令 对复杂问题的编程提供了极大方便 分支程序设计技巧在于正确使用这些指令 4 可用于分支结构编程的指令1 有条件分支的指令有JZ JNZ CJNE JC JNC JB JNB和JBC等 其中 JZ JNZ 测试累加器的结果CJNE 测试比较两个数据的大小JC JNC 测试位累加器的结果JB JNB和JBC 测试某一个位的状态CJNE JC JNC可用于三分支 2 无条件分支程序使用跳转指令LJMP AJMP SJMP或散转指令JMP JMP A DPTR是多分支转移指令 适应多种情况的处理 方便用户应用 4 3 2分支结构 4 3 2分支结构 例4 3设变量X存放在30H单元 按照下式的要求给Y赋值 将Y值存入31H单元 第一步问题分析 4 3 2分支结构 第二步算法很容易想到的是用CJNE来进行比较 这对无符号数来说是可是实现的 但X为有符号数 就不能用 根据其性质 最高位为符号位 对一个字节的最高位进行位测试 然后根据测试结果来决定其正负 而判别X是否等于零可以用累加器判零指令 所以首先可以把X 0的情况先区别开来 然后再分正负 4 3 2分支结构 第三步工作单元分配寄存器A第四步根据算法绘制程序流程图 确定逻辑结构 4 3 2分支结构 第五步编写源程序 ORG0200HMOVA 30HJZCOMPJNBACC 7 POSIMOVA 0FFHSJMPCOMPPOSI MOVA 1COMP MOV31H AEND 4 3 2分支结构 例4 4设5AH单元中有一整数X 请编写计算下述函数式的程序 结果存入5BH单元 第一步问题分析分段函数 根据给出X的范围作不同的运算 4 3 2分支结构 第二步确定算法这是一个比较数大小的问题 然后根据判断结果作相应的运算 这里采用分支的方法解决 比较数的大小可用的CJNE和JNC JC相结合的方法解决 有两个结果要计算X平方 可以先行计算 以便使用 第三步工作单元分配用寄存器R0 R1来存放运算结果 一般情况下总是先利用工作寄存器 4 3 2分支结构 第四步根据算法绘制程序流程图对于类似的分段形式一般采用多分支结构 整个流程可分为三个分支 第二个分支下有两个执行模块 实现的时候需要较多的转跳指令 4 3 2分支结构 具体流程图 4 3 2分支结构 第五步编写源程序 ORG0300HMOVA 5AHMOVB AMULABMOVR1 AMOVA 5AHCJNEA 10 L1L1 JCL2 10MOVR0 41CJNEA 16 L3L3 JNCL4 A 16 16MOVA R1ADDA 8MOVR0 ASJMPL4L2 MOVA R1CLRCSUBBA 1MOVR0 AL4 MOV5BH R0SJMP END 4 3 2分支结构 说明 ORG0300H做准备工作并进行函数式的第一 二项中的部分共同运算 X的平方 L1 若 CY 1 目的操作数 源操作数 转L2否则进行假设条件下的函数式的第三项运算 并用CJNE来形成是否大于15的CY的标志 L3 通过判断进行函数式的第二项运算 L2 作函数式的第一项运算 L4 做结果存储工作 R0放的是函数式各项的结果SJMP 注意 这条指令在实际中是用不到的 但在调试时可以使程序停留在此 以便观察结果 END 4 3 2分支结构 5 多分支结构使用散转指令 JMP A DPTR 实现多分支转移 通常把表首地址或目标地址 DPTR 分支序号或偏移量 A把DPTR的内容与A的内容相加 得到16位目的地址 装入PC 转移进入相应的分支程序 在ROM中建立一个散转表 表有三种构成方式 无条件转移指令 转移指令表 地址偏移量 偏移量表 各分支入口地址 地址表 4 3 2分支结构 4 3 2分支结构 1 采用无条件转移指令 例4 5 128路多分支程序p74 表首地址 分支序号 JUMP1 MOVA R3RLA 索引 双字节转移指令MOVDPTR TAB 基地址JMP A DPTRTAB AJMPOPR0 实现2KB空间范围转移AJMPOPR1 AJMPOPR128 最大128路分支 OPR0 OPR1 OPR128 此程序要求128个转移目的地址 OPR0 OPR128 必须驻留在与对应绝对转移指令AJMP相同的一个2KB存储区内 4 3 2分支结构 4 3 2分支结构 2 采用地址偏移量 例4 6 p75 表地址 地址偏移量 当分支序号较少 各段程序较短 所有分支程序均处在256字节之内时 可使用地址偏移量组成表 JUMP MOVDPTR TAB2MOVA R7 索引 针对地址偏移量MOVCA A DPTRJMP A DPTRTAB2 DBOPR0 TAB2 256DBOPR1 TAB2 OPR0 OPR1 4 3 2分支结构 3 采用入口地址 例4 7 p76 目标地址 0 若需要转向较大的范围 可以建立一个转移地址表 即将所要转移的各分支入口地址 16位地址 组成一个表 在散转之前 先用查表方法获得表中的转移地址 然后将该地址装入DPTR 最后按DPTR中的内容进行散转 4 3 2分支结构 JUMP3 MOVDPTR TAB3MOVA R7ADDA R7 R7乘以2MOVR3 A 暂存索引MOVCA A DPTR 取高8位XCHA R3 互换 R3存高八位INCA 取高地址 索引加1MOVCA A DPTR 取低8位MOVDPL A 送给DPLMOVDPH R3 送给DPHCLRA 偏移量清0 A不起作用JMP A DPTR 目标地址TAB3 DWOPR0DWOPR1 4 3 2分支结构 散转表采用转移指令经两次跳转JMP AJMP 到达目标地址 通过A里的序号查跳转指令表来进行分支选择 注意AJMP使用的限制 PC当前值必须与目标地址在同一个页面里 2KByte 采用地址偏移 通过A里的序号进行查表 Byte 根据表里地址偏移量进行转移 A里是分支地址偏移量 受到查找范围256字节的限制 采用各分支入口地址 通过查表找到双字