4单片机原理及接口技术.ppt

  1. 1、本文档共69页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 本例中堆栈的操作示意图见图4-10。当主程序第 一次执行PUSH 50H时,把50H中的内容压入40H单元内。 执行ACALL HASC指令后,则主程序的断点地址高低位分别压 入41H、42H单元。进入子程序后,二次执行DEC SP,则把堆 栈指针修正到40H。此时执行POP ACC则把40H中的数据(即 50H单元内容)弹入到ACC中。当查完表以后,执行PUSH ACC,则已转的ASCII码值压入堆栈的40H单元, 二次执行 INC SP,则SP变为42H,此时执 行RET指令,则恰好把原断点内容 又送回PC,SP又指向40H,所以 返回主程序后执行 POP 51H, 正好把40H的内容弹出到51H。 第二次调用过程类似,不再赘述。 * 例4-16 两个8位有符号数加法,和超过8位。 编程说明:在计算机中,有符号数一律用补码表示,两 个有符号数的加法,实际上是两个数补码相加,由于和超 过8位,因此,和就是一个16位符号数,其符号位在16位 数的最高位。在进行这样的加法运算时,应先将8位数符 号扩展成16位,然后再相加。 符号扩展的原则:若是8位正数,则高8位扩展为00H ;若是8位负数,则高8位扩展为FFH。经过符号扩展之后 ,再按双字节相加,则可以得到正确的结果。 编程时,寄存器R2和R3作两个加数的高8位,并先令其为 全0,即先假定两个加数为正数,然后判别符号位,根据 符号位再决定是否将其高8位改为FFH。 子程序入口:(R0)=存放加数的首地址, (R1)=存放和的首地址 工作寄存器:R2作加数的高8位, R3作另一个加数的高8位 4.3.5 运算类程序 * SBADD:MOV R2,#00H ;高8位先设0 MOV R3,#00H MOV A,@R0 ;取出第一个加数 JNB ACC.7,N1 ;若是正数,则转N1 MOV R2,#0FFH ;若是负数,高8位送全1 N1: INC R0 ;修改R0指针 MOV B,@R0 ;取第二个加数到B JNB B.7,N2 ;若是正数,则转N2 MOV R3,#0FFH ;是负数,高8位送全1 N2: ADD A,B ;低8位相加 MOV @R1,A ;存和的低8位 INC R1 ;修改R1指针 MOV A,R2 ;取一个加数的高8位送A ADDC A,R3 ;高8位相加 MOV @R1,A ;存和的高8位 RET 在调用该子程序时,只需把加数及和的地址置入R0和R1,就可以调用这个子程序。 * 例4-17 两个8位带符号数的乘法程序。 编程说明:MCS-51的乘法指令是对两个无符号数求积,若是带符号数相乘,应作如下处理: (1)保存被乘数和乘数的符号,并由此决定乘积的符号。决定积的符号时可使用位运算指令进行异或操作—通过位的与、或运算来完成。 (2)被乘数或乘数均取绝对值相乘,最后,再根据积的符号,冠以正号或者负号。正数的绝对值是其原码本身,负数的绝对值是通过求补码来实现的。 (3)若积为负数,还应把整个乘积求补,变成负数的补码。 子程序入口:(R0)=被乘数,(R1)=乘数 出口:(R3)=积的高8位,(R2)=积的低8位 程序流程图如图4-11所示。 * * 通过上述编程实例,介绍了汇编语言程序设计的各种情况。从中可以看出,程序设计主要涉及两个方面的问题:一是算法,或者说程序的流程图;二是工作单元的安排。在以上例子中,8个工作寄存器已够用,有时也会出现不够用的情况,特别是可以用于间接寻址的寄存器只有R0和R1,很容易不够用,这时,可通过设置RS1、RS0,以选择不同的工作寄存器组,这一点在使用上应加以注意。 * The End 本章结束 * 图(a)结构是“先执行后判断”,适用于循环次数已知的情况。

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档