MCS51指令系统及汇编语言程序设计.ppt_第1页
MCS51指令系统及汇编语言程序设计.ppt_第2页
MCS51指令系统及汇编语言程序设计.ppt_第3页
MCS51指令系统及汇编语言程序设计.ppt_第4页
MCS51指令系统及汇编语言程序设计.ppt_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

第三章mcs 51指令系统及汇编语言程序设计 第3章mcs 51指令系统及汇编语言程序设计3 1指令系统简介3 2寻址方式3 3指令系统3 4汇编语言程序设计基础3 5程序设计实例 3 1指令系统简介 3 1指令系统简介指令系统是一种cpu所能直接执行的所有命令的集合 cpu的主要功能是由它的指令系统来体现的 mcs 51系列单片机指令系统共有111条指令 其中有49条单字节指令 45条双字节指令和17条三字节指令 mcs 51的指令系统中有64条指令的执行时间为一个机器周期 12个振荡周期 45条指令的执行时间为两个机器周期 2条指令的执行时间为四个机器周期 3 1指令系统简介 一 指令格式mcs 51指令系统中的每一条指令都有两级指令格式 cpu可直接识别并执行的机器语言指令 汇编语言指令 简称汇编指令 机器语言指令由二进制数 0 和 1 编码而成 也称目标代码 执行速度最快 汇编语言指令是在机器语言指令的基础上 用英文单词或英文单词缩写表示机器语言指令的操作码 助记符 用符号表示操作数或操作数的地址 汇编语言指令实际上是符号化的机器语言 3 1指令系统简介 mcs 51汇编语言指令格式由以下几个部分组成 标号 操作码 目的操作数 源操作数 注释 其中 中的项表示为可选项 标号 又称为指令地址符号 一般是由1 6个字符组成 以字母开头的字母数字串 与操作码之间用冒号分开 操作码 是由助记符所表示的指令的操作功能 操作数 是指参加操作的数据或数据的地址 注释 是为该条指令作的说明 以便于阅读 操作码是指令的核心 不可缺少 其他几项根据不同指令为可选项 3 1指令系统简介 汇编语言指令格式 标号 操作码操作数1 操作数2 注释 换行表示一条指令结束 例 loop mova 40h 取参数 1 标号 指令的符号地址 2 操作码 指明指令功能 3 操作数 指令操作对象 数据 地址 寄存器名及约定符号 4 注释行 说明指令在程序中的作用 操作码和操作数是指令主体 mov move传送xch exchange交换anl andlogic与逻辑运算xrl exclusiveor异或运算mul multiply乘法rr rotateright右循环sjmp shortjump短跳转ret return子程序返回 3 1指令系统简介 机器语言指令格式 操作码 操作数1 操作数2 有单字节 双字节和三字节指令 汇编语言指令中操作码和操作数是指令主体 称为指令可执行部分 指令表中可查出对应指令代码 举例 汇编语言 机器语言 mova r0e8hmovr6 32h7e32hmov40h 64h754064h 11101000 3 1指令系统简介 二 mcs 51系列单片机指令系统分类按寻址方式分为以下七种 按功能分为以下四种 寻找操作数或指令的地址的方式 1 立即寻址1 数据传送指令2 直接寻址2 算术运算指令3 寄存器寻址3 逻辑运算指令4 寄存器间接寻址指令4 控制转移类指令5 相对寻址5 位操作指令6 变址寻址7 位寻址 3 1指令系统简介 1 功能分类msc 51的指令系统共有111条指令 分为五大类 1 数据传送指令 片内ram 片外ram 程序存储器的传送指令 交换及堆栈进出指令 2 算术运算类 加 带进位加 减 乘 除 加1 减1指令 3 逻辑运算类 逻辑与 或 异或 非及移位指令 4 控制程序转移类 无条件转移与调用 条件转移 空操作指令 5 布尔变量操作类 分为位数据传送 位与 位或 位转移指令 3 1指令系统简介 2 符号说明 rn n 0 7 当前选中的工作寄存器组中的寄存器r0 r7之一 ri i 0 1 当前选中的工作寄存器组中的寄存器r0或r1 间址寄存器或基址寄存器的前缀 data 8位立即数 data16 16位立即数 direct 片内低128个ram单元地址及sfr地址 可用符号名称表示 3 1指令系统简介 addr11 11位目的地址 addr16 16位目的地址 rel 补码形式表示的8位地址偏移量 值在 128 127范围内 用于sjmp和所有的条件转移指令中 bit 片内ram位地址 sfr的位地址 可用符号名称表示 位操作数的取反操作前缀 表示 地址单元或寄存器中的内容 将箭头右边的内容送入箭头左边的单元中 3 1指令系统简介 dptr 为数据指针 可用作16位的地址寄存器 a 累加器acc b 专用寄存器 用于mul和div指令中 c 进位 借位标志位 也可作为布尔处理机中的累加器 当前指令的首地址 3 2寻址方式 3 2寻址方式 是寻找操作数或指令的地址的方式 80c51的寻址方式有七种 即 寄存器寻址 直接寻址 寄存器间接寻址 立即寻址 基址寄存器加变址寄存器变址寻址 相对寻址和位寻址 若不特别声明 我们后面提到的寻址方式均指源操作数的寻址方式 3 2寻址方式 3 2寻址方式 一 操作数类型 位 bit 位寻址区中的一位二进制数据字节 byte 8位二进制数据字 word 16位双字节数据 二 寻址方式 1 立即寻址方式 指令中给出的是实际操作数据 立即数 一般用于为寄存器或存储器赋常数初值 举例 8位立即数 mova 40h a 40h16位立即数 movdptr 2100h dptr 2100h 3 2寻址方式 2 直接寻址方式 指令操作数是存储器单元地址 数据放在存储器单元中 mova 40h a 40h 直接寻址方式对数据操作时 地址是固定值 而地址所指定的单元内容为变量形式 例 设存储器两个单元的内容如图所示 执行指令mova 40h后a 思考题 直接寻址方式指令和立即寻址方式指令的形式有什么不同 56h 3 2寻址方式 3 寄存器寻址方式 4 寄存器间接寻址方式 指令的操作数为寄存器名 寄存器中为数据地址 存放地址的寄存器称为间址寄存器或数据指针 例 mova r0 a r0 设指令执行前a 20h r0 40h 地址为40h存储器单元内容如图所示 执行指令后 a r0 40h 34h 40h 34h 01000000 a r0 00100000 a 20h r0 40h 例 mova r0 a r0 设指令执行前a 20h r0 40h 执行指令后 a r0 指令操作数为寄存器名 数据在寄存器中 40h 40h 3 2寻址方式 5 变址间接寻址方式 例 movca a dptr a a dptr 设指令执行前a 09h dptr 2000h 存储器单元内容如图所示 执行指令后 a dptr 12h 2000h 数据在存储器中 指令给出的寄存器中为数据的基地址和偏移量 数据地址 基地址 偏移量 说明 1 只对程序存储器 2 指令形式 movca a dptrmovca a pcjmp a dptr 3 2寻址方式 指令给出位地址 一位数据在存储器位寻址区 1 内部ram中的位寻址区 字节地址为20h 2fh 2 专用寄存器的可寻址位 11个 83位 表示方法 1 直接使用位地址 如 psw的位6可表示为0d6h2 位名称表示 或ac3 字节地址加位数表示 或0d0h 64 专用寄存器符号加位数表示 或psw 6例 movc 40h cy 位地址40h 设指令执行前cy 1 位地址40h存储器单元如图 执行指令后 cy 0 6 位寻址方式 3 2寻址方式 7 相对寻址方式 目的地址 转移指令地址 转移指令字节数 rel rel为偏移量 当前pc值加上指令中规定的偏移量rel 构成实际的操作数地址例 sjmprel操作 跳转到的目的地址 当前16位pc值 rel 注意 1 当前pc值 指程序中下一条指令所在的首地址 是一个16位数 2 符号 rel 表示 偏移量 是一个带符号的单字节数 范围是 128 127 80h 7fh 在实际编程中 rel 通常用标号代替 3 3指令系统 3 3指令系统 一 数据传送类指令 29条 传送类指令占有较大的比重 数据传送是进行数据处理的最基本的操作 这类指令一般不影响标志寄存器psw的状态 传送类指令可以分成两大类 一是采用mov操作符 称为一般传送指令 二是采用非mov操作符 称为特殊传送指令 如 movc movx push pop xch xchd及swap 3 3指令系统 一般传送指令 3 3指令系统 1 16位传送 这条指令的功能是将源操作数data16 通常是地址常数 送入目的操作数dptr中 源操作数的寻址方式为立即寻址 例如 执行指令movdptr 1234h后 dph 12h dpl 34h 3 3指令系统 2 8位传送 在5种源字节中 只有 data不能用作目的字节 所以可以用4种目的字节为基础构造4类指令 相应的源字节选择依据是 源字节与目的字节不相同 除direct外 寄存器寻址与寄存器间接寻址间不相互传送 片内数据传送指令 3 3指令系统 1 以a为目的操作数 这组指令的功能是把源字节送入累加器中 源字节的寻址方式分别为直接寻址 寄存器间接寻址 寄存器寻址和立即寻址四种基本寻址方式 例 若 r1 20h 20h 55h 执行指令mova r1后 a 55h 3 3指令系统 2 以rn为目的 这组指令的功能是把源字节送入寄存器rn中 源字节的寻址方式分别为立即寻址 直接寻址和寄存器寻址 由于目的字节为工作寄存器 所以源字节不能是工作寄存器及其间址方式寻址 例 若 50h 40h 执行指令movr6 50h后 r6 40h 3 3指令系统 3 以direct为目的 这组指令的功能是把源字节送入direct中 源字节的寻址方式分别为立即寻址 直接寻址 寄存器间接寻址和寄存器寻址 例 若 r1 50h 50h 18h 执行指令mov40h r1后 40h 18h 3 3指令系统 4 以 ri为目的 这组指令的功能是把源字节送入ri内容为地址的单元 源字节寻址方式为立即寻址 直接寻址和寄存器寻址 因目的字节采用寄存器间接寻址 故源字节不能是寄存器及其间址寻址 例 若 r1 30h a 20h 执行指令mov r1 a后 30h 20h 3 3指令系统 特殊传送指令 特殊传送指令的操作符为 movc movx push pop xch xchd和swap 功能分别为 rom查表 外部ram读写 堆栈操作和交换指令 3 3指令系统 3 3指令系统 1 rom查表 程序存储器数据传送指令 1 dptr内容为基址movca a dptr a a dptr 该指令首先执行16位无符号数加法 将获得的基址与变址之和作为16位的程序存储器地址 然后将该地址单元的内容传送到累加器a 指令执行后dptr的内容不变 p49例 2 pc内容为基址movca a pc a a pc 取出该单字节指令后pc的内容增1 以增1后的当前值去执行16位无符号数加法 将获得的基址与变址之和作为16位的程序存储器地址 然后将该地址单元的内容传送到累加器a 指令执行后pc的内容不变 p48例 3 3指令系统 2 读写片外ram 数据存储器数据传送指令 1 读片外ram movxa dptr a dptr movxa ri a ri 第一条指令以16位dptr为间址寄存器读片外ram 可以寻址整个64k字节的片外ram空间 指令执行时 在dph中的高8位地址由p2口输出 在dpl中的低8位地址由p0口分时输出 并由ale信号锁存在地址锁存器中 3 3指令系统 第二条指令以r0或r1为间址寄存器 可以读整个256字节的片外ram空间 指令执行时 低8位地址在r0或r1中由p0口分时输出 ale信号将地址信息锁存在地址锁存器中 多于256字节的访问 高位地址由p2口提供 读片外ram的movx操作 使p3 7引脚输出的信号选通片外ram单元 相应单元的数据从p0口读入累加器中 3 3指令系统 2 写片外ram movx dptr a dptr a movx ri a ri a 第一条指令以16位dptr为间址寄存器写外部ram 可以寻址整个64k字节的片外ram空间 指令执行时 在dph中高8位地址由p2口输出 在dpl中的低8位地址 由p0口分时输出 并由ale信号锁存在地址锁存器中 3 3指令系统 第二条指令以r0或r1为间址寄存器 可以写整个256字节的片外ram空间 指令执行时 低8位地址在r0或r1中由p0口分时输出 ale信号将地址信息锁存在地址锁存器中 多于256字节的访问 高位地址由p2口提供 写片外ram的 movx 操作 使p3 6引脚的信号有效 累加器a的内容从p0口输出并写入选通的相应片外ram单元 外部i o口操作类同 3 3指令系统 3 堆栈操作 堆栈是在内部ram中按 先进后出 的规则组织的一片存储区 此区的一端固定 称为栈底 另一端是活动的 称为栈顶 栈顶的位置 地址 由栈指针sp指示 即sp的内容是栈顶的地址 在80c51中 堆栈的生长方向是向上的 地址增大 系统复位时 sp的内容为07h 通常用户应在系统初始化时对sp重新设置 sp的值越小 堆栈的深度越深 pushdirect sp sp 1 sp direct popdirect direct sp sp sp 1例 若 sp 07h 40h 88h 执行指令push40h后 sp 08h 08h 88h 3 3指令系统 4 数据交换 例 若 r0 80h a 20h 执行指令xcha r0后 a 80h r0 20h 对于单一的mov类指令 传送通常是单向的 即数据是从一处 源 到另一处 目的 的拷贝 而交换类指令完成的传送是双向的 是两字节间或两半字节间的双向交换 1 字节交换 3 3指令系统 2 半字节交换 xchd指令的功能是间址操作数的低半字节与a的低半字节内容互换 swap指令的功能是累加器的高低4位互换 例 若 r0 30h 30h 67h a 20h 执行指令xchda r0指令后 a 27h 30h 60h 若 a 30h 执行指令swapa后 a 03h 3 3指令系统 说明 只有指令表中的指令才有对应指令代码 计算机才能执行 编程时 不能随意创造发明指令 1 一条指令中不能同时出现两个工作寄存器 非法指令 movr1 r2movr2 r0 2 间址寄存器只能使用r0 r1 非法指令 mova r2 3 sfr区只能直接寻址 不能用寄存器间接寻址 非法指令 movr0 80hmova r0 4 指令表 p236 b 指令字节数 m 机器周期数 3 3指令系统 习题 找出指令错误并改正 1 mova 1000h a 1000h a装1个字节数 2 movxa 1000h a 1000h 片外ram dptr ri 3 movca 1000h a 1000h 片外rom dptr pc 4 movx60h a 片外ram 60h a 应为mov 5 movr0 60h 片内ram 61h 60h mov61h r0 片内ram可直接寻址 6 xchr1 r2 r1 r2 必须有a参加 7 movxdptr 2000h dptr 2000h 应为mov 8 movx60h dptr 片内ram 片外ram 必须有a参加 3 3指令系统 二 算术运算类指令 24条 算术运算指令可以完成加 减 乘 除及加1和减1等运算 这类指令多数以a为源操作数之一 同时又使a为目的操作数 3 3指令系统 3 3指令系统 算术运算操作将影响psw中的ov cy ac和p等 进位 借位 标志cy为无符号整数的多字节加法 减法 移位等操作提供了方便 溢出标志ov可方便的控制补码运算 辅助进位标志ac用于bcd码运算 3 3指令系统 1 加法 1 不带进位加 cy 和的d7位有进位时 cy 1 否则 cy 0 ac 和的d3位有进位时 ac 1 否则 ac 0 ov 和的d7 d6位只有一个有进位时 ov 1 溢出表示运算的结果超出了数值所允许的范围 如 两个正数相加结果为负数或两个负数相加结果为正数时属于错误结果 此时 ov 1 p 累加器acc中 1 的个数为奇数时 p 1 为偶数时 p 0 3 3指令系统 例若 a 84h 30h 8dh 执行指令adda 30h之后 由于 即 a 11h cy 1 ac 1 ov 1 d7有进位 d6无进位 p 0 3 3指令系统 2 带进位加 指令的功能是把源操作数与累加器a的内容相加再与进位标志cy的值相加 结果送入目的操作数a中 加的进位标志cy的值是在该指令执行之前已经存在的进位标志的值 而不是执行该指令过程中产生的进位 3 3指令系统 3 增1 指令的功能是把源操作数的内容加1 结果再送回原单元 这些指令仅inca影响p标志 其余指令都不影响标志位的状态 3 3指令系统 4 十进制调整 指令的功能是对累加器a中刚进行的两个bcd码的加法的结果进行十进制调整 两个压缩的bcd码按二进制相加后 必须经过调整方能得到正确的压缩bcd码的和 daa 3 3指令系统 调整要完成的任务是 1 当累加器a中的低4位数出现了非bcd码 1010 1111 或低4位产生进位 ac 1 则应在低4位加6调整 以产生低4位正确的bcd结果 2 当累加器a中的高4位数出现了非bcd码 1010 1111 或高4位产生进位 cy 1 则应在高4位加6调整 以产生高4位正确的bcd结果 十进制调整指令执行后 psw中的cy表示结果的百位值 3 3指令系统 例若 a 01010110b 表示的bcd码为 r3 01100111b 表示的bcd码为 cy 0 执行以下指令 adda r2daa 由于 a 00100011b 即 且 cy 1 即结果为bcd数123 应该注意 da指令不能对减法进行十进制调整 3 3指令系统 2 减法 1 带借位减 cy 差的位7需借位时 cy 1 否则 cy 0 ac 差的位3需借位时 ac 1 否则 ac 0 ov 若位6有借位而位7无借位或位7有借位而位6无借位时 ov 1 如要用此组指令完成不带借位减法 只需先清cy为0 3 3指令系统 例若 a c9h r2 54h cy 1 执行指令subba r2之后 由于 即 a 74h cy 0 ac 0 ov 1 位6有借位 位7无借位 p 0 3 3指令系统 2 减1 这组指令的功能是把操作数的内容减1 结果再送回原单元 这组指令仅deca影响p标志 其余指令都不影响标志位的状态 3 3指令系统 3 乘法 mulab 累加器a与b寄存器相乘该指令的功能是将累加器a与寄存器b中的无符号8位二进制数相乘 乘积的低8位留在累加器a中 高8位存放在寄存器b中 当乘积大于ffh时 溢出标志位 ov 1 而标志cy总是被清0 例若 a 50h b a0h 执行指令mulab之后 a 00h b 32h ov 1 cy 0 3 3指令系统 4 除法 divab 累加器a除以寄存器b该指令的功能是将累加器a中的无符号8位二进制数除以寄存器b中的无符号8位二进制数 商的整数部分存放在累加器a中 余数部分存放在寄存器b中 当除数为0时 则结果的a和b的内容不定 且溢出标志位 ov 1 而标志cy总是被清0 例若 a fbh 251 b 12h 18 执行指令divab之后 a 0dh b 11h ov 0 cy 0 3 3指令系统 三 逻辑运算与循环类指令 24条 逻辑运算指令可以完成与 或 异或 清0和取反操作 当以累加器a为目的操作数时 对p标志有影响 累加器清0操作对p标志有影响 循环指令是对累加器a的循环移位操作 包括左 右方向以及带与不带进位位等移位方式 移位操作时 带进位的循环移位对cy和p标志有影响 3 3指令系统 3 3指令系统 3 3指令系统 1 逻辑与 前2条指令的功能是把源操作数与直接地址指示的单元内容相与 结果送入直接地址指示的单元 后4条指令的功能是把源操作数与累加器a的内容相与 结果送入累加器a中 例若 a c3h r0 aah 执行指令anla r0之后 a 82h 3 3指令系统 前2条指令的功能是把源操作数与直接地址指示的单元内容相或 结果送入直接地址指示的单元 后4条指令的功能是把源操作数与累加器a的内容相或 结果送入累加器a中 2 逻辑或 例若 a c3h r0 55h 执行指令orla r0之后 a d7h 3 3指令系统 3 逻辑异或 前2条指令的功能是把源操作数与直接地址指示的单元内容异或 结果送入直接地址指示的单元 后4条指令的功能是把源操作数与累加器a的内容异或 结果送入累加器a中 例若 a c3h r0 aah 执行指令xrla r0之后 a 69h 3 3指令系统 4 累加器清0和取反 a 0 a a取反 这两条指令的功能分别是把累加器a的内容清0和取反 结果仍在a中 例若 a a5h 执行指令clra之后 a 00h 3 3指令系统 5 累加器循环移位 a的各位依次移动1位 3 3指令系统 有时 累加器a内容乘2 的任务可以利用指令rlca方便地完成 例 若 a bdh 10111101b cy 0 执行指令rlca后 cy 1 a 01111010b 7ah cy 1 结果为 17ah 378 2 bdh 189 3 3指令系统 四 控制转移类指令 17条 通常情况下 程序的执行是顺序进行的 但也可以根据需要改变程序的执行顺序 这种情况称作程序转移 控制程序的转移要利用转移指令 80c51的转移指令有无条件转移 条件转移及子程序调用与返回等 3 3指令系统 3 3指令系统 1 短跳转 1 无条件转移 ajmpaddr11 pc pc 2 pc10 0 addr11该指令执行时 先将pc的内容加2 这是pc指向的是ajmp的下一条指令 然后把指令中11位地址码传送到pc10 0 而pc15 11保持原内容不变 在目标地址的11位中 前3位为页地址 后8位为页内地址 每页含256个单元 3 3指令系统 当前pc的高5位 即下条指令的存储地址的高5位 可以确定32个2kb段之一 所以 ajmp指令的转移范围为包含ajmp下条指令在内的2kb区间 3 3指令系统 2 长跳转 ljmpaddr16 pc addr16第一字节为操作码 该指令执行时 将指令的第二 三字节地址码分别装入指令计数器pc的高8位和低8位中 程序无条件地转移到指定的目标地址去执行 ljmp提供的是16位地址 因此程序可以转向64kb的程序存储器地址空间的任何单元 例若标号 newadd 表示转移目标地址1234h 执行指令ljmpnewadd时 两字节的目标地址将装入pc中 使程序转向目标地址1234h处运行 3 3指令系统 3 相对转移 sjmprel pc pc 2 pc pc rel第一字节为操作码 第二字节为相对偏移量rel rel是一个带符号的偏移字节数 2的补码 取值范围为 127 128 00h 7fh对应表示0 127 80h ffh对应表示 128 1 负数表示反向转移 正数表示正向转移 rel可以是一个转移目标地址的标号 由汇编程序在汇编过程中自动计算偏移地址 并填入指令代码中 在手工汇编时 可用转移目标地址减转移指令所在的源地址 再减转移指令字节数2得到偏移字节数rel 例若标号 newadd 表示转移目标地址0123h pc的当前值为0100h 执行指令sjmpnewadd后 程序将转向0123h处执行 此时rel 0123h 0100 2 21h 3 3指令系统 4 散转移 jmp a dptr pc pc 1 pc a dptr 该指令具有散转功能 可以代替许多判别跳转指令 其转移地址由数据指针dptr的16位数和累加器a的8位数进行无符号数相加形成 并直接装入pc 该指令执行时对标志位无影响 例有一段程序如下 movdptr tablejmp a dptrtable ajmprout0ajmprout1ajmprout2ajmprout3当 a 00h时 程序将转到rout0处执行 当 a 02h时 程序将转到rout1处执行 其余类推 3 3指令系统 2 条件转移 1 累加器判0转移 指令的功能是对累加器a的内容为0和不为0进行检测并转移 当不满足各自的条件时 程序继续往下执行 当各自的条件满足时 程序转向指定的目标地址 目标地址的计算与sjmp指令情况相同 指令执行时对标志位无影响 例若累加器a原始内容为00h 则 jnzl1 由于a的内容为00h 所以程序往下执行inca jnzl2 由于a的内容已不为0 所以程序转向l2处执行 3 3指令系统 2 比较不相等转移 这组指令的功能是对指定的目的字节和源字节进行比较 若它们的值不相等则转移 转移的目标地址为当前的pc值加3后 再加指令的第三字节偏移量rel 若目的字节的内容大于源字节的内容 则进位标志清0 若目的字节的内容小于源字节的内容 则进位标志置1 若目的字节的内容等于源字节的内容 程序将继续往下执行 3 3指令系统 3 减1不为0转移 这组指令每执行一次 便将目的操作数的循环控制单元的内容减1 并判其是否为0 若不为0 则转移到目标地址继续循环 若为0 则结束循环 程序往下执行 3 3指令系统 例有一段程序如下 mov23h 0ahclraloopx adda 23hdjnz23h loopxsjmp 该程序执行后 a 10 9 8 7 6 5 4 3 2 1 37h 3 3指令系统 3 调用与转移 这两条指令可以实现子程序的短调用和长调用 目标地址的形成方式与ajmp和ljmp相似 这两条指令的执行不影响任何标志 1 调用 3 3指令系统 acall指令执行时 被调用的子程序的首址必须设在包含当前指令 即调用指令的下一条指令 的第一个字节在内的2k字节范围内的程序存储器中 lcall指令执行时 被调用的子程序的首址可以设在64k字节范围内的程序存储器空间的任何位置 例若 sp 07h 标号 xadd 表示的实际地址为0345h pc的当前值为0123h 执行指令acallxadd后 pc 2 0125h 其低8位的25h压入堆栈的08h单元 其高8位的01h压入堆栈的09h单元 pc 0345h 程序转向目标地址0345h处执行 3 3指令系统 ret指令的功能是从堆栈中弹出由调用指令压入堆栈保护的断点地址 并送入指令计数器pc 从而结束子程序的执行 程序返回到断点处继续执行 2 返回 reti指令是专用于中断服务程序返回的指令 除正确返回中断断点处执行主程序以外 并有清除内部相应的中断状态寄存器 以保证正确的中断逻辑 的功能 3 3指令系统 4 空操作 nop pc pc 1这条指令不产生任何控制操作 只是将程序计数器pc的内容加1 该指令在执行时间上要消耗1个机器周期 在存储空间上可以占用一个字节 因此 常用来实现较短时间的延时 3 3指令系统 五 位操作类指令 17条 位操作又称布尔操作 它是以位为单位进行的各种操作 位操作指令中的位地址有4种表示形式 直接地址方式 如 0d5h 点操作符方式 如 0d0h 5 psw 5等 位名称方式 如 f0 伪指令定义方式 如 myflagbitf0 以上几种形式表示的都是psw中的位5 与字节操作指令中累加器acc用字符 a 表示类似的是 在位操作指令中 位累加器要用字符 c 表示 注 在位操作指令中cy与具体的直接位地址d7h对应 3 3指令系统 3 3指令系统 movbit c bit cy movc bit cy bit 这两条指令可以实现指定位地址中的内容与位累加器cy的内容的相互传送 1 位传送 例若 cy 1 p3 11000101b p1 00110101b 执行以下指令 movp1 3 cmovc p3 3movp1 2 c结果为 cy 0 p3的内容未变 p1的内容变为00111001b 3 3指令系统 1 位清0 2 位状态设置 这两条指令可以实现位地址内容和位累加器内容的清0 例若 p1 10011101b 执行指令clrp1 3后 结果为 p1 10010101b 3 3指令系统 2 位置位 这两条指令可以实现地址内容和位累加器内容的置位 例若 p1 10011100b 执行指令setbp1 0后 p1 10011101b 3 3指令系统 1 位逻辑 与 3 位逻辑运算 例若 p1 10011100b cy 1 执行指令anlc p1 0后 结果为 p1内容不变 而 cy 0 这两条指令可以实现位地址单元内容或取反后的值与位累加器的内容 与 操作 操作的结果送位累加器c 3 3指令系统 2 位逻辑 或 这两条指令可以实现位地址单元内容或取反后的值与位累加器的内容 或 操作 操作的结果送位累加器c 3 3指令系统 3 位取反 这两条指令可以实现位地址单元内容和位累加器内容的取反 3 3指令系统 1 判cy转移 4 位判跳 条件转移 这两条指令的功能是对进位标志位cy进行检测 当 cy 1 第一条指令 或 cy 0 第二条指令 程序转向pc当前值与rel之和的目标地址去执行 否则程序将顺序执行 3 3指令系统 2 判bit转移 这三条指令的功能是对指定位bit进行检测 当 bit 1 第一和第二条指令 或 bit 0 第三条指令 程序转向pc当前值与rel之和的目标地址去执行 否则程序将顺序执行 对于第二条指令 当条件满足时 指定位为1 还具有将该指定位清0的功能 3 4汇编语言程序设计基础 3 4汇编语言程序设计基础汇编语言是一种采用助记符表示的机器语言 汇编语言与高级语言相比有以下特点 1 在功能相同的条件下 汇编语言生成的目标程序 所占用的存储单元比较少 而且执行的速度也比较快 2 由于单片机应用的许多场合主要是输入 输出 检测及控制 而汇编语言具有直接针对输入 输出端口的操作指令 便于自控系统及检测系统中数据的采集与发送 将汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编 3 4汇编语言程序设计基础 常用的方法有两种 手工汇编时 把程序用助记符指令写出后 通过手工方式查指令编码表 逐个把助记符指令翻译成机器码 然后把得到的机器码程序 以十六进制形式 键入到单片机开发机中 并进行调试 机器汇编是在常用的个人计算机pc上 使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序 生成的目标程序由pc机传送到开发机上 经调试无误后 再固化到单片机的程序存储器rom中 3 4汇编语言程序设计基础 一 汇编语言指令类型 1 机器指令 指令系统中的全部指令 每条指令有对应的机器代码 2 伪指令 汇编控制指令 仅提供汇编信息 没有指令代码 3 宏指令 宏汇编功能 将需要多次反复执行的程序段定义成一个宏指令名 宏定义 编程时 可在程序中使用宏指令名来替代一段程序 宏调用 3 4汇编语言程序设计基础 宏定义过程 宏指令名macro形式参数 定义程序段endm宏调用过程 宏指令名实际参数 宏指令名实际参数 3 4汇编语言程序设计基础 二 汇编控制指令 伪指令 伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令 它不是单片机执行的指令 所以没有对应的可执行目标码 汇编后产生的目标程序中不会再出现伪指令 1 起始地址设定伪指令org格式为 org表达式该指令的功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址 表达式通常为16进制地址 也可以是已定义的标号地址 3 4汇编语言程序设计基础 org8000hstart mova 30h 此时规定该段程序的机器码从地址8000h单元开始存放 在每一个汇编语言源程序的开始 都要设置一条org伪指令来指定该程序在存储器中存放的起始位置 若省略org伪指令 则该程序段从0000h单元开始存放 在一个源程序中 可以多次使用org伪指令规定不同程序段或数据段存放的起始地址 但要求地址值由小到大依序排列 不允许空间重叠 3 4汇编语言程序设计基础 2 汇编结束伪指令end格式为 end该指令的功能是结束汇编 汇编程序遇到end伪指令后即结束汇编 处于end之后的程序 汇编程序将不处理 3 4汇编语言程序设计基础 3 字节数据定义伪指令db 标号 db字节数据表功能是从标号指定的地址开始 在rom中定义字节数据 该伪指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中 一个数据占一个存储单元 例如 db howareyou 把字符串中的字符以ascii码的形式存放在连续的rom单元中 又如 db 2 4 6 8 10 18把6个数转换为十六进制表示 feh fch fah 08h 0ah 12h 并连续地存放在6个rom 3 4汇编语言程序设计基础 该伪指令常用于存放数据表格 如要存放显示用的十六进制的字形码 可以用多条db指令完成 db0c0h 0f9h 0a4h 0b0hdb99h 92h 82h 0f8hdb80h 90h 88h 83hdb0c6h 0a1h 86h 84h 3 4汇编语言程序设计基础 4 字数据定义伪指令dw 标号 dw字数据表功能是从标号指定的地址单元开始 在程序存储器中定义字数据 该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中 应特别注意 16位的二进制数 高8位存放在低地址单元 低8位存放在高地址单元 例如 org1400hdata dw324ah 3ch 汇编后 1400h 32h 1401h 4ah 1402h 00h 1403h 3ch 3 4汇编语言程序设计基础 5 空间定义伪指令ds 标号 ds表达式功能是从标号指定的地址单元开始 在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间 并都填以零值 例如 org3000hbuf ds50 汇编后 从地址3000h开始保留50个存储单元作为备用单元 3 4汇编语言程序设计基础 6 赋值伪指令equ符号名equ表达式功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名 例如 lenequ10sumequ21hblockequ22hclramovr7 lenmovr0 blockloop adda r0incr0djnzr7 loopmovsum aend该程序的功能是 把block单元开始存放的10个无符号数进行求和 并将结果存入sum单元中 3 4汇编语言程序设计基础 7 位地址符号定义伪指令bit格式为 符号名bit位地址表达式功能是将位地址赋给指定的符号名 其中 位地址表达式可以是绝对地址 也可以是符号地址 例如 stbitp1 0将p1 0的位地址赋给符号名st 在其后的编程中就可以用st来代替p1 0 3 4汇编语言程序设计基础 三 汇编语言程序设计步骤 1 确定方案和计算方法2 了解应用系统的硬件配置 性能指标 3 建立系统数学模型 确定控制算法和操作步骤 4 画程序流程图 确定程序的流向5 编制源程序 1 合理分配存储器单元和了解i o接口地址 2 按功能设计程序 明确各程序之间的相互关系 3 用注释行说明程序 便于阅读和修改调试和修改 6 上机调试程序 3 4汇编语言程序设计基础 编制程序的方法和技巧 1 采用模块化程序设计方法 应用系统的程序由包含多个模块的主程序和各种子程序组成 各程序模块都要完成一个明确的任务 实现某个具体的功能 如 发送 接收 延时 打印和显示等 模块化的程序设计方法具有明显的优点 把一个多功能的复杂的程序划分为若干个简单的 功能单一的程序模块 有利于程序的设计和调试 有利于程序的优化和分工 提高了程序的阅读性和可靠性 使程序的结构层次一目了然 3 4汇编语言程序设计基础 2 尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少 占用内存空间减少 多重循环 注意各重循环的初值和循环结束条件 避免出现 死循环 现象 通用的子程序 除了用于存放子程序入口参数的寄存器外 子程序中用到的其它寄存器的内容应压入堆栈进行现场保护 并要特别注意堆栈操作的压入和弹出的平衡 中断处理子程序除了要保护程序中用到的寄存器外 还应保护标志寄存器 3 5程序设计实例 3 5程序设计实例一 汇编语言基本程序设计1 简单程序简单程序是按照程序编写的顺序逐条依次执行的 是程序的最基本的结构 例3 39 将片内ram的30h和31h的内容相加 结果存入32h 假设整个程序存放在存储器中以2000h为起始地址的单元 程序1 org2000hmova 30h 取第一个操作数adda 31h 两个操作数相加mov32h a 存放结果end本程序采用直接寻址方式传送数据进行两个操作数相加运算 2 分支程序分支程序是根据程序中给定的条件进行判断 然后根据条件的 真 与 假 决定程序是否转移 例3 41 把片外ram的首地址为10h开始存放的数据块 传送给片内ram首地址为20h开始的数据块中去 如果数据为 0 就停止传送 程序如下 org2000hmovr0 10hmovr1 20hloop movxa r0 a 片外ram数据here jzhere 数据 0终止 程序原地踏步mov r1 a 片内ram aincr0incr1sjmploop 循环传送 程序有误 不能跳出循环end 3 5程序设计实例 3 循环程序在程序执行过程中 当需要多次反复执行某段程序时 可采用循环程序 循环程序一般由三部分组成 1 初始化 2 循环体 3 循环控制 例3 43 有20个数存放在内部ram从41h开始的连续单元中 试求其和并将结果存放在40h单元 和数是一个8位二进制数 不考虑进位问题 程序流程图如图3 3所示 程序如下 org2000hmova 00h 清累加器amovr7 14h 建立循环计数器r7初值movr0 41h 建立内存数据指针loop adda r0 累加incr0 指向下一个内存单元djnzr7 loop 修改循环计数器 判循环结束条件mov40h a 存累加结果于40hsjmp end 3 5程序设计实例 二 延时程序设计 例3 45 较长时间的延时子程序 可以采用多重循环来实现 利用cpu中每执行一条指令都有固定的时序这一特征 令其重复执行某些指令从而达到延时的目的 子程序如下 教材p80源程序机器周期数delay movr7 0ffh1 子程序入口delayloop1 movr6 0ffh1loop2 nop1nop1djnzr6 loop22djnzr7 loop12ret2 子程序结束 3 5程序设计实例 三 代码转换程序设计 例3 46 编写一子程序 将8位二进制数转换为bcd码 设要转换的二进制数在累加器a中 子程序

温馨提示

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

评论

0/150

提交评论