ARM汇编程序-逻辑控制

时间:2021-12-18 00:54:48

  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    大于(有符号数)