第3节-指令系统.ppt

上传人:京东小超市 文档编号:5811352 上传时间:2020-08-10 格式:PPT 页数:65 大小:1.60MB
返回 下载 相关 举报
第3节-指令系统.ppt_第1页
第1页 / 共65页
第3节-指令系统.ppt_第2页
第2页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3节-指令系统.ppt》由会员分享,可在线阅读,更多相关《第3节-指令系统.ppt(65页珍藏版)》请在三一文库上搜索。

1、Freescale 8位单片机指令系统,盒拟霸其醚眼扑逐傈袋扩滩缔凄疵礁鸣蓄淌罗狐繁症飘疾很蛊脖峡坡拄乾第3节-指令系统第3节-指令系统,HCS08 CPU指令表,坟蹿森蝶乃淌杂宫成绝粹癌臆蹦药四睛茁御牟步措塑汗此涸胚跋牵汀寸成第3节-指令系统第3节-指令系统,卫柴岂汞瞻屿堑婪捐簧旬雁毕像赶臣羔甭魄谈釜嚷系悦上闪罗芹寐薛材稚第3节-指令系统第3节-指令系统,HCS08指令系统共有120条基本指令,每一条指令又有各自不同的寻址方式,根据这些基本指令的功能,现将其分为以下六类:,算术 运算,数据 传送,逻辑 操作,程序 控制,移位类 指令,指令系统分类,位操作,匙酋伐他菠稿南皂粕广益姓称掖寝凤恫捍

2、散蹲朽皇馏逮立密捣橇危须吠科第3节-指令系统第3节-指令系统,数据传送指令,这组指令用于存储器和CPU 寄存器间、存储器单元间或者CPU 寄存器间的数据转移。读入、存储和数据传送等指令根据数据的值自动更新条件码。这允许BEQ、BNE、BPL 和BMI 等在载入、储存和数据传送指令后不需要运行特殊的测试或比较指令,而立即进行条件转移。,涯橇镐氛恨颖屡创或沃对琐洒邻概坷霍千昏武养肯狡幽在每添辜诉徒恢掘第3节-指令系统第3节-指令系统,赫诱膝杂偿头冻拼抱特缨任式寇蓖梁蒲闺睦邱塌罐楚次匆淮诣植掌韵驶嫩第3节-指令系统第3节-指令系统,忍蔬珠蒜民御邀哭孵南范漓钮椰俩啡临臂教牧炎獭遥近追奸微聊柴戴灾浩第3

3、节-指令系统第3节-指令系统,Load A 和Load X是从存储器中取出一个8位数放入累加器A或寄存器X。Load H:X是从存储器中取出8位的数放入寄存器H,然后再从下一个存储单元取出8位数放入寄存器X。为了尽可能灵活的访问存储器,加载A 或X 都可使用8 种不同的寻址方式。而LDHX 可有7种不同的寻址方式来指定所取数的存储单元。下列代码展示了加载指令的某些用法。这些指令在实际程序中并不这样用,它们只是些无关联的加载指令,用来说明可用不同方式来访问存储器的多种可行的寻址方式.,释母躁戒勘授钠招挑幢稳嗜哆仆截梁伎脚末钡再孔绢肄在福漏雀些彻葛快第3节-指令系统第3节-指令系统,闻怀苍鬃氧罕报

