《指令系统21素材.pptx》由会员分享,可在线阅读,更多相关《指令系统21素材.pptx(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1页/共62页第2页/共62页Load A 和Load X是从存储器中取出一个8位数放入累加器A或寄存器X。Load H:X是从存储器中取出8位的数放入寄存器H,然后再从下一个存储单元取出8位数放入寄存器X。为了尽可能灵活的访问存储器,加载A 或X 都可使用8 种不同的寻址方式。而LDHX 可有7种不同的寻址方式来指定所取数的存储单元。下列代码展示了加载指令的某些用法。这些指令在实际程序中并不这样用,它们只是些无关联的加载指令,用来说明可用不同方式来访问存储器的多种可行的寻址方式.第3页/共62页第4页/共62页第5页/共62页因为操作数进入ALU 需要用到累加器A,所以通常在执行算术与逻辑
2、操作时,要使用LDA 指令取得一个值,以便与第2 个操作数进行运算。;求A+B的和(假设总和累加器add oprB;立即数A+立即数B-累加器在有些情况下,可设计程序使得放在累加器A 中的运算结果能用来作为后续运算的操作数。这样可以避免存储结果的过程以及将下一个操作数放入累加器的必要。;求A+B+C的和(假设总和累加器add oprB ;立即数A+立即数B-累加器add oprC ;累加器+立即数C-累加器第6页/共62页下面展示了中间值保存在堆栈中的例程。有时这样做比将临时结果存储在存储器中要快。存储的数量依赖于用何种寻址方式放置临时变量至存储器以及X 寄存器是否被其他操作所使用.;计算(A
3、+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)结果放入累加器AIS#1 ;释放一个变量第7页/共62页TAX 和TXA 提供了一个有效的方法来把A 寄存器的值送到X 寄存器或者把寄存器X 的值送到寄存器A。如果寄存器X 未被使用,可以用来暂存累加器A 中的值,这样累加器就可以用来做其他操作。TAP 和TPA 提供了一个方法在寄存器A 到CCR 中或者从CCR 到
4、寄存器A 传送数据。这种操作在类似调试监控等开发工具中比在通常用户程序中使用得更多。第8页/共62页MOV指令从存储器区读一个8 位数值,并将这个数值存储到存储区的其他地方。就像加载和存储指令一样,MOV 根据被移动数据的值改变CCR 中N 和Z 标志位。尽管加载和存储指令能够完成MOV 所做的事情,但MOV 不需要使用累加器,在传送操作期间,累加器A 能够正常使用。在许多情况下,MOV 比加载-存储指令更快更小(目标代码的大小)。MOV 指令允许四种从指定源到目标的不同的寻址方式。下面的例子展示了使用传送指令初始化几个寄存器的值。284 C0DB 6E 03 00 mov#$03,PTAD
5、;0011到低4位285 C0DE 6E 0F 03 mov#$0F,PTADD ;使得低4位为输出286 C0E1 6E F0 01 mov#$F0,PTAPE ;上拉高4位第9页/共62页下面例子展示了使用加载和存储指令实现字符串移动操作数,而不用传送指令。;块移动例子,移动字符串到RAM块45 0088 LDHX#moveBlk1;指向RAM目标块D6 BF7F movLoop1:LDA(stringBytes-moveBlk1),x;得到源字节27 04 BEQ dunLoop1;结束循环的条件F7 STA ,x ;保存到目标块5C INCX ;下一个位置(假设直接寻址)20 F7 B
6、RA movLoop1;继续循环 dunLoop1:第10页/共62页算术运算指令94算术运算指令包含了传统的加、减、乘和除操作,还包含常用的指令如加一、减一、清零、求补(2 进制补码)、比较、测试和为处理BCD 码的十进制调整指令。比较指令实际上就是减操作,影响CCR 状态位但结果不返回到CPU 寄存器。测试指令影响着N和Z 位,但是不影响被测试的数据。ADD、ADC、SUB、SBC 32MUL、DIV2INC、DEC、COM、NEG、CLR(CLRH)、TST 37CMP、CPX16CPHX4DAA1AIX、AIS2第11页/共62页第12页/共62页第13页/共62页ADD 指令将寄存器
7、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位和的高字节ADC#0 ;保持进位到高字节中STA sum24 ;更新高字节第14页/共62页S
8、UB 指令将累加器A 中的数据减去存储器中的数据,然后将结果存储到累加器A中。对于这个指令,进位状态位是借位指示器。SBC 指令将累加器A 中的数据减去由前一次操作所影响的借位再减去存储器中的数据,然后将结果存储回寄存器A 中。这个操作允许执行多字节减法,就像下面例子所显示的。;16位减法.结果是16位=oprE-oprFLDA oprE+1 ;oprE的低8字节SUB oprF+1 ;oprE(低字节)-oprF(低字节)STA result16+1;结果的低字节LDA oprE ;oprE的高字节SBC oprF ;oprE(高字节)-oprF(高字节)-借位STA result16 ;结
9、果的高字节第15页/共62页MUL 指令将寄存器X中无符号8位2进制数与累加器A中的无符号的8 位2进制数相乘,然后存储16位结果到X:A 中,高8 位的结果存储在X中,低8位存储在A中。这种情况下不可能发生进位(或者是溢出),其结果将总是适合X:A 的大小。因此在这个操作后C 将被清零。DIV 将H:A 中16 位无符号数除以X中无符号的8位值,然后存储8位结果到A寄存器中,余数存储到H寄存器中。在X中的除数无变化,因此他能够在随后的操作中被使用。如果商为0则Z标志被置1。如果商大于255 就会有溢出发生,如果发生溢出或除数为0 则C 位被置1。下面这个除法的例子展示了简单8 位除以8 位得
10、到一个8 位的结果。;8/8整数除法.A=A/XCLRH ;清零被除数高字节LDA divid8 ;加载8位被除数LDX divisor ;加载除数DIV ;H:A/X-A,余数-HSTA quotient8 ;保存结果第16页/共62页另一个除法的例子证明了怎样使用DIV 指令来执行一个8 位到8 位的除法,并得到小数部分的结果(可以精确到小数点后8 位)。;8/8 整数除法,将余数变为8位的小数位;r8.f8=A/X,将余数变为8位的小数位;16位的结果-(8位整数).(8位小数)CLRH;清零被除数的高字节LDA divid8;加载8位被除数LDX divisor;加载除数DIV;H:A
11、/X-A,余数-HSTA quotient16;结果的高字节保存整数部分CLRA;H:A=余数:0DIV;H:A/X-ASTA quotient16+1;低字节放小数部分第17页/共62页第三个除法的例子。用一个8 位的被除数来除一个大于8 位的除数得到16 位的小数结果,小数点在结果最高位的左边。在二进制中,MSB 的数值是整个数值的一半,右边的下一位占四分之一,依次类推。;8/8小数除法,16位的小数结果;r16=H/X,结果是一个16位的二进制小数;在H和X中,假设基数是在相同的位置;16位的结果-.(16位的小数);除数和被除数都被定义了,因此用ldhx加载H和XCLRA;清零LS字节
12、的被除数LDHX divid8;H:X=被除数:除数DIV;H:A/X-A,余数-HSTA quotient16;结果的高字节CLRA;H:A=余数:0DIV;H:A/X-ASTA quotient16+1;结果的低字节第18页/共62页第四个除法例子使用了类似长除法的技术,完成16 位整数除以8 位的数的操作.;极大的16/8整数除法(相当于长除法);r16.f8=H:A/X,结果是16位整数,8位二进制小数CLRH;清零被除数的高字节LDA divid16;被除数的高字节LDX divisor;装载除数DIV;H:A/X-A,余数-HSTA quotient24;结果的高字节LDA div
13、id16+1;H:A=余数:被除数(低字节)DIV;H:A/X-A,余数-HSTA quotient24+1;结果的下一个字节CLRA;H:A=余数:0DIV;H:A/X-ASTA quotient24+2;结果的小数位第19页/共62页第五个例子展示了通过检查溢出来实现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;结果的高字
14、节divOvrflow:;溢出转到这里第20页/共62页第21页/共62页第22页/共62页第23页/共62页第24页/共62页加一、减一、清零和求补 加一与减一指令可以通过加1 或减1 调整寄存器A、X 或存储器内的数据。清零指令可以将寄存器A、X、H 或者存储器中的8 位数值强制改为0。求补指令执行了二进制补码操作,求补指令等同于将一个8 位有符号数乘以-1。功能上等同于将寄存器A、X 或者存储器中的数据全部取反,然后加上一。数据$80 表示有符号数值负128,而不是+128。因为使用8 位2 进制补码所能表示的最大是+127。如果寄存器的值是$80 然后若执行NEGA 指令,CPU 首先
15、反转所有的位获得$7F,然后再加1 得$80。因为这个原因如果一个数据的符号由正变负,在CCR 中的V 标志位将标示为溢出错误。第25页/共62页比较和测试CMP 指令影响CCR 的位,就像相应的SUB 指令。但其结果不会存储回累加器中,因此A 寄存器和存储器操作数是不发生变化的。比较指令是比较寄存器A、X 或H:X内容与存储器中的操作数。在CPHX 指令执行时,M 指向存储位置的首地址,H 与存储器位置M 相对应,X 和存储器位置M+1 相对应。CPHX 执行一个16 位减法指令(存储结果不返回H:X 中)。测试指令是将寄存器A、X 或者存储器中的操作数与0 相减。这个操作清零了V,然后依据
16、测试的结果置位或者清零N 和Z,依据在测试指令的结果而定。测试指令不改变测试数的值。第26页/共62页BCD的计算在BCD 码数值中,16 进制数表示一个有符号的十进制数值0 到9。当两个8 位的BCD 数值相加,CPU 实际上执行普通的二进制加法。对于BCD 码,这个计算的结果可能不再是一个有效的BCD 码。根据ADD 或ADC 指令对2 个标准的BCD 数计算所改变的H 和C 标志位,DAA 指令可以对结果进行修正使其成为有效的BCD 数并且修正C 标志位的内容使其正确的表示使用BCD 加法后的结果。在过去完成这些操作是非常复杂的,需要测试每一个BCD 数值的结果和H、C 标志位。而DAA
17、 指令则能很简单的完成这个操作。第27页/共62页下面例子展示了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=$B0 ;想得到59+57=1
18、16或者当进位置位时A=$16DAA;加$66和设置进位;$B0+$66=$16进位置位第28页/共62页逻辑操作指令 24第29页/共62页逻辑操作指令 24这些指令执行8 位操作数的并行布尔运算。逻辑指令均包括了两个操作数,一个是累加器A,另一个在存储器中。立即寻址、直接寻址、扩展寻址或变址寻址等寻址方式(和H:X 或者SP 相关)也允许用来访问操作数。累加器的每个位都执行与、或和异或操作。逻辑操作的结果返回累加器,覆盖原来的操作数。LDA#$0C;位形式为00001100AND#$0A;位格式为00001010;结果是$08 .00001000LDA#$35;位格式为00110101AN
19、D#$0F;位格式为00001111;结果是$05 .00000101第30页/共62页逻辑操作指令从示例中可看出这些操作和BCLR 指令之间有些类似的地方。然而,BCLR 仅能够在$0000$00FF 存储区间使用,AND 能够清零任何合并位,而BCLR 仅能够清零一位。AND 能在几个不同的寻址方式下使用与A 运算的存储操作数。LDA#$0C;位格式为00001100ORA#$0A;位格式为00001010;结果是$0E;00001110ORA 操作和BSET 指令之间有一些类似的地方。然而,BSET 仅仅被使用在存储区$0000$00FF,ORA 能够设置任何合并位,而BSET 仅能够置
20、位一位。ORA 能在几个不同的寻址方式下使用与A 运算的存储操作数。第31页/共62页逻辑操作指令A6 0C LDA#$0C;位格式为00001100A8 0A EOR#$0A;位格式为00001010;结果是$06;00000110B6 00 LDA PTAD;读I/O端口AA8 03 EOR#$03;低两位异或操作B7 00 STA PTAD;更新I/O端口A“异或”常在操作数中用来钳制某些位,有时被认为是掩码,每个位在掩码通信时被设置成在另外的操作码有效位并被反向钳制。下面的例子是读I/O 端口,异或通过直接掩码值$03 钳制两个最小的有效位,然后向I/O 端口写入更新的结果。第32页/
21、共62页逻辑操作指令LDA#$C5;位格式为11000101COMA;结果是00111010取反指令简单的转换操作数的每个位,不要和求补指令相混淆,取负指令执行的是一条算术运算指令,即等效于与一个负1 相乘。第33页/共62页位操作指令 14位测试指令(逻辑操作)BCLR n,addr8 (其实是8条指令,见下页)BSET n,addr8 (8 )第34页/共62页位操作指令 14第35页/共62页位操作指令 14位测试指令(逻辑操作)位指令将相应存储地址中的操作数与A 寄存器的每个位进行“与操作”(就像A 与),但是结果不存储在累加器中。在执行位指令后,根据与操作的结果来置位或清零条件码寄存
22、器N 和Z 位,以实现条件跳转。如果使用“掩码”方法进行编程,则掩码中的每个对应位被测试,执行BIT 指令后,若测试位均不是1 则Z 位被置位。第36页/共62页位操作指令 14位测试指令LDA SCI1S1;读SCI状态寄存器BIT#(mOR+mNF+mFE+mPF);所有的错误标志的掩码BNE sciError;如果有任何的错误标志被置位则转移;A中值未被改变sciError:;如果有任何的错误标志被置位,则跳转到此例如用于判断SCI1S1 中有关错误标志位的掩码:mOR equ%00001000;接收超时的掩码mNF equ%00000100;接收干扰标志的掩码mFE equ%00000
23、010;接收端帧差错的掩码mPF equ%00000001;接收端奇偶校验失败的掩码如果希望当SCI1S1 中至少有一个错误标志被置位时转移,则采用复合掩码:#(mOR+mNF+mFE+mPF)。上述程序则采用这种方法.第37页/共62页位操作指令 14位的置位与清零 读修改写位的置位(BSET)与清零(BCLR)指令被认为是位级的存储指令,但是这些指令通常取一个完整的8位的数,修改指定的位,然后重写整个8 位的数。在某些情况下,例如当目标位置与RAM 变量不对应时,这个微妙的操作将导致意想不到的结果。如果BSET或BCLR 指令试图改变非易失性存储单元的某一位,通常这一位不会改变因为非易失性
24、存储器要求更复杂的操作步骤来改变这一位。某些状态位是通过一定步骤清零的,这一步骤包括读取状态位后写入到外设模块的其他寄存器。使用者会惊讶的发现BSET 和BCLR 指令能满足读取状态寄存器的要求。为了避免这样的问题,只要记住BSET 和BCLR 指令是能并行读取8 位数据的读-改-写指令。某些控制寄存器或I/O 寄存器不能够读写同一物理逻辑状态。一般来说,在这些地址区域不使用读-改-写指令,因为它们也许会产生意想不到的结果。第38页/共62页BSET 和BCLR 指令能满足读取状态寄存器的要求.;置位的例子 打开TE而不需要改变RE16 1B BSET TE,SCI1C2;SCI传输使能;功能
25、上与下面是相同的B6 1B LDA SCI1C2 ;读当前SCCR2的值AA 08 ORA#mTE;TE位上或操作(屏蔽)B7 1B STA SCI1C2 ;更新SCCR2中的值第39页/共62页置位和清零进位位指令(SEC 和CLC),可以用于,在执行左移或右移指令前,改变进位位的值。置位中断屏蔽(SEI)和清零中断屏蔽(CLI)指令被用来让中断使能和禁止。复位后,在堆栈指针和其他系统条件初始化之前,I 位需要被置位用来防止中断。当完成足够的系统初始化后,需要用CLI 指令来放开中断。在某些程序中,敏感的代码序列需要预防中断。当编写敏感代码序列时,SEI 在序列之前使用,CLI 在序列之后使
26、用。第40页/共62页移位类指令 36第41页/共62页第42页/共62页移位类指令 36所有的移位类指令在由8 位的A、X 或者存储器空间和在CCR 中的C 位组成的9位空间上操作。附图描述了在指令执行时C 位如何配合左移位或者右移位操作。逻辑左移指令就是简单地把0 移位到有效值的最低位,最高位移位到进位位。算术移位指令将左移的值作为有符号二进制补码来处理。算术左移类似于乘2 操作,算术右移类似于除2 操作。算术右移(ASR)指令复制最初的最高有效位(MSB)返回到MSB,以保护操作数符号。ASL 和LSL 就像相同指令不同的写法,因为在逻辑和算术左右移位上,均没有功能上的较大区别。第43页
27、/共62页移位类指令 36在移位中包含了进位,移位允许将这些操作扩展成多字节操作。下面的例子展示了一个24 位值被左移或者右移。;24位的左移操作CLC;清零C位ROL sum24+2;C位转移到低字节的最低位ROL sum24+1;转移中间字节ROL sum24;转移高字节LSL sum24+2;24位的右移操作?第44页/共62页跳转、转移和循环控制指令 501、无条件跳转和转移指令 7条BRanch AlwaysBRanch Never第45页/共62页1、无条件跳转和转移指令跳转(JMP),转移(BRA)和无转移(BRN)指令是无条件的,不依靠任何CCR 位的状态。JMP 可以跳转到6
28、4K 字节地址空间的任何一个位置,而转移指令被限制在当前位置的-128 到+127 的区域空间。下面例子的指令使用了JMP 指令来扩展条件转移的范围。对每一个条件转移指令来说,均有相反条件操作的转移指令存在。例如相对转移指令,就有相等转移指令(BEQ)和不相等转移指令(BNE)等等。假如写出了下面的指令。;BEQ farAway;多于128字节汇编程序就会标志出一个错误,因为超过了128 字节的距离.也可以使用BNE 来替换BEQ,那执行起来就像下面这个跳转指令了。BNE aroundJ;如果不相等则转移JMP faraway;如果相等则转移aroundJ:;如果不相等转移到这里第46页/共6
29、2页跳转、转移和循环控制指令2、简单转移指令 12条Branch if EQualBranch if Carry bit ClearBranch if Not EqualBranch if Carry bit SetBranch if PLusBranch if MinusBranch if Irq pin LowBranch if Irq pin HighBranch if interrupt Mask ClearBranch if Half Carry bit Clear第47页/共62页跳转、转移和循环控制指令2、简单转移指令 状态位与指令对照第48页/共62页跳转、转移和循环控制指令3
30、、有符号数转移指令 4条Branch if Less ThanBranch if Less than or EqualBranch if Greater than or EqualBranch if Greater Than有符号数的操作均可使用于诸如:小于转移(BLT),小于等于转移(BLE),大于等于转移(BGE)和大于转移(BGT)等指令。简单转移中的相等转移(BEQ)和不相等转移(BEN)等指令也可用于有符号数。M68HC05 系列没有CCR 中V 位,因此它不能够进行有符号转移。有符号和无符号转移的不同点是有符号转移使用N和V的异或来代替C 位作为控制转移的布尔条件。N 和V 的异或
31、提供了一个高于+127(+32,767)或者低于128(32,768)溢出标志。C 位超过+255(+65,535)就显示出溢出。第49页/共62页跳转、转移和循环控制指令4、无符号数转移指令 4条小于转移(BLO)、小于等于转移(BLS)、大于等于转移(BHS)和大于转移(BHI)用在无符号数运算。简单转移、相等转移和不相等转移也能用在无符号数运算。Branch if Lowersame as BCSBranch if Lower or SameBranch if Higher or Samesame as BCCBranch if HIgher第50页/共62页跳转、转移和循环控制指令5、
32、位条件转移指令 2条这些转移指令测试直接寻址空间($0000$00FF)中的操作数的一个单独的位,如果测试位被置1,BRSET 则跳转,如果测试位为0,BRCLR 则跳转。尽管这个操作数看起来像被限制在存储位置上,但它包含了所有的I/O 和控制寄存器空间和一些RAM 中的一部分重要的位置,这些位置用来存放程序中的变量。对于每个位置都有独立的操作数,这些指令有着特别的效果,仅需要3 字节的目标代码和5 个总线周期。waitRDRF:BRCLR RDRF,SCI1S1,waitRDRF;等待RDRF被置位BRCLR OneSecond,flags,skipUpdateupdateTime:BCLR
33、 OneSecond,flags;清除布尔变量skipUpdate:第51页/共62页跳转、转移和循环控制指令5、循环控制指令 12条CBEQ 指令比较累加器和某个存储位置的内容,如果它们彼此相等就跳转。CBEQA和CBEQX 允许寄存器A 或X 与一个立即数相比较。与CBEQ 指令相关的H:X 变址操作的特殊点是当比较A 和变址存储位置的内容后H:X 会自动增加。这些变化可被用来寻找存储器中特殊的值,例如字符串最后的空值、一个返回值或一个结束标志。CBEQ其他的变化可用来作为存储区域的循环记数(增加或减少该循环记数可通过另外的在循环中的指令来实现)。Compare and Branch if
34、 EQual Decrement and Branch if Not Zero 第52页/共62页LDA#$0D;ASCII CBEQ oprA,gotCR;如果立即数等于$0D则跳转。;这里的立即数可以是任何数除了gotCR:;如果立即数是则跳转;相似的,但是立即数寻址方式代替了直接寻址方式LDA SCI1DRL ;read SCI character;读SCI字符CBEQ#$0D,gotCR ;如果它是则跳转前面对于寻址方式的讲解中也有CBEQ的例子。第53页/共62页DBNZ 指令对寄存器A、X 或存储区域的值减1,如果结果值不为0 便转移。这提供了一个有效的实现循环计数的方法。LDA#
35、4;循环记数STAdirectByte;保存在RAM中loopTop:NOP;开始程序循环DBNZ directByte,loopTop;循环直到计数值到;在堆栈中使用局部量来循环记数LDA#4;循环记数PSHA;将循环记数压栈loopTop1:nop;开始程序循环DBNZ 1,sp,loopTop1;循环直到计数值到第54页/共62页跳转、转移和循环控制指令6、子程操作类指令 9条Jump to SubRoutine Branch to SubRoutine SoftWare Interrupt第55页/共62页1中断入口低优先级高中断号入口地址模块标记允许位寄存器230 xFFD0:FFD
36、1系统RTIFRTIESRTISC200 xFFD6:FFD7ACMPACFACIEACMPSC190 xFFD8:FFD9ADCCOCOAIENADCSC1180 xFFDA:FFDBKBIKBFKBIEKBISC170 xFFDC:FFDDIICIICIFIICIEIICC,IICS160 xFFDE:FFDFSCITDRE、TCTIE、TCIESCIC2150 xFFE0:FFE1SCI IDLE、RDRFILIE、RIESCIS1140 xFFE2:FFE3SCIOR,NF,FE,PFORIESCIC3130 xFFE4:FFE5SPISPIF,MODF,SPTEFSPIE,SPTIE
37、SPIC1120 xFFE6:FFE7 MTIMTOFTOIEMTIMSC70 xFFF0:FFF1TPMTOFTOIETPMSC60 xFFF2:FFF3TPMCH1FCH1IETPMC1SC50 xFFF4:FFF5TPMCH0FCHI0IETPMC0SC30 xFFF8:FFF9系统LVDFLVDIESPMSC120 xFFFA:FFFBIRQIRQFIRQIEIRQSC10 xFFFC:FFFDCPUSWI指令-00 xFFFE:FFFF系统COP,LVD,RST,POR,非法指令等。第56页/共62页跳转、转移和循环控制指令6、子程操作类指令 9条ReTurn from Subrou
38、tineReTurn from Interrupt无条件跳转到子程序(JSR)和转移到子程序(BSR)指令用于转到程序中某个位置的系列指令(子程序)。通常,在子程序的结尾,返回子程序(RTS)指令引导CPU 返回到因调用子程序而未执行的JSR 或BSR 后的下一个指令。软件中断(SWI)指令和JSR 指令相似,但软件中断在执行时可把X、A 和CCR 寄存器中的内容保存到堆栈中,完了又可以返回PC 地址和特定子程序地址。中断服务子程序是从接近存储器结尾处的中断向量取来地址的。在进行SWI 时,矢量定位于$FFFC和$FFFD 之间。第57页/共62页swiSWI 的一系列的详细事件:在SWI 代
39、码操作后,PC 指向下一个地址(这是个返回地址)PCL 压栈存储PC(低位)特定位置指向通过SP,然后减少SP 的值。PCH 压栈。同样顺序下将X、A 和CCR入栈在这个顺序的结尾,SP 指向CCR 进栈地址的下一个位置。在CCR 中置位I 位,以使在执行中断服务子程序期间,禁止中断嵌套。从$FFFC 中加载PCH为中断服务子程序取来高地址的字节。从$FFFD 中加载PCL。转移到从$FFFC:FFFD 取来的地址。为了与早期的M68HC05 兼容,高位寄存器H 不能够自动进栈。在中断服务子程序开始时手动将H 寄存器压栈和在返回中断子程序时手动将H 出栈是个很好的习惯。通常,在中断服务程序中执
40、行的最后指令是中断返回(RTI),RTI 恢复了CCR、A、X、PCH 和PCL 的值,之前它们按相反的顺序被保存在堆栈中。每个字节从堆栈中取出时,SP 加1 并指向下一个将被取出的数据,相应的寄存器从SP 指向的地址加载数据。在执行RTI 后,程序重新返回刚才被压进堆栈的地址。第58页/共62页其它指令NSARSPSWI第59页/共62页无操作指令(NOP)一般用于在软件中产生程序延时。它消耗执行时间,但是不引起任何状态码和CPU 寄存器的改变。下面的例子是用NOP 来产生1ms 延时的软件循环。627*628*dly1ms 总线频率延时1ms 总线频率=20MHz629*630;1个总线周
41、期=50个十亿分之一秒,因此20,000个周期=1ms631;JSR(EXT)指令占了5或者6周期,总的花费的时间是24-25周期632;总的延时20000=8n+24;因此n=19976/8=2497633 C232 8B dly1ms:pshh;2 保存H634 C233 89 pshx;2 保存X635 C234 9D nop;1 使得n正好636 C235 45 09C0 ldhx#2496;3 转移记数637 C238 AF FF loop1ms:aix#-1;2 H:X=H:X-1638 C23A 65 0000 cphx#$0000;3 零检查639 C23D 26 F9 bne loop1ms;3 直到H:X=$0000转移640 C23F 88 pulx;3 恢复X641 C240 8A pulh;3 恢复H642 C241 81 rts;6 返回第60页/共62页人有了知识,就会具备各种分析能力,明辨是非的能力。所以我们要勤恳读书,广泛阅读,古人说“书中自有黄金屋。”通过阅读科技书籍,我们能丰富知识,培养逻辑思维能力;通过阅读文学作品,我们能提高文学鉴赏水平,培养文学情趣;通过阅读报刊,我们能增长见识,扩大自己的知识面。有许多书籍还能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进。第61页/共62页感谢您的观看!第62页/共62页
限制150内