ARM汇编程序逻辑控制实例



ARM汇编程序逻辑控制实现源码实例教程。

AREA Example4,CODE,READONLY ; 声明代码段Example4
  ENTRY    ; 标识程序入口
  CODE32    ; 声明32位ARM指令
  
START  ; if(x>y) z=100;
   else  z=50;
  ; 设x为R0,y为R1,z为R2 (x、y、z均为无符号整数)
  MOV  R0,#76  ; 初始化x的值
  MOV  R1,#243  ; 初始化y的值
  CMP  R0,R1  ; 判断x>y?
  MOVHI R2,#100  ; x>y条件正确,z=100
  MOVLS R2,#50  ; 条件失败,z=50
  
  ; for(i=0; i<10; i++)
  ; {  x++;
  ; }
  ; 设x为R0,i为R2 (i、x均为无符号整数)
  MOV  R0,#0  ; 初始化x的值
  MOV  R2,#0  ; 设置i=0
FOR_L1  CMP  R2,#10  ; 判断i<10?
  BHS  FOR_END  ; R2>=10,退出循环
  
  ADD  R0,R0,#1 ; 循环体,x++
  
  ADD  R2,R2,#1 ; i++
   FOR_L1  
FOR_END  NOP
  ; while(x<=y) 
  ; {  x *= 2;
  ; }
  ; 设x为R0,y为R1 (x、y均为无符号整数)
  MOV  R0,#1  ; 初始化x的值
  MOV  R1,#20  ; 初始化y的值
   WHILE_L2 ; 首先要判断条件
  
WHILE_L1 MOV  R0,R0,LSL #1 ; 循环体,x *= 2

WHILE_L2 CMP  R0,R1  ; 判断x≤y?   
  BLS  WHILE_L1 ; 若条件正确,继续循环
WHILE_END NOP
  ; do
  ; {  x–;
  ; } while(x>0);
  ; 设x为R0 (x为无符号整数)
  MOV  R0,#5  ; 初始化x的值
  
DOWHILE_L1 ADD  R0,R0,#-1 ; 循环体,x–
  
DOWHILE_L2 MOVS R0,R0  ; R0 <= R0,并影响条件码标志  
  BNE  DOWHILE_L1 ; 若R0不为0(即x不为0),则继续循环
DOWHILE_END NOP   
  
  
  ; switch(key&0x0F)
  ; {  case  0:
     case  2:
     case  3:  x = key + y;
               break;
     case  5:  x = key – y;
               break;
     case  7:  x = key * y;
               break;
     default:  x = 168;
               break;      
  ; }
  ; 设x为R0,y为R1,key为R2 (x、y、key均为无符号整数)
  MOV  R1,#3  ; 初始化y的值
  MOV  R2,#2  ; 初始化key的值

SWITCH  AND  R2,R2,#0x0F ; switch(key&0x0F)
 
CASE_0  CMP  R2,#0  ; case 0:
CASE_2  CMPNE R2,#2  ; case 2:
CASE_3  CMPNE R2,#3  ; case 3:
  BNE  CASE_5 
  ADD  R0,R2,R1 ;   x = key + y
   SWITCH_END ;   break
  
CASE_5  CMP  R2,#5  ; case  5:
  BNE  CASE_7
  SUB  R0,R2,R1 ;   x = key – y
   SWITCH_END ;   break
  
CASE_7  CMP  R2,#7  ; case 7:
  BNE  DEFAULT  
  MUL  R0,R2,R1  x = key * y
   SWITCH_END  ;   break
  
DEFAULT  MOV  R0,#168  ; default: x = 168
  
SWITCH_END NOP
  

HALT   HALT  

  END 

附:

1.2012年4月27

控制流指令
   转移指令(branch)
       说明:无条件转移B,BAL
       举例:    B LABEL        ; LABEL为某个位置
   条件转移
       说明:    BEQ    相等
           BNE    不等
           BPL    非负
           BMI    
           BCC    无进位
           BCS    有进位
           BLO    小于(无符号数)
           BHS    大于等于(无符号数)
           BHI    大于(无符号数)
           BLS    小于等于(无符号数)
           BVC    无溢出(有符号数)
           BVS    有溢出(有符号数)
           BGT    大于(有符号数)
           BGE    大于等于(有符号数)
           BLT    小于(有符号数)
           BLE    小于等于(有符号数)