嵌入式系统第三章ARM指令系统.ppt
例如:把8个字从r0指向的位置拷贝到r1指向的位置,即 LDMIA r0!,{r2–r9} STMIA r1,{r2–r9}执行后,r0增加了32。这是由于“!”使其自动变址8个字节,而r1没有改变。如果r2-r9含有有用的数据,则可以先把它们压入堆栈,即 STMFD r13!,{r2-r9} ;将寄存器压栈 LDMIA r0!,{r2–r9} STMIA r1,{r2–r9} LDMFD r13!,{r2–r9} ;从堆栈中恢复后缀“FD”表示满递减堆栈寻址模式。注意,在堆栈操作中几乎总是要指定自动变址,以便保证堆栈指针具有一致的行为。多寄存器Load和Store指令为保存和恢复处理器状态以及在存储器中移动数据块提供了一种有效方式。它节省代码空间,并且其执行速度提高了4倍。这个重要的优点说明,值得认真考虑数据在存储器中的组织方式,以便增大使用多寄存器传送指令去访问存储器的潜力。递增A(入栈时)递减D(入栈时)满空满空增值先增STMIBSTMFALDMIBLDMED后增STMIASTMEALDMIALDMFD减值先减LDMDBLDMEASTMDBSTMFD后减LDMDALDMFASTMDASTMED控制流指令既不处理数据,也不存取数据,它只是确定下一步执行哪一条指令。1转移指令2条件转移3条件执行4转移链接5子程序返回6监控程序调用7跳转表83.3控制流指令B LABEL…LABEL …将程序的执行从一个位置切换到另一个位置最常用的方法是使用转移(branch)指令,01LABEL ……B LABEL或02转移指令(无条件转移)有时想让微处理器决定是否进行转移。MOV r0,#0 ;计数器初始化LOOP …ADD r0,r0,#1 ;循环计数器加一CMP r0,#10 ;与循环的限制比较BNE LOOP ;如不相等则返回… ;否则循环终止条件转移转移解释一般应用B无条件总是执行转移BEQ相等BNE不等BPL正BMI负BCCBLO无进位、低于无符号数比较BCSBHS有进位、高于或相等无符号数比较BVC无溢出有符号数比较BVS有溢出有符号数比较BGT大于有符号数比较BGE大于或相等有符号数比较BLT小于有符号数比较BLE小于或相等有符号数比较BHI高于无符号数比较BLS低于或相等无符号数比较列在表中同一行的一对条件(如和)的含义相同,并得到同样的二进制代码。但两者都是有用的,因在特定的环境中,每一种条件都可能使汇编语言源代码的编译更加容易。当表中提到有符号数和无符号数的比较时,它并不是要选择比较指令本身,而只是支持操作数选择的解释。CMP r0,#5BEQ BYPASS ;if(r0!=5){ADD r1,r1,r0 ;r1:=r1+r0-r2SUB r1,r1,r2 ;}BYPASS …ARM指令集有一条不寻常的特征,就是条件执行不仅应用于转移指令,也应用于所有的ARM指令。01CMP r0,#5 ;if(r0!=5){ADDNE r1,r1,r0 ;r1:=r1+r0-r2SUBNE r1,r1,r2 ;}…替代为02条件执行要激活条件执行,须在3字符的操作码之后增加2字符的条件码(条件码应在其它任何修正码之前)。;if((a==b)(c==d))e++;CMP r0,r1CMPEQ r2,r3ADDEQ r4,r4,#1由于第二个比较指令使用了条件执行,从而实现了if语句中的逻辑“与”。使用条件执行的示例Euclid(欧几里德)的最大公因子(gcd)算法的两种实现方法。它说明了如何能使用条件执行来改进代码密度和执行速度。在C语言中,该算法可以表示如下: intgcd(inta,intb){ while(a!=b){ if(ab) a=a?b; else b=b?a; } returna; }采用下列代码,可以只用带条件跳转来实现gcd函数:gcd CMP r0,r1 BEQ end B