第3节指令系统.ppt
《第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;立即数A+立即数B-
5、累加器add oprC;累加器+立即数C-累加器,稀惟卿酮教肌梧滋精析姆洲佬韩勉回靖颊樱厅宁朽变垮快勒铅氛铂拴论奢第3节-指令系统第3节-指令系统,下面展示了中间值保存在堆栈中的例程。有时这样做比将临时结果存储在存储器中要快。存储的数量依赖于用何种寻址方式放置临时变量至存储器以及X 寄存器是否被其他操作所使用.,;计算(A+B)-(C+D)(假设没有进位或借位)LDA oprC;立即数C-累加器ADD oprD;立即数C+立即数D-累加器PSHA;中间结果放入堆栈SP+1LDA oprA;立即数A-累加器ADD oprB;立即数A+立即数B-累加器SUB 1,sp;(A+B)-(C+D)结果放
6、入累加器AIS#1;释放一个变量,峰裳旧强离恳粱柔从锑诲熬茬年节聂景媒丑菌俯惦蔬搓谩昨扎舅炭论枕诅第3节-指令系统第3节-指令系统,TAX 和TXA 提供了一个有效的方法来把A 寄存器的值送到X 寄存器或者把寄存器X 的值送到寄存器A。如果寄存器X 未被使用,可以用来暂存累加器A 中的值,这样累加器就可以用来做其他操作。TAP 和TPA 提供了一个方法在寄存器A 到CCR 中或者从CCR 到寄存器A 传送数据。这种操作在类似调试监控等开发工具中比在通常用户程序中使用得更多。,合痘峡鹊烽鲁嵌膳慑焕融灼肖晴厘迸绰虐娘装块铜茂游帅撞泡忿逆络婉兴第3节-指令系统第3节-指令系统,MOV指令从存储器区读
7、一个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#$0F,PTADD;使得低4位为输出286 C0E1 6E
8、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 INCX;下一个位置(假设直接寻址)20 F7 BRA movLoop1;继续循环 dunLoo
9、p1:,势迂卵切简队咳务场终曙涡窍诽曲京消辖脸坊龚祸及澎殉皖凋杨赡胞将悦第3节-指令系统第3节-指令系统,算术运算指令,算术运算指令包含了传统的加、减、乘和除操作,还包含常用的指令如加一、减一、清零、求补(2 进制补码)、比较、测试和为处理BCD 码的十进制调整指令。比较指令实际上就是减操作,影响CCR 状态位但结果不返回到CPU 寄存器。测试指令影响着N和Z 位,但是不影响被测试的数据。,魔吻商栗朽贾篷盖帜绕赣睁代衰贩汁而婪阔杜橡疤坪魂焚做眯尔答会厦讨第3节-指令系统第3节-指令系统,筒口聋醉付擅奈攫术易哈蛇问粗形惹邓湍俞酱拳凸与螺盟棒铆煎佩选胰卞第3节-指令系统第3节-指令系统,傻功妄铸七
10、脂鼓淆资趁落轧怠询芽颈常蛇婆酉盲斤洞冒震芭竭忽挤早俄刀第3节-指令系统第3节-指令系统,ADD 指令将寄存器A 中的数据加上存储器内的操作数,并将结果存储到寄存器A中。ADC 将寄存器A 中的数据加上由前一次操作产生的进位,再加上存储器中的操作数,将结果存储到寄存器A 中。该操作允许执行多字节加法,就像下例所示。,;8位操作数到24位和的加法LDA oprA;取8位操作数到寄存器AADD sum24+2;24位和的低字节STA sum24+2;更新24位和的低字节LDA sum24+1;取24位和的中间字节ADC#0;保持任何进位STA sum24+1;更新中间字节LDA sum24;得到24
11、位和的高字节ADC#0;保持进位到高字节中STA sum24;更新高字节,茧倍铜临秦由咖养倪羹键讶五揪庐竭冤琶饭理廊戌巷姆俐刮拳岳仲垄犀凳第3节-指令系统第3节-指令系统,SUB 指令将累加器A 中的数据减去存储器中的数据,然后将结果存储到累加器A中。对于这个指令,进位状态位是借位指示器。SBC 指令将累加器A 中的数据减去由前一次操作所影响的借位再减去存储器中的数据,然后将结果存储回寄存器A 中。这个操作允许执行多字节减法,就像下面例子所显示的。,;16位减法.结果是16位=oprE-oprFLDA oprE+1;oprE的低8字节SUB oprF+1;oprE(低字节)-oprF(低字节)
12、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中。这种情况下不可能发生进位(或者是溢出),其结果将总是适合X:A 的大小。因此在这个操作后C 将被清零。DIV 将H:A 中16 位无符号数除以X中无符号的8位值,然
13、后存储8位结果到A寄存器中,余数存储到H寄存器中。在X中的除数无变化,因此他能够在随后的操作中被使用。如果商为0则Z标志被置1。如果商大于255 就会有溢出发生,如果发生溢出或除数为0 则C 位被置1。下面这个除法的例子展示了简单8 位除以8 位得到一个8 位的结果。,;8/8整数除法.A=A/XCLRH;清零被除数高字节LDA divid8;加载8位被除数LDX divisor;加载除数DIV;H:A/X-A,余数-HSTA quotient8;保存结果,净褥仟赛傈锅锐府霸裙敲齿循吭绰应那押聊获燥苟蕾谓讫夹瞥哈符炙抬姚第3节-指令系统第3节-指令系统,另一个除法的例子证明了怎样使用DIV 指
14、令来执行一个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,余数-HSTA quotient16;结果的高字节保存整数部分CLRA;H:A=余数:0DIV;H:A/X-ASTA quotient16+1;低字节放小数部分,巢莱谤剔洪借瘩狗鲸赚蹦每凤餐里叼植档分悔亨闺椅恿弯齿崇卞拴安腋故第3节-指令系统第3节-指令系统,第三个
15、除法的例子。用一个8 位的被除数来除一个大于8 位的除数得到16 位的小数结果,小数点在结果最高位的左边。在二进制中,MSB 的数值是整个数值的一半,右边的下一位占四分之一,依次类推。,;8/8小数除法,16位的小数结果;r16=H/X,结果是一个16位的二进制小数;在H和X中,假设基数是在相同的位置;16位的结果-.(16位的小数);除数和被除数都被定义了,因此用ldhx加载H和XCLRA;清零LS字节的被除数LDHX divid8;H:X=被除数:除数DIV;H:A/X-A,余数-HSTA quotient16;结果的高字节CLRA;H:A=余数:0DIV;H:A/X-ASTA quoti
16、ent16+1;结果的低字节,上哮獭搽夏衣碘骡皱歪拖蔚肚农譬廷岭堵塌射式毅余渠瓤巩脑坍椭尉名光第3节-指令系统第3节-指令系统,第四个除法例子使用了类似长除法的技术,完成16 位整数除以8 位的数的操作.,;极大的16/8整数除法(相当于长除法);r16.f8=H:A/X,结果是16位整数,8位二进制小数CLRH;清零被除数的高字节LDA divid16;被除数的高字节LDX divisor;装载除数DIV;H:A/X-A,余数-HSTA quotient24;结果的高字节LDA divid16+1;H:A=余数:被除数(低字节)DIV;H:A/X-A,余数-HSTA quotient24+1
17、;结果的下一个字节CLRA;H:A=余数:0DIV;H:A/X-ASTA quotient24+2;结果的小数位,绅粤努啊尝吧搔轿幸枚屹聂尝痊肪广帛偿畏滦蕉毕藕泥辜铭芒眩饯阂皿殃第3节-指令系统第3节-指令系统,第五个例子展示了通过检查溢出来实现16 位数除以8 位数的操作。,;有限的16/8整数除法(带溢出检查);r8=H:A/X,结果是8位的整数LDHX divid16;H:X=16位的被除数TXA;H:A=16位的被除数LDX divisor;X=8位的除数DIV;H:A/X-A,余数-HBCS divOvrflow;是否溢出STA quotient8;结果的高字节divOvrflow:
18、;溢出转到这里,慰疚坠拓颤盂脾绢您音鸭甫讥啼左笆拦檀樱他契友创戮噬坝谤治淳而脾犬第3节-指令系统第3节-指令系统,炙讣化瘴乎进棱斋瞧痹蕴镣挤池溢烙绘胚妆把挠韩娶睬喀景枝剐扮枝怖妊第3节-指令系统第3节-指令系统,碾舍逗磁恳蹦房壹垛疙糠品膜筛耕掳砧软颗躬拯鲜榜坚俞用奠倒钙东沈啡第3节-指令系统第3节-指令系统,丑辽苔噪联胰颅罐望疽博杯闪驱腑莽厦经吏诸为裕浙些费窟幂君丫心馒蔷第3节-指令系统第3节-指令系统,伸醛惟桂籽吸盯各畔嗅晚飘澳哗池撅内楷充建涸塌幽蓄呆腰掉祈雇撑携纹第3节-指令系统第3节-指令系统,加一、减一、清零和求补 加一与减一指令可以通过加1 或减1 调整寄存器A、X 或存储器内的数据
19、。清零指令可以将寄存器A、X、H 或者存储器中的8 位数值强制改为0。求补指令执行了二进制补码操作,求补指令等同于将一个8 位有符号数乘以-1。功能上等同于将寄存器A、X 或者存储器中的数据全部取反,然后加上一。数据$80 表示有符号数值负128,而不是+128。因为使用8 位2 进制补码所能表示的最大是+127。如果寄存器的值是$80 然后若执行NEGA 指令,CPU 首先反转所有的位获得$7F,然后再加1 得$80。因为这个原因如果一个数据的符号由正变负,在CCR 中的V 标志位将标示为溢出错误。,拂略权秧朵莱帝很铺殖团疼弊在声猾匣嘻蘸袱菠星媚粟甘牙分熟革膜返抖第3节-指令系统第3节-指令
20、系统,比较和测试CMP 指令影响CCR 的位,就像相应的SUB 指令。但其结果不会存储回累加器中,因此A 寄存器和存储器操作数是不发生变化的。比较指令是比较寄存器A、X 或H:X内容与存储器中的操作数。在CPHX 指令执行时,M 指向存储位置的首地址,H 与存储器位置M 相对应,X 和存储器位置M+1 相对应。CPHX 执行一个16 位减法指令(存储结果不返回H:X 中)。测试指令是将寄存器A、X 或者存储器中的操作数与0 相减。这个操作清零了V,然后依据测试的结果置位或者清零N 和Z,依据在测试指令的结果而定。测试指令不改变测试数的值。,良礼呀袒壶点墙掂蛹砍代盏赛惟伪绎易植诛析驼掣六辊孙刁宣
21、次静贵炮抹第3节-指令系统第3节-指令系统,BCD的计算在BCD 码数值中,16 进制数表示一个有符号的十进制数值0 到9。当两个8 位的BCD 数值相加,CPU 实际上执行普通的二进制加法。对于BCD 码,这个计算的结果可能不再是一个有效的BCD 码。根据ADD 或ADC 指令对2 个标准的BCD 数计算所改变的H 和C 标志位,DAA 指令可以对结果进行修正使其成为有效的BCD 数并且修正C 标志位的内容使其正确的表示使用BCD 加法后的结果。在过去完成这些操作是非常复杂的,需要测试每一个BCD 数值的结果和H、C 标志位。而DAA 指令则能很简单的完成这个操作。,步瑶禁苔盼略裔相婉励褒蚌
22、挛虚润粳薄冬炊棋旦嚼弥舌涝滇缸博圾篷跌罗第3节-指令系统第3节-指令系统,下面例子展示了2 种可能的情况:当2 个8 位BCD 数据相加,并且使用DAA 指令对其进行修正,以修正BCD 和设置进位标志位。第一个例子展示了一种情况,BCD码加法后结果不需要调整。第二个例子展示了另一种情况,BCD 码加法后需要对结果调整。在第二个例子中DAA 指令对数值加上了一个修正的因数并且调整了进位标志使其正确表示BCD 加法的结果。,LDA#$11;BCD 11ADD#$22;11+22=33DAA;在这个情况中没有调整,LDA#$59;BCD 59ADD#$57;59+57=$B0;C=0,H=1,A=$
23、B0;想得到59+57=116或者当进位置位时A=$16DAA;加$66和设置进位;$B0+$66=$16进位置位,戳鸟倪蒲会续舍吏耶茎袜蕴炸驯啼浅赦腐查舵棕酪犀纶跑座魄陨隶陨哑兄第3节-指令系统第3节-指令系统,逻辑操作指令 24,迟圾赂雪周铂黄祟榷搔特啥详廷益宰酗帘幸岛婿摈疥叮鲸匈午研支滇彭付第3节-指令系统第3节-指令系统,逻辑操作指令 24,这些指令执行8 位操作数的并行布尔运算。逻辑指令均包括了两个操作数,一个是累加器A,另一个在存储器中。立即寻址、直接寻址、扩展寻址或变址寻址等寻址方式(和H:X 或者SP 相关)也允许用来访问操作数。累加器的每个位都执行与、或和异或操作。逻辑操作的
24、结果返回累加器,覆盖原来的操作数。,LDA#$0C;位形式为00001100AND#$0A;位格式为00001010;结果是$08.00001000LDA#$35;位格式为00110101AND#$0F;位格式为00001111;结果是$05.00000101,臀妓中癌趁喉棋英肉赎战薛昨歌刻威穗佛裸柴炽呐茫辗东诧妒簧矢娄桓疼第3节-指令系统第3节-指令系统,逻辑操作指令,从示例中可看出这些操作和BCLR 指令之间有些类似的地方。然而,BCLR 仅能够在$0000$00FF 存储区间使用,AND 能够清零任何合并位,而BCLR 仅能够清零一位。AND 能在几个不同的寻址方式下使用与A 运算的存储
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指令系统
链接地址:https://www.desk33.com/p-740385.html