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

下载本文档

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

文档简介

第3章指令与汇编语言程序设计 本章主要内容 一 程序设计的步骤 1 分析问题 明确所要解决问题的要求 确定算法或解题思路2 画流程图 3 编写源程序画流程图4 汇编和调试程序书写的两种格式 第一种是完整程序格式的形式 即在第二章介绍的程序一般结构 第二种就是子程序的形式 二 顺序程序设计顺序程序设计 又叫直线程序 它是按照指令的顺序依次执行的程序 它也是所有程序设计中最基本 最重要的程序 例3 1 0 15共十六立即数送到内部RAM30H开始的单元中 本题题意非常清楚 就是将0送到内RAM30H单元 将1送到内RAM31H单元 以此类推 将立即数送到内部RAM单元有现成的指令 这是一个功能性数据处理 格式上可以写成子程序的形式 程序设计如下 START MOV30H 0 30H 0MOV31H 1 31H 1 MOV3FH 15 3FH 15RET 返回 一 循环程序的结构 1 循环程序 主要是用来实现功能相同 反复执行的操作 循环程序一般包括四个部分 循环初值 循环体 循环修改和循环控制 循环初值 循环程序开始循环执行的初始条件 如循环的次数等 在循环程序的开始部分 只执行一次 循环体 是循环程序的核心 就是反复要完成的具体操作功能 循环修改 循环体执行一次后 再次执行之前 需要对有关参数进行修改 为下一轮循环做准备 和循环体一样 循环修改的程序内容也是反复多次执行的 循环控制 根据循环预先确定的次数 或者循环过程中有关操作数的内容进行判断 控制循环的结束 2 加1和减1指令 1 加1指令1 INCA A A 12 INCRn Rn Rn 13 INCdirect direct direct 14 INC Ri Ri Ri 15 INCDPTR DPTR DPTR 1 2 减1指令1 DECA A A 12 DECRn Rn Rn 13 DECdirect direct direct 14 DEC Ri Ri Ri 1 3 循环程序设计举例 例3 3 0 15共十六个立即数送到内部RAM30H开始的单元中 MOVR0 30HMOVA 0MOV R0 A MOVR0 31HMOVA 1MOV R0 A MOVR0 3FHMOVA 15MOV R0 A MOV30H 0 MOV31H 1 MOV3FH 15 START MOVR2 16 循环次数MOVR0 30H 指向第一个单元 循环初值MOVA 0 送的第一个数AA MOV R0 A 循环体 完成数据传 送循环体循环修改INCA 循环修改INCR0 修改指向的单元DJNZR2 AA 循环次数减1 到0退 出循环 循环控制RET 子程序返回0 二 比较转移指令与循环程序设计 1 比较转移指令 1 CJNEA data rel PC PC 3 若A data 程序顺序执行 若A data PC PC rel 程序转移 Cy 0 若A data PC PC rel 程序转移 Cy 1 2 CJNERn data rel PC PC 3 若Rn data 程序顺序执行 若Rn data PC PC rel 程序转移 Cy 0 若Rn data PC PC rel 程序转移 Cy 1 3 CJNE Ri data rel PC PC 3 若 data 程序顺序执行 若 Ri data PC PC rel 程序转移 Cy 0 若 Ri data PC PC rel 程序转移 Cy 1 4 CJNEA direct rel PC PC 3 若A direct 程序顺序执行 若A direct PC PC rel 程序转移 Cy 0 若A direct PC PC rel 程序转移 Cy 1 2 比较转移指令应用举例例3 3程序用比较转移指令修改如下 START MOVR0 30H 指向第一个单元MOVA 0 送的第一个数AA MOV R0 A 循环体 完成数据传送INCA 修改送的数据INCR0 修改指向的单元CJNEA 16 AA 根据操作数信息控 制循环循环控制RET 子程序返回也可以通过对R0中数据判断比较控制程序结束 1 循环移位指令 1 循环左移指令RLA 三 循环移位指令与程序设计 2 循环右移指令RRA 3 带进位位的循环左移指令RLCA 4 带进位位的循环右移指令RRCA 例3 6 执行下面的指令 在注释区记录A中数据的变化 MOVA 03H A 00000011B 3CLRC Cy 0RLCA A 00000110B 6 Cy 0RLCA A 00001100B 12 Cy 0可以看出左移一次相当于乘2 类似右移相当除以2 2 循环移位指令应用 2 循环移位指令应用 例3 7 将第二章的循环流水灯程序修改成循环程序ORG0000HLJMPSETUPORG0030HSETUP MOVA 0FEH 循环初值MAIN MOVP1 A 点亮灯LCALLDELAY 调延时子程序RLA 循环修改LJMPMAIN DELAY MOVR6 80H 延时子程序DEL1 MOVR7 0DEL DJNZR7 DELDJNZR6 DEL1RET 子程序返回END 1 条件转移指令 1 判A转移指令JZrel PC PC 2 若A 0 则转移 PC PC rel 若A 0 则顺序执行 JNZrel PC PC 2 若A 0 则转移 PC PC rel 若A 0 则顺序执行 四 条件转移指令与循环程序设计 2 判Cy转移指令JCrel PC PC 2 若Cy 1 则转移 PC PC rel 若Cy 0 则顺序执行 JNCrel PC PC 2 若Cy 0 则转移 PC PC rel 若Cy 1 则顺序执行 3 判A转移指令JBbit rel PC PC 3 若 bit 1 则转移 PC PC rel 若 bit 0 则顺序执行 JNBbit rel PC PC 3 若 bit 0 则转移 PC PC rel 若 bit 1 则顺序执行 JBCbit rel PC PC 3 若 bit 0 则顺序执行 若 bit 1 则转移 PC PC rel 且 bit 0 2 条件转移指令应用 例3 9 编写程序计算内RAM20H单元中 1 的个数 存放在R3中 START MOVR3 0MOVA 20HMOVR2 8AA RLCAJNCBBINCR3BB DJNZR2 AA RET 例3 10 内部RAM30H开始的十六个单元 有一组无符号数 试编写程序将其中满足偶校验的数送到内部RAM50H开始的单元 START MOVR0 30HMOVR1 50HMOVR2 16AA MOVA R0JBP BBMOV R1 AINCR1BB INCR0DJNZR2 AA RET 五 分支程序的设计 1 单分支结构程序 2 多分支结构程序 例3 11 内部RAM30H开始的单元 存放有一组无符号数据块 数据块的长度在20H单元中 试编写程序计算数据块中满足偶校验和满足奇校验数的个数 分别存放在R2和R3中 START MOVR0 30HMOVR2 0HMOVR3 0AA MOVA R0JBP BBINCR2SJMPCCBB INCR3CC INCR0DJNZ20H AA RET 例3 12 根据A中的内容选择相应的程序段执行 START MOVDPTR TAB 指令表首址送DPTRCLRCRLCA A的值乘以2JNCAA INCDPH 超过256在DPH中加1AA JMP A DPTR 散转指令TAB AJMPLOOP0 无条件转移指令表AJMPLOOP1 AJMPLOOPnLOOP0 分支程序0 LOOP1 分支程序1 一 堆栈的概念 1 堆栈是内部RAM中一段用来暂时存放数据的存储区 通常用来保护断点和现场 2 SP 堆栈指针对其进行管理 SP始终指向堆栈顶部数据的地址 SP在单片机复位后它的值是07H 3 堆栈中数据的存取方式按照先进后出 后进先出的原则进行 4 堆栈操作 1 压栈 先将SP加1 然后将要压入堆栈的数据送到SP指示的单元中 2 弹栈 先将数据弹出 然后将SP减1 指向新的单元 二 堆栈操作指令 1 堆栈操作指令PUSHdirect SP 1 SP direct SP POPdirect SP direct SP 1 SP 例3 13 已知SP 60H 分析执行下列指令后的结果 MOVDPTR 1234H DPTR 1234HPUSHDPH SP 1 SP SP 61H DPH SP 61H 12H PUSHDPL SP 1 SP SP 62H DPH SP 62H 34H POPDPH DPH SP 62H 34H SP 1 SP SP 61H POPDPL DPH SP 61H 12H SP 1 SP SP 60H 执行结果 SP 60H 两次压栈 两次出栈 SP不变 DPTR 3412H 和原来的值高低位颠倒 从本例可以看出 堆栈的操作一定要注意操作规则 先进后出 后进先出 2 隐含的堆栈操作指令LCALLaddr16 PC PC 3 SP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr16 PCACALLaddr11 PC PC 2 SP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr11 PC10 0RET SP PC15 8 SP 1 SP SP PC7 0 SP 1 SP 中断的响应与返回也会对堆栈进行操作 一般情况下 应在初始化区对SP进行设置 将堆栈设定在数据缓冲区 一 算术运算指令 1 加法指令 1 不带进位位的加法指令ADDA data A data A 最高位有进位 时 Cy 1 否则 Cy 0 ADDA Rn A Rn A 最高位有进位时 Cy 1 否则 Cy 0 ADDA direct A direct A 最高位 有进位时 Cy 1 否则 Cy 0 ADDA Ri A Ri A 最高位有进位 时 Cy 1 否则 Cy 0 2 带进位位的加法指令ADDCA data A data Cy A 最高位有进位 时 Cy 1 否则 Cy 0 ADDCA Rn A Rn Cy A 最高位有进位时 Cy 1 否则 Cy 0 ADDCA direct A direct Cy A 最高位 有进位时 Cy 1 否则 Cy 0 ADDCA Ri A Ri Cy A 最高位有进 位时 Cy 1 否则 Cy 0 ADD用于首次相加 ADDC用于除首次以外的相加 例3 14 已知两个双字节无符号数 分别存放在R1R0和R3R2中 高位在前 试编写程序求它们的和 结果存放在R6R5R4中 R1R0 R3R2R6R5R4 START MOVA R0 取一个加数的低8位ADDA R2 与另外一个数的低8位相加MOVR4 A 存低8位的和MOVA R1 取一个加数的高8位ADDCA R3 高8位相加 并加低8位相加时 的CyMOVR5 A 存高8位的和CLRA A清0ADDCA 0 0 0 Cy A 取出高8位相加时 的CyMOVR6 A 存进位RET 3 BCD码调整指令DAA 例3 17 已知两个BCD码表示的数 分别存放在R1R0和R3R2中 高位在前 试编写程序求它们的和 结果存放在R6R5R4中 START MOVA R0 取一个加数的低位ADDA R2 与另外一个数的低位相加DAA 低位和BCD码调整MOVR4 A 存低位的和MOVA R1 取一个加数的高位ADDCA R3 高位相加 并加低位相加时的CyDAA 高位和BCD码调整MOVR5 A 存高位的和CLRA A清0ADDCA 0 0 0 Cy A 取出高位相加时的CyMOVR6 A 存进位RET 2 减法指令SUBBA data A data Cy A 高位有借位 时 Cy 1 否则 Cy 0 SUBBA Rn A Rn Cy A 高位有借位时 Cy 1 否则 Cy 0 SUBBA direct A direct Cy A 高位 有借位时 Cy 1 否则 Cy 0 SUBBA Ri A Ri Cy A 高位有借 位时 Cy 1 否则 Cy 0 减法只有带进位位的减法指令 因此第一次执行除法时 需要将Cy清0 例3 18 已知两个双字节数 被减数存放在R1R0中减数存放在R3R2中 高位在前 试编写程序求它们的差 结果存放在R5R4中 R1R0 R3R2R5R4 START CLRC 清CyMOVA R0 取被减数的低8位SUBBA R2 减去减数的低8位MOVR4 A 存低8位的差MOVA R1 取被减数的高8位SUBBA R3 减去减数的高8位 和低8位的借位MOVR5 A 存高8位的差RET 注意下面两条指令的区别 有些情况不能互换 INCA 不影响Cy OV AC标志位ADDA 1 影响Cy OV AC标志位 例3 16 已知一个原码表示的双字节有符号数存放在R1R0 高位在前 中 试编写程序求它的补码 结果存放在R1R0中 START MOVA R1 取高8位JNBACC 7 AA 高位为0 表示正数转移 不需变换MOVA R0 取低8位CPLA 求反ADDA 1 加1MOVR0 A 存低8位MOVA R1 取高8位CPLA 求反ADDCA 0 加低8位的进位SETBACC 7 高位置1 负数MOVR1 A 存高8位AA RET 3 乘法指令MULAB A B BA实现两个8位的无符号数相乘 例3 19 已知两个无符号数分别存放在R1R0和R2中 试编写程序计算它们的积 结果存放在R5R4R3中 高位在前 R1R0 R2B1A1 B2A2R5R4R3 积的高8位放在寄存器B中 而积的低8位放在累加器A中 START MOVA R0 取被乘数的低8位MOVB R2 取乘数MULAB 相乘MOVR3 A MOVR4 B 存放积MOVA R1 取被乘数的高8位MOVB R2 取乘数MULAB 相乘ADDA R4 错位相加MOVR4 A 和回存CLRA 清AADDCA B 进位加到高字节中MOVR5 A 存高字节RET 4 除法指令DIVAB A B的商存放在A中 余数存放 在B中 Cy 0 OV 0 二 逻辑运算指令 1 逻辑 与 运算指令ANLA data A data AANLA Rn A Rn AANLA direct A direct AANLA Ri A Ri AANLdirect data direct data AANLdirect A direct A A 2 逻辑 或 运算指令ORLA data A data AORLA Rn A Rn AORLA direct A direct AORLA Ri A Ri AORLdirect data direct data AORLdirect A direct A A 3 逻辑 异或 运算指令XRLA data A data AXRLA Rn A Rn AXRLA direct A direct AXRLA Ri A Ri AXRLdirect data direct data AXRLdirect A direct A A 例3 22 已知A中内容是10110110B 分别执行下面三条指令 分析A中的内容 ANLA 01101010B A 00100010BORLA 01101010B A 11111110BXRLA 01101010B A 11011100B 4 位逻辑运算指令 1 位逻辑 与 运算指令ANLC bit C bit CANLC bit C bit C 2 位逻辑 或 运算指令ORLC bit C bit CORLC bit C bit C 5 交换指令 1 字节交换指令XCHA Rn A RnXCHA Ri A Ri XCHA direct A direct 2 半字节交换指令XCHDA Ri A3 0 Ri 3 0 3 累加器高低4位互换指令SWAPA A3 0 A7 4 例3 23 已知2位BCD码存放在内部RAM30H中 试编写程序将其转换为二进制数 存放在31H单元中 START MOVA 30H ANLA 0F0H 取数屏蔽低4位SWAPA 高低位互换 的十位数MOVB 10 乘数10MULAB A 10aMOV31H A 暂存数据MOVA 30H ANLA 0FH 取数屏蔽高4位 得个位ADDA 31H 得到二进制数MOV31H A 保存二进制数RET 一 查表指令 1 定义字节伪指令DB格式 标号 DB8位二进制数表功能 从标号所指定的地址空间开始 定义若干个ROM单元的数据 如 TAB DB30H 31H 32H 33H 34H 35H 36H 37H 38H 39HTAB1 DB 0 1 2 3 4 5 6 7 8 9 这两条指令的功能一样 都是在指定的标号处开始的地址单元中存放0 9的字符信息 2 查表指令MOVCA A DPTR A DPTR AMOVCA A PC PC 1 PC A PC A功能是从ROM 程序存储器 空间单元中取一个数到A中 二 查表程序设计 1 用MOVCA A DPTR设计查表程序的步骤 定义表格 表格中的数据必须按照一定的顺序 将表格的首地址送给数据指针DPTR 基址 将要找的项与表格首地址的间隔数送给A 变址 执行MOVCA A DPTR指令 2 用MOVCA A PC设计查表程序的步骤 定义表格 表格中的数据必须按照一定的顺序 将要找的项与表格首地址的间隔数送给A 变址 A中加上适当的偏移量 查表指令下一条指令的首地址与表格首地址的间隔数 执行MOVCA A PC指令 例3 24 已知一位十进制数存放在R0中 编写程序求它的平方结果放在R1中 START MOVDPTR TABMOVA R0MOVCA A DPTRMOVR1 ARETTAB DB0 1 4 9 16 25 36 49 64 81 十进制数 码的平方 三 LED数码管 1 LED数码管段 a b c d e f g Dp位 COM 公共端 2 LED数码管编码方式 3 LED数码管的静态显示电路数码管的静态显示电路中 公

温馨提示

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

最新文档

评论

0/150

提交评论