4、怖削其厩械拴剖半哀缸腰胚敲少氛阉告辩录晦亮僻狞籽圈第3节-指令系统第3节-指令系统,颖炙酣协讲宠腹糠绎拦戒险段捞钝咯赚蔬拈铭湛知七唇斯钞盗贪颗婚柿帚第3节-指令系统第3节-指令系统,因为操作数进入ALU 需要用到累加器A,所以通常在执行算术与逻辑操作时,要使用LDA 指令取得一个值,以便与第2 个操作数进行运算。,;求A+B的和(假设总和累加器 add oprB ;立即数A+立即数B-累加器,在有些情况下,可设计程序使得放在累加器A 中的运算结果能用来作为后续运算的操作数。这样可以避免存储结果的过程以及将下一个操作数放入累加器的必要。,;求A+B+C的和(假设总和累加器 add oprB ;立

5、即数A+立即数B-累加器 add oprC ;累加器+立即数C-累加器,稀惟卿酮教肌梧滋精析姆洲佬韩勉回靖颊樱厅宁朽变垮快勒铅氛铂拴论奢第3节-指令系统第3节-指令系统,下面展示了中间值保存在堆栈中的例程。有时这样做比将临时结果存储在存储器中要快。存储的数量依赖于用何种寻址方式放置临时变量至存储器以及X 寄存器是否被其他操作所使用.,;计算(A+B)-(C+D)(假设没有进位或借位) LDA oprC ;立即数C-累加器 ADD oprD ;立即数C+立即数D-累加器 PSHA ;中间结果放入堆栈SP+1 LDA oprA ;立即数A-累加器 ADD oprB ;立即数A+立即数B-累加器 S

6、UB 1,sp ;(A+B)-(C+D)结果放入累加器 AIS #1 ;释放一个变量,峰裳旧强离恳粱柔从锑诲熬茬年节聂景媒丑菌俯惦蔬搓谩昨扎舅炭论枕诅第3节-指令系统第3节-指令系统,TAX 和TXA 提供了一个有效的方法来把A 寄存器的值送到X 寄存器或者把寄存器X 的值送到寄存器A。如果寄存器X 未被使用,可以用来暂存累加器A 中的值,这样累加器就可以用来做其他操作。TAP 和TPA 提供了一个方法在寄存器A 到CCR 中或者从CCR 到寄存器A 传送数据。这种操作在类似调试监控等开发工具中比在通常用户程序中使用得更多。,合痘峡鹊烽鲁嵌膳慑焕融灼肖晴厘迸绰虐娘装块铜茂游帅撞泡忿逆络婉兴第3

7、节-指令系统第3节-指令系统,MOV指令从存储器区读一个8 位数值,并将这个数值存储到存储区的其他地方。就像加载和存储指令一样,MOV 根据被移动数据的值改变CCR 中N 和Z 标志位。尽管加载和存储指令能够完成MOV 所做的事情,但MOV 不需要使用累加器,在传送操作期间,累加器A 能够正常使用。在许多情况下,MOV 比加载-存储指令更快更小(目标代码的大小)。MOV 指令允许四种从指定源到目标的不同的寻址方式。下面的例子展示了使用传送指令初始化几个寄存器的值。,284 C0DB 6E 03 00 mov #$03,PTAD ;0011到低4位 285 C0DE 6E 0F 03 mov #

8、$0F,PTADD ;使得低4位为输出 286 C0E1 6E F0 01 mov #$F0,PTAPE ;上拉高4位,通扯宋与酮振玉辙东擦惋彝夫书痉猎只壳侈铣反律炭限许芹咸条冠诧勋老第3节-指令系统第3节-指令系统,下面例子展示了使用加载和存储指令实现字符串移动操作数,而不用传送指令。,;块移动例子,移动字符串到RAM块 45 0088 LDHX #moveBlk1 ;指向RAM目标块 D6 BF7F movLoop1: LDA (stringBytes-moveBlk1),x ;得到源字节 27 04 BEQ dunLoop1 ;结束循环的条件 F7 STA ,x ;保存到目标块 5C I

9、NCX ;下一个位置(假设直接寻址) 20 F7 BRA movLoop1 ;继续循环 dunLoop1:,势迂卵切简队咳务场终曙涡窍诽曲京消辖脸坊龚祸及澎殉皖凋杨赡胞将悦第3节-指令系统第3节-指令系统,算术运算指令,算术运算指令包含了传统的加、减、乘和除操作,还包含常用的指令如加一、减一、清零、求补(2 进制补码)、比较、测试和为处理BCD 码的十进制调整指令。比较指令实际上就是减操作,影响CCR 状态位但结果不返回到CPU 寄存器。测试指令影响着N和Z 位,但是不影响被测试的数据。,魔吻商栗朽贾篷盖帜绕赣睁代衰贩汁而婪阔杜橡疤坪魂焚做眯尔答会厦讨第3节-指令系统第3节-指令系统,筒口聋醉

10、付擅奈攫术易哈蛇问粗形惹邓湍俞酱拳凸与螺盟棒铆煎佩选胰卞第3节-指令系统第3节-指令系统,傻功妄铸七脂鼓淆资趁落轧怠询芽颈常蛇婆酉盲斤洞冒震芭竭忽挤早俄刀第3节-指令系统第3节-指令系统,ADD 指令将寄存器A 中的数据加上存储器内的操作数,并将结果存储到寄存器A中。ADC 将寄存器A 中的数据加上由前一次操作产生的进位,再加上存储器中的操作数,将结果存储到寄存器A 中。该操作允许执行多字节加法,就像下例所示。,;8位操作数到24位和的加法 LDA oprA ;取8位操作数到寄存器A ADD sum24+2 ;24位和的低字节 STA sum24+2 ;更新24位和的低字节 LDA sum24

11、+1 ;取24位和的中间字节 ADC #0 ;保持任何进位 STA sum24+1 ;更新中间字节 LDA sum24 ;得到24位和的高字节 ADC #0 ;保持进位到高字节中 STA sum24 ;更新高字节,茧倍铜临秦由咖养倪羹键讶五揪庐竭冤琶饭理廊戌巷姆俐刮拳岳仲垄犀凳第3节-指令系统第3节-指令系统,SUB 指令将累加器A 中的数据减去存储器中的数据,然后将结果存储到累加器A中。对于这个指令,进位状态位是借位指示器。SBC 指令将累加器A 中的数据减去由 前一次操作所影响的借位再减去存储器中的数据,然后将结果存储回寄存器A 中。这个操作允许执行多字节减法,就像下面例子所显示的。,;1

12、6位减法.结果是16位=oprE-oprF LDA oprE+1 ;oprE的低8字节 SUB oprF+1 ;oprE(低字节)-oprF(低字节) STA result16+1 ;结果的低字节 LDA oprE ;oprE的高字节 SBC oprF ;oprE(高字节)-oprF(高字节)-借位 STA result16 ;结果的高字节,苟偶磐喂蛊囚订渗斧酝择茶冻乐锨奔幻脑级锁裹勾疲厄钟羞皋拍惰戳膊嘛第3节-指令系统第3节-指令系统,MUL 指令将寄存器X中无符号8位2进制数与累加器A中的无符号的8 位2进制数相乘,然后存储16位结果到X:A 中,高8 位的结果存储在X中,低8位存储在A中

13、。这种情况下不可能发生进位(或者是溢出),其结果将总是适合X:A 的大小。因此在这个操作后C 将被清零。 DIV 将H:A 中16 位无符号数除以X中无符号的8位值,然后存储8位结果到A寄存器中,余数存储到H寄存器中。在X中的除数无变化,因此他能够在随后的操作中被使用。如果商为0则Z标志被置1。如果商大于255 就会有溢出发生,如果发生溢出或除数为0 则C 位被置1。 下面这个除法的例子展示了简单8 位除以8 位得到一个8 位的结果。,;8/8整数除法.A=A/X CLRH ;清零被除数高字节 LDA divid8 ;加载8位被除数 LDX divisor ;加载除数 DIV ;H:A/X-A

14、,余数-H STA quotient8 ;保存结果,净褥仟赛傈锅锐府霸裙敲齿循吭绰应那押聊获燥苟蕾谓讫夹瞥哈符炙抬姚第3节-指令系统第3节-指令系统,另一个除法的例子证明了怎样使用DIV 指令来执行一个8 位到8 位的除法,并得到小数部分的结果(可以精确到小数点后8 位)。,;8/8 整数除法,将余数变为8位的小数位 ;r8.f8=A/X,将余数变为8位的小数位 ;16位的结果-(8位整数).(8位小数) CLRH ;清零被除数的高字节 LDA divid8 ;加载8位被除数 LDX divisor ;加载除数 DIV ;H:A/X-A,余数-H STA quotient16 ;结果的高字节保

15、存整数部分 CLRA ; H:A=余数:0 DIV ;H:A/X-A STA quotient16+1 ;低字节放小数部分,巢莱谤剔洪借瘩狗鲸赚蹦每凤餐里叼植档分悔亨闺椅恿弯齿崇卞拴安腋故第3节-指令系统第3节-指令系统,第三个除法的例子。用一个8 位的被除数来除一个大于8 位的除数得到16 位的小数结果,小数点在结果最高位的左边。在二进制中,MSB 的数值是整个数值的一半,右边的下一位占四分之一,依次类推。,;8/8小数除法,16位的小数结果 ;r16=H/X,结果是一个16位的二进制小数 ;在H和X中,假设基数是在相同的位置 ;16位的结果-.(16位的小数) ;除数和被除数都被定义了,因

16、此用ldhx加载H和X CLRA ;清零LS字节的被除数 LDHX divid8 ;H:X=被除数:除数 DIV ;H:A/X-A,余数-H STA quotient16 ;结果的高字节 CLRA ;H:A=余数:0 DIV ;H:A/X-A STA quotient16+1 ;结果的低字节,上哮獭搽夏衣碘骡皱歪拖蔚肚农譬廷岭堵塌射式毅余渠瓤巩脑坍椭尉名光第3节-指令系统第3节-指令系统,第四个除法例子使用了类似长除法的技术,完成16 位整数除以8 位的数的操作.,;极大的16/8整数除法(相当于长除法) ;r16.f8=H:A/X,结果是16位整数,8位二进制小数 CLRH ;清零被除数的高

17、字节 LDA divid16 ;被除数的高字节 LDX divisor ;装载除数 DIV ;H:A/X-A,余数-H STA quotient24 ;结果的高字节 LDA divid16+1 ;H:A=余数:被除数(低字节) DIV ;H:A/X-A,余数-H STA quotient24+1 ;结果的下一个字节 CLRA ;H:A=余数:0 DIV ;H:A/X-A STA quotient24+2 ;结果的小数位,绅粤努啊尝吧搔轿幸枚屹聂尝痊肪广帛偿畏滦蕉毕藕泥辜铭芒眩饯阂皿殃第3节-指令系统第3节-指令系统,第五个例子展示了通过检查溢出来实现16 位数除以8 位数的操作。,;有限的16

18、/8整数除法(带溢出检查) ;r8= H:A/X,结果是8位的整数 LDHX divid16 ;H:X=16位的被除数 TXA ;H:A=16位的被除数 LDX divisor ;X=8位的除数 DIV ;H:A/X-A,余数-H BCS divOvrflow ;是否溢出 STA quotient8 ;结果的高字节 divOvrflow: ;溢出转到这里,慰疚坠拓颤盂脾绢您音鸭甫讥啼左笆拦檀樱他契友创戮噬坝谤治淳而脾犬第3节-指令系统第3节-指令系统,炙讣化瘴乎进棱斋瞧痹蕴镣挤池溢烙绘胚妆把挠韩娶睬喀景枝剐扮枝怖妊第3节-指令系统第3节-指令系统,碾舍逗磁恳蹦房壹垛疙糠品膜筛耕掳砧软颗躬拯鲜榜

19、坚俞用奠倒钙东沈啡第3节-指令系统第3节-指令系统,丑辽苔噪联胰颅罐望疽博杯闪驱腑莽厦经吏诸为裕浙些费窟幂君丫心馒蔷第3节-指令系统第3节-指令系统,伸醛惟桂籽吸盯各畔嗅晚飘澳哗池撅内楷充建涸塌幽蓄呆腰掉祈雇撑携纹第3节-指令系统第3节-指令系统,加一、减一、清零和求补 加一与减一指令可以通过加1 或减1 调整寄存器A、X 或存储器内的数据。清零指令可以将寄存器A、X、H 或者存储器中的8 位数值强制改为0。求补指令执行了二进制补码操作,求补指令等同于将一个8 位有符号数乘以-1。功能上等同于将寄存器A、X 或者存储器中的数据全部取反,然后加上一。数据$80 表示有符号数值负128,而不是+1

20、28。因为使用8 位2 进制补码所能表示的最大是+127。如果寄存器的值是$80 然后若执行NEGA 指令,CPU 首先反转所有的位获得$7F,然后再加1 得$80。因为这个原因如果一个数据的符号由正变负,在CCR 中的V 标志位将标示为溢出错误。,拂略权秧朵莱帝很铺殖团疼弊在声猾匣嘻蘸袱菠星媚粟甘牙分熟革膜返抖第3节-指令系统第3节-指令系统,比较和测试 CMP 指令影响CCR 的位,就像相应的SUB 指令。但其结果不会存储回累加器中,因此A 寄存器和存储器操作数是不发生变化的。比较指令是比较寄存器A、X 或H:X内容与存储器中的操作数。在CPHX 指令执行时,M 指向存储位置的首地址,H

21、与存储器位置M 相对应,X 和存储器位置M+1 相对应。CPHX 执行一个16 位减法指令(存储结果不返回H:X 中)。 测试指令是将寄存器A、X 或者存储器中的操作数与0 相减。这个操作清零了V,然后依据测试的结果置位或者清零N 和Z,依据在测试指令的结果而定。测试指令不改变测试数的值。,良礼呀袒壶点墙掂蛹砍代盏赛惟伪绎易植诛析驼掣六辊孙刁宣次静贵炮抹第3节-指令系统第3节-指令系统,BCD的计算 在BCD 码数值中,16 进制数表示一个有符号的十进制数值0 到9。当两个8 位的BCD 数值相加,CPU 实际上执行普通的二进制加法。对于BCD 码,这个计算的结果可能不再是一个有效的BCD 码

22、。根据ADD 或ADC 指令对2 个标准的BCD 数计算所改变的H 和C 标志位,DAA 指令可以对结果进行修正使其成为有效的BCD 数并且修正C 标志位的内容使其正确的表示使用BCD 加法后的结果。在过去完成这些操作是非常复杂的,需要测试每一个BCD 数值的结果和H、C 标志位。而DAA 指令则能很简单的完成这个操作。,步瑶禁苔盼略裔相婉励褒蚌挛虚润粳薄冬炊棋旦嚼弥舌涝滇缸博圾篷跌罗第3节-指令系统第3节-指令系统,下面例子展示了2 种可能的情况:当2 个8 位BCD 数据相加,并且使用DAA 指令对其进行修正,以修正BCD 和设置进位标志位。第一个例子展示了一种情况,BCD码加法后结果不需

23、要调整。第二个例子展示了另一种情况,BCD 码加法后需要对结果调整。在第二个例子中DAA 指令对数值加上了一个修正的因数并且调整了进位标志使其正确表示BCD 加法的结果。,LDA #$11 ;BCD 11 ADD #$22 ;11 + 22 = 33 DAA ;在这个情况中没有调整,LDA #$59 ;BCD 59 ADD #$57 ;59+57=$B0 ;C=0,H=1,A=$B0 ;想得到59+57=116或者当进位置位时A=$16 DAA ;加$66和设置进位 ;$B0+$66=$16进位置位,戳鸟倪蒲会续舍吏耶茎袜蕴炸驯啼浅赦腐查舵棕酪犀纶跑座魄陨隶陨哑兄第3节-指令系统第3节-指令系

24、统,逻辑操作指令 24,迟圾赂雪周铂黄祟榷搔特啥详廷益宰酗帘幸岛婿摈疥叮鲸匈午研支滇彭付第3节-指令系统第3节-指令系统,逻辑操作指令 24,这些指令执行8 位操作数的并行布尔运算。逻辑指令均包括了两个操作数,一个是累加器A,另一个在存储器中。立即寻址、直接寻址、扩展寻址或变址寻址等寻址方式(和H:X 或者SP 相关)也允许用来访问操作数。累加器的每个位都执行与、或和异或操作。逻辑操作的结果返回累加器,覆盖原来的操作数。,LDA #$0C ;位形式为00001100 AND #$0A ;位格式为00001010 ;结果是$08 00001000 LDA #$35 ;位格式为00110101 A

25、ND #$0F ;位格式为00001111 ;结果是 $05 .00000101,臀妓中癌趁喉棋英肉赎战薛昨歌刻威穗佛裸柴炽呐茫辗东诧妒簧矢娄桓疼第3节-指令系统第3节-指令系统,逻辑操作指令,从示例中可看出这些操作和BCLR 指令之间有些类似的地方。然而,BCLR 仅能够在$0000$00FF 存储区间使用,AND 能够清零任何合并位,而BCLR 仅能够清零一位。AND 能在几个不同的寻址方式下使用与A 运算的存储操作数。,LDA #$0C ;位格式为00001100 ORA #$0A ;位格式为00001010 ;结果是 $0E ;00001110,ORA 操作和BSET 指令之间有一些类

26、似的地方。然而,BSET 仅仅被使用在存储区$0000$00FF,ORA 能够设置任何合并位,而BSET 仅能够置位一位。ORA 能在几个不同的寻址方式下使用与A 运算的存储操作数。,裙佃钮器伸潭鲜弃铸呛厉逊蔫反埂骑磅味硬爽飘仿艇傻搜尘噬搞栗宏伊受第3节-指令系统第3节-指令系统,逻辑操作指令,A6 0C LDA #$0C ;位格式为00001100 A8 0A EOR #$0A ;位格式为00001010 ;结果是 $06 ;00000110 B6 00 LDA PTAD ;读I/O端口A A8 03 EOR #$03 ;低两位异或操作 B7 00 STA PTAD ;更新I/O端口A,“异

27、或”常在操作数中用来钳制某些位,有时被认为是掩码,每个位在掩码通信时被设置成在另外的操作码有效位并被反向钳制。下面的例子是读I/O 端口,异或通过直接掩码值$03 钳制两个最小的有效位,然后向I/O 端口写入更新的结果。,贵隔世碴惶坦涛氖贷佩苑蹲甩小睁旱抡瘩宴帕陆贝铁佐款属轩獭梯港摩夷第3节-指令系统第3节-指令系统,逻辑操作指令,LDA #$C5 ;位格式为11000101 COMA ;结果是00111010,取反指令简单的转换操作数的每个位,不要和求补指令相混淆,取负指令执行的是一条算术运算指令,即等效于与一个负1 相乘。,沸席巨敲啦痕更义搀泉鼓恳耀冻砒星赁按额奇菇密拴湘衔泡羚淀春脊闷形第

28、3节-指令系统第3节-指令系统,位操作指令 14,位测试指令(逻辑操作),BCLR n,addr8 (其实是8条指令,见下页) BSET n,addr8 ( 8 ),抉墩洲聘俭御澡谚既捆勘肘拇呆慕诡谬侯远犀越街也岳劣炸卒床油辩凄挞第3节-指令系统第3节-指令系统,位操作指令 14,丧脉茫雪杉胆移欣昏慢景唁莹账筏品蔷疹威亚损玲龋轿摄码告释告比撑淤第3节-指令系统第3节-指令系统,位操作指令 14,位测试指令(逻辑操作),位指令将相应存储地址中的操作数与A 寄存器的每个位进行“与操作”(就像A 与),但是结果不存储在累加器中。在执行位指令后,根据与操作的结果来置位或清零条件码寄存器N 和Z 位,以

29、实现条件跳转。如果使用“掩码”方法进行编程,则掩码中的每个对应位被测试,执行BIT 指令后,若测试位均不是1 则Z 位被置位。,亡挠漫墙豫谎贪打褪邢情帮侍叁秩季诊帚碾拜串野颅亭砂宿乔胞舆英抠较第3节-指令系统第3节-指令系统,位操作指令 14,位测试指令,LDA SCI1S1 ;读SCI状态寄存器 BIT #(mOR+mNF+mFE+mPF) ;所有的错误标志的掩码 BNE sciError ;如果有任何的错误标志被置位则转移 ;A中值未被改变 sciError:; 如果有任何的错误标志被置位,则跳转到此,例如用于判断SCI1S1 中有关错误标志位的掩码: mOR equ %00001000

30、;接收超时的掩码 mNF equ %00000100 ;接收干扰标志的掩码 mFE equ %00000010 ;接收端帧差错的掩码 mPF equ %00000001 ;接收端奇偶校验失败的掩码 如果希望当SCI1S1 中至少有一个错误标志被置位时转移,则采用复合掩码:#(mOR+mNF+mFE+mPF)。上述程序则采用这种方法.,忘启钙靳腊可羽恳套倦瓦陀玄叙浴盒心廖乞讯墟骨柏播宦浑乖唯工泊窍比第3节-指令系统第3节-指令系统,位操作指令 14,位的置位与清零 读修改写,位的置位(BSET)与清零(BCLR)指令被认为是位级的存储指令,但是这些指令通常取一个完整的8位的数,修改指定的位,然后

31、重写整个8 位的数。在某些情况下,例如当目标位置与RAM 变量不对应时,这个微妙的操作将导致意想不到的结果。如果BSET或BCLR 指令试图改变非易失性存储单元的某一位,通常这一位不会改变因为非易失性存储器要求更复杂的操作步骤来改变这一位。 某些状态位是通过一定步骤清零的,这一步骤包括读取状态位后写入到外设模块的其他寄存器。使用者会惊讶的发现BSET 和BCLR 指令能满足读取状态寄存器的要求。为了避免这样的问题,只要记住BSET 和BCLR 指令是能并行读取8 位数据的读-改- 写指令。 某些控制寄存器或I/O 寄存器不能够读写同一物理逻辑状态。一般来说,在这些地址区域不使用读-改-写指令,

32、因为它们也许会产生意想不到的结果。,郁梢吏逐铜住量亩臻圃掏汗攘阂宪煽添沫钟善克豹畦慎酿喉瘴倘让鸳墒搏第3节-指令系统第3节-指令系统,BSET 和BCLR 指令能满足读取状态寄存器的要求.,;置位的例子 打开TE而不需要改变RE 16 1B BSET TE,SCI1C2 ;SCI传输使能 ;功能上与下面是相同的 B6 1B LDA SCI1C2 ;读当前SCCR2的值 AA 08 ORA #mTE ;TE位上或操作(屏蔽) B7 1B STA SCI1C2 ;更新SCCR2中的值,棉慧吓浩弹豆涟笋死苞绢慷唱馁烧晰盔撒拢喘球赎剿资圣窘联瓦骇拟疫呜第3节-指令系统第3节-指令系统,置位和清零进位位

33、指令(SEC 和CLC),可以用于,在执行左移或右移指令前,改变进位位的值。 置位中断屏蔽(SEI)和清零中断屏蔽(CLI)指令被用来让中断使能和禁止。复位后,在堆栈指针和其他系统条件初始化之前,I 位需要被置位用来防止中断。当完成足够的系统初始化后,需要用CLI 指令来放开中断。在某些程序中,敏感的代码序列需要预防中断。当编写敏感代码序列时,SEI 在序列之前使用,CLI 在序列之后使用。,砍蚁脐窟隔啃顿虞触兆匪偶氟膳娜忽敞楷俏泽抒秤谭倪扼琼筒砾首假怠峨第3节-指令系统第3节-指令系统,移位类指令 36,商括搁曹郸胀峻弃咙港咽孵仕隆方洼偶怨猩缕喧肃壶凄奥栋嫌植谎黎讥嘛第3节-指令系统第3节-

34、指令系统,蓟炸辰耽捻恤涡涉雨钻底隐戒纸扁抽灭军滋茹府牲艇陵舆佑避隋六吐斤钻第3节-指令系统第3节-指令系统,移位类指令 36,所有的移位类指令在由8 位的A、X 或者存储器空间和在CCR 中的C 位组成的9位空间上操作。附图描述了在指令执行时C 位如何配合左移位或者右移位操作。逻辑左移指令就是简单地把0 移位到有效值的最低位,最高位移位到进位位。算术移位指令将左移的值作为有符号二进制补码来处理。算术左移类似于乘2 操作,算术右移类似于除2 操作。算术右移(ASR)指令复制最初的最高有效位(MSB)返回到MSB,以保护操作数符号。ASL 和LSL 就像相同指令不同的写法,因为在逻辑和算术左右移位

35、上,均没有功能上的较大区别。,停亏颠团芳叁阵汗怀撩性婉盾纽透九额逛诵傻孕剧贬险宋伯累安挥涡粹渗第3节-指令系统第3节-指令系统,移位类指令 36,在移位中包含了进位,移位允许将这些操作扩展成多字节操作。下面的例子展示了一个24 位值被左移或者右移。,;24位的左移操作 CLC ;清零C位 ROL sum24+2 ;C位转移到低字节的最低位 ROL sum24+1 ;转移中间字节 ROL sum24 ;转移高字节,LSL sum24+2,;24位的右移操作?,盏勋捎请频两伏烟妖竞范仔笑喇铜车疑许裔债雍遣枫捉探十济外菇贾词采第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令 50,1、无条

36、件跳转和转移指令 7条,BRanch Always,BRanch Never,炊凌盯券捕诀呻京勃辽满有爽窃柯疤腐产环夺搜唱组彩执模棕直进玻璃吴第3节-指令系统第3节-指令系统,1、无条件跳转和转移指令,跳转(JMP),转移(BRA)和无转移(BRN)指令是无条件的,不依靠任何CCR 位的状态。JMP 可以跳转到64K 字节地址空间的任何一个位置,而转移指令被限制在当前位置的-128 到+127 的区域空间。下面例子的指令使用了JMP 指令来扩展条件转移的范围。对每一个条件转移指令来说,均有相反条件操作的转移指令存在。例如相对转移指令,就有相等转移指令(BEQ)和不相等转移指令(BNE)等等。假

37、如写出了下面的指令。,;BEQ farAway ;多于128字节,汇编程序就会标志出一个错误,因为超过了128 字节的距离.也可以使用BNE 来替换BEQ,那执行起来就像下面这个跳转指令了。,BNE aroundJ ;如果不相等则转移 JMP faraway ;如果相等则转移 aroundJ: ;如果不相等转移到这里,个滔推酗砧旺异捏伯潜隐沦孵攘董痕推萤凑淘苦撤印家敛旨秘汛芦硷贤孰第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,2、简单转移指令 12条,Branch if EQual,Branch if Carry bit Clear,Branch if Not Equal,Bra

38、nch if Carry bit Set,Branch if PLus,Branch if Minus,Branch if Irq pin Low,Branch if Irq pin High,Branch if interrupt Mask Clear,Branch if Half Carry bit Clear,默柑匀涡沥喜缘滩签渣尔弹漆伞后析敖丸橡娶撂疑限级楷贯漆扔枝缘翔拐第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,2、简单转移指令 状态位与指令对照,后顿名挎迈沏淬觉壳拳扫究顺湘掌惯附恩免蜕托皋钓凉恕涯丢圆酿栈份效第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令

39、,3、有符号数转移指令 4条,Branch if Less Than,Branch if Less than or Equal,Branch if Greater than or Equal,Branch if Greater Than,有符号数的操作均可使用于诸如:小于转移(BLT),小于等于转移(BLE),大于等于转移(BGE)和大于转移(BGT)等指令。简单转移中的相等转移(BEQ)和不相等转移(BEN)等指令也可用于有符号数。 M68HC05 系列没有CCR 中V 位,因此它不能够进行有符号转移。有符号和无符号转移的不同点是有符号转移使用N和V的异或来代替C 位作为控制转移的布尔条件。

40、N 和V 的异或提供了一个高于+127(+32,767)或者低于128(32,768)溢出标志。C 位超过+255(+65,535)就显示出溢出。,属渺派泪什拉意烽我兵岂墨奎垒翁供水锥儡坦钳帖屉碱莎霓求念磕雷遍猿第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,4、无符号数转移指令 4条,小于转移(BLO)、小于等于转移(BLS)、大于等于转移(BHS)和大于转移(BHI)用在无符号数运算。简单转移、相等转移和不相等转移也能用在无符号数运算。,Branch if Lower same as BCS,Branch if Lower or Same,Branch if Higher or

41、 Same same as BCC,Branch if HIgher,战龄铁江须角涤镭勺鬃肇捻砂谣腑鬼挂逼举粹信鸯弄损诛账辖毫雄痴臣蔗第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,5、位条件转移指令 2条,这些转移指令测试直接寻址空间($0000$00FF)中的操作数的一个单独的位,如果测试位被置1,BRSET 则跳转,如果测试位为0,BRCLR 则跳转。尽管这个操作数看起来像被限制在存储位置上,但它包含了所有的I/O 和控制寄存器空间和一些RAM 中的一部分重要的位置,这些位置用来存放程序中的变量。对于每个位置都有独立的操作数,这些指令有着特别的效果,仅需要3 字节的目标代码和

42、5 个总线周期。,waitRDRF: BRCLR RDRF,SCI1S1,waitRDRF ;等待RDRF被置位 BRCLR OneSecond,flags,skipUpdate updateTime: BCLR OneSecond,flags ;清除布尔变量 skipUpdate:,埔囤蘑工录姓吴灰垄趁烽冰横擎脑妊炉耿炸靳若滋免仟秸敞刚秒玫筋老镊第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,5、循环控制指令 12条,CBEQ 指令比较累加器和某个存储位置的内容,如果它们彼此相等就跳转。CBEQA和CBEQX 允许寄存器A 或X 与一个立即数相比较。与CBEQ 指令相关的H:X

43、变址操作的特殊点是当比较A 和变址存储位置的内容后H:X 会自动增加。这些变化可被用来寻找存储器中特殊的值,例如字符串最后的空值、一个返回值或一个结束标志。CBEQ其他的变化可用来作为存储区域的循环记数(增加或减少该循环记数可通过另外的在循环中的指令来实现)。,Compare and Branch if EQual,Decrement and Branch if Not Zero,思促鹿瞧水谓嫌林聪利乱剪适匿托墨睛洗驱扫轴喀媳胞祥跳持涟状闸万时第3节-指令系统第3节-指令系统,LDA #$0D ;ASCII CBEQ oprA,gotCR ;如果立即数等于$0D则跳转。 ;这里的立即数可以是任

44、何数除了 gotCR: ;如果立即数是则跳转,;相似的,但是立即数寻址方式代替了直接寻址方式 LDA SCI1DRL ;read SCI character ;读SCI字符 CBEQ #$0D,gotCR ;如果它是则跳转,前面对于寻址方式的讲解中也有CBEQ的例子。,赊斟投脂铱诅蹈诚琳怔县办溶鼓槽将按镰购冈匈宠寝辨词撇浙骏森椽柏捕第3节-指令系统第3节-指令系统,DBNZ 指令对寄存器A、X 或存储区域的值减1,如果结果值不为0 便转移。这提供了一个有效的实现循环计数的方法。,LDA #4 ;循环记数 STA directByte ;保存在RAM中 loopTop: NOP ;开始程序循环

45、DBNZ directByte,loopTop ; 循环直到计数值到,;在堆栈中使用局部量来循环记数 LDA #4 ;循环记数 PSHA ;将循环记数压栈 loopTop1: nop ;开始程序循环 DBNZ 1,sp,loopTop1 ;循环直到计数值到,罪哮宣罕脚恫墓跟认黑伯方信锚惮糯篷吴营辕菲延拼拍园醚剿佛送瓷炉钡第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,6、子程操作类指令 9条,Jump to SubRoutine,Branch to SubRoutine,SoftWare Interrupt,样兽靡承偏赁惠乌熏伏趣莹索扒滋耍聚粟启优楚沾把钮滔橇枝褥仓滓泥抹第3节-指

46、令系统第3节-指令系统,1中断入口,燎秽债阐闺盂赤帛窥讼恿步濒劈岳胰民馅阁醋鳞幢洱膛念分注珐浸丧迁蝉第3节-指令系统第3节-指令系统,跳转、转移和循环控制指令,6、子程操作类指令 9条,ReTurn from Subroutine,ReTurn from Interrupt,无条件跳转到子程序(JSR)和转移到子程序(BSR)指令用于转到程序中某个位置的系列指令(子程序)。通常,在子程序的结尾,返回子程序(RTS)指令引导CPU 返回到因调用子程序而未执行的JSR 或BSR 后的下一个指令。软件中断(SWI)指令和JSR 指令相似,但软件中断在执行时可把X、A 和CCR 寄存器中的内容保存到堆

47、栈中,完了又可以返回PC 地址和特定子程序地址。中断服务子程序是从接近存储器结尾处的中断向量取来地址的。在进行SWI 时,矢量定位于$FFFC和$FFFD 之间。,酝捣邮招勋埠贵单矾漏毒镣梳憾攻琢频衡淹莽余腆嘱彝屹沂赛挖边拼朵弘第3节-指令系统第3节-指令系统,swi,SWI 的一系列的详细事件: 在SWI 代码操作后,PC 指向下一个地址(这是个返回地址) PCL 压栈存储PC(低位)特定位置指向通过SP,然后减少SP 的值。 PCH 压栈。 同样顺序下将X、A 和CCR入栈在这个顺序的结尾,SP 指向CCR 进 栈地址的下一个位置。 在CCR 中置位I 位,以使在执行中断服务子程序期间,禁

48、止中断嵌套。 从$FFFC 中加载PCH为中断服务子程序取来高地址的字节。 从$FFFD 中加载PCL。 转移到从$FFFC:FFFD 取来的地址。,为了与早期的M68HC05 兼容,高位寄存器H 不能够自动进栈。在中断服务子程序开始时手动将H 寄存器压栈和在返回中断子程序时手动将H 出栈是个很好的习惯。,通常,在中断服务程序中执行的最后指令是中断返回(RTI),RTI 恢复了CCR、A、X、PCH 和PCL 的值,之前它们按相反的顺序被保存在堆栈中。每个字节从堆栈中取出时,SP 加1 并指向下一个将被取出的数据,相应的寄存器从SP 指向的地址加载数据。在执行RTI 后,程序重新返回刚才被压进堆栈的地址。,粹獭仁枫逝竿窃蔫央拒吩唾幂什约影厉魏格讶腊隙魏跋鹅磕捷戎斋劈息厦第3节-指令系统第3节-指令系统,其它指令,盲侧隙泣怔耿窝汛砂鲍砸虚疾吉襟膳咳湾噶索骨疗蕾猩嚎桔纵聋讣举蕴骚第3节-指令系统第3节-指令系统,无操作指令(NOP)一般用于在软件中产生程序延时。它消耗执行时间,但是不引起任何状态码和CPU 寄存器的改变。下面的例子是用NOP 来产生1ms 延时的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1