




已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章汇编语言程序设计基础 第四章汇编语言程序设计基础 第一节 概述第二节 基本程序设计方法第三节 汇编语言程序的编辑和汇编 第一节 概述 1 程序设计语言2 汇编语言源程序的格式3 伪指令 1 程序设计语言 程序设计语言 计算机能理解和执行的语言称计算机程序设计语言 程序设计 用程序设计语言把解决问题的步骤描述出来 程序设计语言的分类 按照语言的结构及其功能可以分为三种机器语言 汇编语言 高级语言 1 机器语言 MachineLanguage 用二进制代码0和1表示指令和数据的最原始的程序设计语言 2 汇编语言 AssemblyLanguage 指令用助记符表示 地址 操作数可用标号 符号地址及字符等形式来描述 3 高级语言 High LevelLanguage 接近于人的自然语言 面向过程而独立于机器的通用语言 三种语言程序处理过程 2 汇编语言源程序的格式 1 汇编语言源程序是由汇编语句 即指令 组成的 2 汇编语言的语句最多由四部分 四个字段 组成 标号 操作码 操作数 注释 START MOVA 30H A 30H 标号之后用冒号 与操作码隔开 操作码之后用空格 与操作数隔开 两操作数之间用逗号 隔开 注释之前用分号 与操作数隔开 标号字段说明 标号是指令的符号地址 一个标号的值是该指令代码第一个字节的地址 在程序的其它地方可以引用这个标号以代表这个特定的地址 不是每条指令都采用标号 只有那些被其它语句 如转移 调用 引用的语句和数据 才需要赋予标号 以便实现控制程序的转移或调用 标号的使用有以下规定 1 标号由大写英文字母开头的字母和数字串组成 长度为1 8个字符 最后必须以冒号 结束 2 不能使用指令助记符 CPU的寄存器名以及伪指令等作为标号 3 同一程序内 标号必须互不相同 4 为便于阅读程序 最好使标号字符有一定含义 3 伪指令 MCS 51单片机汇编语言 包含两类不同性质的指令 1 基本指令 即指令系统中的指令 它们都是机器能够执行的指令 每一条指令都有对应的机器码 2 伪指令 汇编时用于控制汇编的指令 它们都是机器不能执行的指令 无机器码 1 定位伪指令ORG 格式 ORG16位地址或标号功能 用在一段源程序或数据块的前面 说明紧随在后的程序段或数据块的起始地址 例如 ORG2000HSTART MOVA 64H END 说明START的值为2000H 2 汇编结束伪指令END 格式 标号 END 表达式 功能 用在汇编语言源程序的最后 是源程序的结束标志 在机器汇编时 当汇编程序检测到该语句时 它就确认汇编语言源程序已经结束 对END后面指令都不予汇编 如果源程序是一段子程序 END后不写表达式 若是主程序 则必须写表达式 所写表达式就是该主程序第一条指令的标号 表示该程序的可执行段的首地址 3 赋值伪指令EQU 格式 字符名称EQU表达式功能 汇编程序自动把EQU右边的 表达式 8位或16位 的值赋给左边的 字符名称 字符名称 必须先赋值后使用 EQU伪指令与存储单元无关 在某程序中 一旦用EQU伪指令对某字符名称赋值之后 就不能再用EQU伪指令来改变其值 其值在整个程序中是固定的 这里 字符名称 不同于标号 因此不加冒号 例 ORG2000HBTEQUR3DATAEQU30HDELAYEQU1050HMOVR0 DATA R0 30H MOVA BT A R3 LCALLDELAY 调用1050H子程序 END 4 定义字节伪指令DB 格式 标号 DBX1 X2 Xn功能 把右边的Xi i 1 n 依次存放到以左边标号为起始地址的连续的存储单元中 其中Xi为8位二进制数据 或十进制 十六进制 表达式 ASCII码等多种形式 例 ORG1200HTAB DB50H 10001100B 100 2 5 4TAB1 DB D 2 ABC 例中的字符以ASCII码存入 例如 D ABC 负数用补码存入 例如 4 TAB的地址1200HTAB1的地址为1205H 5 定义字伪指令DW 格式 标号 DWX1 X2 Xn功能 DW与DB功能相似 区别在于DB定义的是字节 DW定义的是字 两个字节 所以Xi是16位的数据字或标号 但该标号必须事先赋值 汇编时一个字数据占用两个连续的存储单元 例 ORG1500HDATAEQU3522HADDR DW3456H 9BH 10DWDATA 高字节在前 低地址单元 低字节在后 高地址单元 6 定义存储空间伪指令DS 格式 标号 DS表达式功能 指示汇编程序从DS伪指令的 标号 开始 预留一定数量的存储单元 以备程序执行时使用 预留单元数量由DS语句中 表达式 的值决定 表达式 可以是数值也可以是数学表达式 例 ORG0300HBASE DS10DB AB 7 定义位地址符号伪指令BIT 格式 字符名称BIT位地址功能 把BIT右边的位地址赋给它左边的 字符名称 B1 B2两个字符定义成位地址01H 即20H 1 和P2口的第0位 例 ORG1000HB1BIT01HB2BITP2 0MOVC B1MOVB2 C END 第三节 汇编语言程序的编辑和汇编 1 汇编语言源程序的编辑方法编辑 是指对源程序进行输入 修改 保存等操作 从而正确的将汇编语言源程序输入计算机 建立以 ASM为扩展名的源程序文件 三步 用编辑程序生成以 ASM为扩展名的源程序文件 用汇编程序生成目标文件 用连接程序把多个目标文件连接在一起 形成一个大的可执行的文件 由于单片机本身不具备开发功能 只能通过微型计算机系统来完成以上功能 最终还必须借助于开发装置来排除应用系统在设计过程中的硬件故障 以及目标程序中存在的程序错误 当目标系统调试成功以后 再用开发装置把目标程序固化到单片机的内部或外部EPROM芯片中 几乎所有的开发装置都带有系统集成软件 其中都包含有相应的编辑程序 2 汇编语言源程序的汇编步骤 两类汇编方法 人工汇编 机器汇编 1 人工汇编先确定程序在程序存储器的起始地址 然后按源程序的顺序逐条转换成机器语言代码 并以字节为单位从起始地址依次排列 对暂时无法确定其实际值的标号或地址偏移量应预留出位置 全部翻译完成后 再对未确定的标号和地址偏移量进行计算和确定 正确填入指令预留出的位置中 例 对下面源程序进行人工汇编 首先查指令表写出每条指令的指令代码及第一字节的地址地址指令代码源程序ORG3000H3000HD291START SETBP1 13002H753003DL MOV30H 03H3005H7531F0DL0 MOV31H 0F0H3008HD531rel1DL1 DJNZ31H DL1300BHD530rel2DJNZ30H DL0300EHB291CPLP1 13010H空1空2AJMPDLEND 对空格中的值进行计算 计算偏移量rel1 rel2已知 偏移量 目标地址 当前PC值所以 rel1 3008H 300BH 3补码表示 rel1 0FDH同理 rel2 3005H 300EH 9补码表示 rel1 0F7H 计算转移地址指令原形 AJMPadd11 其中add11 a10a9 a1a0指令代码 a10a9a800001a7 a0已知 DL 3002H 取其低11位 即add11 00000000010B所以 空1 01H 空2 02H分别用求得的数将4个空格填好 人工汇编结束 2 机器汇编 机器汇编是由机器执行 汇编程序 自动把汇编语言源程序翻译成目标代码 机器汇编的原理和人工汇编类似 实际上是人工汇编的模拟 3 程序存储器的写入方法 单片机的应用程序一但调试好后就固化在程序存储器中 以避免受到破坏 程序存储器可以在单片机内部 ROM或EPROM 也可在外部 EPROM ROM型的存储器其程序是由厂家固化在芯片内 而EPEOM型的存储器是可编程的 允许用户自行写入程序 但必须借助于编程器 市面上有各种智能型多功能编程器 可连接在微机的并行口上 可对上千种器件进行编程 即写入 测试 加密 逻辑仿真等 许多编程器支持DOS和Windows98双平台界面 此外许多仿真器也专门设置了编程器 专门对EPROM芯片编程 第二节 基本程序设计方法 一 程序设计步骤 1 分析任务 对任务进行仔细的调查研究 收集必要的现场数据 2 确定算法 把控制系统的计算任务或控制对象的物理过程演化为计算机可以处理的形式 并拟制出具体的算法和步骤 3 绘制程序流程图 将文字步骤加以图解 而成为流程图 又称程序框图 流程图充分地表达了程序的设计思路 将问题与程序联系起来 使复杂问题简化和收到提纲挈领的效果 4 编写汇编语言源程序 根据流程图编写程序 用汇编语言指令实现流程图中每一个功能框的要求 这就是源程序设计 6 上机调试 必须通过上机调试得到正确的结果 才能认为是正确的程序 判断程序质量的三个标准 1 程序的执行时间短2 占用的内存单元数少3 程序的语句行数少 程序流程图 用约定的几何图形 流向线及必要的文字说明构成的用以描述程序过程的图形 1 端点符号 2 处理符号 3 判断符号 4 调用符号 5 流程线 6 连接符号 二 基本程序设计 一 顺序程序 简单程序 特点 是一种基本上按指令书写顺序从头至尾逐条执行的程序 它是程序设计的基础 也能解决某些实际问题 或成为复杂程序的某个组成部分 例4 1 拆字程序设内部RAM的20H单元中存有两位BCD码 请编程把它拆成两段 十位BCD数存入21H的低4位 个位BCD数存入22H的低4位 21H 22H单元的高4位置0 ORG1000HST MOVR0 20H 源数据指针MOVR1 22H 目的数据指针MOVA R0 取源数据送AANLA 0FH 分离出个位BCD数MOV R1 A 个位BCD数存22H单元MOVA R0 重新取数ANLA 0F0H 分离出十位BCD数SWAPA 十位BCD数换到低4位DECR1 调整目的数据指针MOV R1 A 十位BCD数存21H单元END 二 分支程序 特点 在实际问题中 从第一条指令一直执行到最后一条指令的顺序程序是不多的 通常需要计算机对某种情况作出判断 根据判断结果作出相应的处理 而分支程序就充分体现了计算机的这种分析判断能力 程序的分支是通过条件转移指令实现的 根据判断给出的条件满足与否选择程序的不同走向 例4 3 符号函数 X 存在片外ROM的VAR单元中Y 存放在片外RAM的DATA单元中解 变量X以补码存放 先对符号进行判断 若X 0 则令Y 0 若X 0 再判是否小于0 若是则令Y 1 不是就令Y 1 流程图 ORG0100HSTA MOVDPTR VARMOVA 00HMOVCA A DPTR 取数 A XJZDONE 若X 0 则转DONEJNBACC 7 PLUS 若X 0 则转PLUSMOVA 0FFH 若X 0 则 A 1SJMPDONEPLUS MOVA 01H 若X 0 则 A 1DONE MOVDPTR DATAMOVX DPTR A 存Y值END 例4 4 多路分支程序 根据R5的内容转向相应的处理程序 设R5的内容为0 N 对应处理程序的入口地址分别为BR0 BRN 根据某一输入变量或运算结果的值实现多路分支的程序 若采用条件转移指令逐次比较 程序的执行速度会很低 通常采用转移指令表或转移地址表实现 解1 采用转移指令表实现多路分支 先在程序存储器中建立一张起始地址为TAB的绝对转移指令表 表中连续存放N条AJMP指令 每条AJMP指令对应一个分支 占两个字节 ORG3100HSRA MOVA R5 取数 A R5RLA A A 2MOVDPTR TAB TAB转移指令表首地址JMP A DPTR 跳转到 A DPTR单元TAB AJMPBR0 转分支0AJMPBR1 转分支1AJMPBR2 转分支2AJMPBR3 转分支3 AJMPBRN 转分支NEND 由于JMP A DPTR指令转移的范围是以DPTR为起始的256个字节空间 故由AJMP构成的转移指令表其最大长度不能超过256个字节 由于AJMP指令为两字节指令 故表中可连续存放128条AJMP指令 实现128路分支的转移 所以R5中的N 0 128 由于AJMP指令的转移范围是2KB 因此分支处理程序的位置受到了限制 必须驻留在与AJMP指令同一个2KB存储区内 若把转移指令表中的AJMP改为LJMP指令 则分支处理程序可分布在整个64KB范围内 但程序中N要进行乘3处理 解2 采用转移地址表实现多路分支先在程序存储器中建立一张起始地址为TAB的转移地址表 表中连续存放N个处理程序的入口地址 根据R5的内容 即分支转移序号乘以2 由查表指令MOVC取出相应分支入口地址送入DPTR中 再执行JMP A DPTR指令 A清0 转向相应的处理程序 ORG0300HSTA MOVA R5 取分支转移序号 A R5RLA A A 2MOVR0 A A 2后暂存入R0MOVDPTR TAB 置转移地址表首地址TABMOVCA A DPTR 取入口地址的高8位到AXCHA R0 入口地址的高8位暂存R0INCAMOVCA A DPTR 取入口地址的低8位到AMOVDPL AMOVDPH R0 入口地址送DPTRCLRA A 0JMP A DPTR 转向处理程序TAB DWBR0 转移地址表DWBR1DWBR2 DWBRNEND 三 循环程序 顺序程序中 所有的指令仅被执行一次 分支程序中 有的指令被执行一次 而有的可能一次也未被执行 实际应用中 需要反复执行某种操作 而每次完成这些操作都是执行同样的程序 只是处理的数据不同 这时就可以采用循环程序结构循环程序 使所需程序段自动执行多次 而无须多次写出这段程序 使源程序大大缩短 同时也节省了内存空间 但不能节省执行时间 例4 5负数求补程序 外部RAM地址为3000H的数据块中有100个补码 要求逐一检查 若为负数则取补后放回 正数则不变 编制循环程序的要点 发现和寻找过程中具有重复性和规律性的部分 并分析出重复的次数 重复结束的条件等 解 这个任务中规律性的过程是 取数 判符号 若为负数则取补 负数求补程序流程图 ORG1000HSTART MOVDPTR 3000H 置地址指针MOVR7 64H 置计数初值LOOP1 MOVXA DPTR 取数JNBACC 7 LOOP2 若正数转LOOP2CPLAINCA 负数取补MOVX DPTR A 负数取补后送回LOOP2 INCDPTR 修改地址指针DJNZR7 LOOP1 100个数未完继续END 循环程序的结构包括四个部分 1 初始化部分 为循环做准备 2 处理部分 循环体部分 实际数据处理部分 是重复执行的程序段部分 是循环程序的主体 3 控制部分 控制循环的进行和结束 两个内容 1 修改循环参数为下一次循环做准备 2 判断是否满足结束条件 若不满足则转去继续执行循环体部分 满足则退出循环 4 结束部分 存放所得结果 恢复某些工作单元的初值 循环程序的2种组织方式 两种组织方式的区别1 判断循环结束条件的时刻不同 方式1 处理部分至少执行一次方式2 处理部分可能一次也不执行 2 程序的出口不同 方式1 程序的出口在最后方式2 程序出口通常不是在最后 例4 6发送字符串程序 一串ASCII字符存放在以BLOCK开始的连续片外RAM单元中 以空白字符 0 结尾 要求用串行口发送出去 循环结束条件是通过检查约定的结束标志0来决定继续循环或终止循环 循环次数不定的情况采用方式2 发送字符串程序流程图 ORG2000HMOVDPTR BLOCK 字符块首地址LOOP MOVXA DPTR 取要发送字符JZNEXT 0字符转结束LOOP1 JNBTI LOOP1 上个发送完吗 CLRTI 发送完清TIMOVSBUF A 发送字符INCDPTR 调整指针下一个SJMPLOOPNEXT RET 循环中包含另一个循环叫循环嵌套 LOOP1 JNBTI LOOP1 有多层嵌套时称为多重循环程序 例4 7 双重循环实现1ms延时的程序 DELAY1 MOVR6 32 1个机器周期DEL2 MOVR7 7 1个机器周期DEL3 NOP 1个机器周期NOP 1个机器周期DJNZR7 DEL3 2个机器周期DJNZR6 DEL2 2个机器周期RET 2个机器周期延时时间为 1 1 1 1 2 7 2 32 2 995个机器周期 内循环 当采用12MHz晶振时 一个机器周期为1us 延时时间为995us 与1ms比较有5us误差 四 位操作程序 通过位处理器和位处理指令可进行随机逻辑运算和设计 可实现复杂的逻辑操作 例4 8 编制程序实现下面逻辑表达式的功能 X0 X7从并行口P0输入 Y信号从P1 7输出 解 先计算三项的逻辑式 三项的结果相或为Y 因此只要这三项中有一个结果为1 则Y就等于1 程序流程图 ORG2000HSTART MOVA P0 输入8位信号MOVC ACC 0ANLC ACC 1ANLC ACC 2MOV00H C 00H X0X1X2MOVC ACC 2ANLC ACC 3 C X2X3ORLC 00HCPLCJCOUT C 1 转输出 MOVC ACC 1ANLC ACC 2ANLC ACC 3 JCOUT C 1 转输出MOVC ACC 4CPLCANLC ACC 5ANLC ACC 6ANLC ACC 7 OUT MOVP1 7 C P1 7 最终结果SJMP 五 子程序 子程序已成为计算机的一种软件资源 常将子程序构成子程序库 集中放在某一存储空间 主程序可随时调用 子程序的引入大大简化了主程序的结构 节省了存储空间 缩短了程序设计时间 子程序要为所有调用程序共享 在结构上应具有通用性和独立性 编写时应注意以下几点 1 有子程序名以备调用 通常以子程序的第一条指令的标号作为子程序名 这个标号最好有一定含义 以便一看就一目了然 2 子程序末尾要安排一条RET返回指令 3 保护现场与恢复现场 主程序调用子程序之前所使用的各寄存器的内容称为现场 通常在子程序开头和末尾 RET指令前 安排一些入栈和出栈指令来保护和恢复现场 而主程序的断点地址 通过调用指令和返回指令能自动保护和恢复 无须用户安排 4 子程序要有可浮动性 所谓可浮动性就是子程序可以放在存储器的任何地方并能为主程序调用 为此子程序中必须使用相对转移指令而不用其它转移指令 以便汇编时生成浮动代码 此外 尽量使用寄存器和堆栈作数据暂存器使用 而避免使用固定存储单元作数据暂存器 5 参数传递 子程序参数分为入口参数和出口参数两类 因为子程序是主程序的一部分 子程序被调用之前 主程序应先把有关参数 即入口参数 送到某些约定的位置 子程序在运行时可从约定的位置得到有关参数 同样 子程序结束前也应该把运算结果 出口参数 送到约定的位置 返回主程序后 主程序可从约定位置上获得结果 这就是参数传递 8051单片机常用工作寄存器 累加器 地址寄存器 堆栈等来传数 例4 11用指针寄存器来传递参数 当数据放在存储器中 且量比较大时 可用指针来指示数据的位置 可节省传递数据的工作量 参数放在片内RAM时 用R0或R1作指针 参数在外部RAM或程序存储器时 用DPTR作指针 试编写6位BCD码的加法程序 设被加数放在片内RAM40H 42H单元 加数放在50H 52H单元 和放入40H 42H中 注 低位在低地址 解 主程序通过指针寄存器R0和R1将参加运算的BCD码的地址传递给子程序子程序通过指针寄存器R0将结果的地址传递给主程序 入口参数 R0 R1 分别指向被加数和加数的低字节出口参数 R0 指向结果的高字节 主程序 完成入口参数的传递和子程序的调用 ORG0100HSTAR MOVR0 40H 被加数低字节地址送R0MOVR1 50H 加数低字节地址送R1ACALLBADD 调6位BCD码的加法子程序 子程序 BADD MOVR7 3 6位BCD码占3字节CLRC 低字节相加时 进位位清0LOOP MOVA R0 取被加数字节ADDCA R1 取加数字节并加到ADAA BCD码调整MOV R0 A 保存相加的和INCR0 修改被加数指针INCR1 修改加数指针DJNZR7 LOOP 未完继续DECR0 使R0指向结果的高字节RETEND 六 中断服务程序与堆栈操作 主程序 1 起始地址 PC 0000H 而从0003H 002BH分别为各中断源的入口地址 编程时应在0000H处安排一条长跳转指令 使CPU执行程序时可从0000H跳过各中断源的入口地址 然后从跳转的目的地址开始执行主程序 2 初始化 对将要用到的单片机内部部件或扩充部件进行初始工作状态的设定 中断服务程序 1 起始地址 0003H 002BH为各中断源的入口 5个中断源的入口地址相距很近 8个字节 若中断服务程序的指令代码少于8个字节 则可直接从入口地址开始编写 若大于8个字节 在相应的入口处安排一条跳转指令 2 中断服务程序编制中的注意事项 视需要确定是否保护现场 时清除那些不能被硬件自动清除的中断请求标志 以免产生误中断 中断服务程序中的压栈PUSH与弹出POP指令必须成对使用 以确保中断服务程序的正确返回 主程序与中断服务程序之间的参数传递类似主程序与子程序之间的参数传递 七 应用程序举例 1 定时器 首先初始化编程 步骤 1 设置TMOD 根据功能要求 工作方式及运行工作方式设置 2 设计数初值TH TL 根据定时时间或计数要求设置 3 若使用中断系统则设置中断控制寄存器IE IP和TCON 4 启动定时器工作 例4 14计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大二基础实验考试题及答案
- 常微分方程考试卷及答案
- 2025年神经科帕金森综合征的诊断与治疗案例分析答案及解析
- 2025年病理学学科基础考察卷答案及解析
- 2025年产科难产急救处理技巧考查答案及解析
- 2025年传染病学流行病学分析答案及解析
- 2025年妇产科手术操作训练模拟试卷答案及解析
- 2025年整形美容常见手术分析考试答案及解析
- 2025年营养学膳食调理常识考核试题答案及解析
- 2025年骨科常见骨折急救方案选择考核答案及解析
- DISC沟通风格测试
- 九年级英语人教版Unit 1 How Can we become good learners 单元话题书面表达 真题+模拟(含解析)
- 大学体育:轮滑教案
- DB31-T 1380-2022 社会消防技术服务机构质量管理要求
- 常见天气系统课件
- 不良资产项目尽调指引
- 深基坑钢板桩支护方案
- 李家河大坝监测工程大坝安全监测报告
- JJF 1245.1-2019安装式交流电能表型式评价大纲有功电能表
- GB/T 9286-1998色漆和清漆漆膜的划格试验
- 无人机结构与系统-第1章-无人机结构与飞行原理课件
评论
0/150
提交评论