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++
B FOR_L1
FOR_END NOP
; while(x<=y)
; { x *= 2;
; }
; 设x为R0,y为R1 (x、y均为无符号整数)
MOV R0,#1 ; 初始化x的值
MOV R1,#20 ; 初始化y的值
B 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
B SWITCH_END ; break
CASE_5 CMP R2,#5 ; case 5:
BNE CASE_7
SUB R0,R2,R1 ; x = key - y
B SWITCH_END ; break
CASE_7 CMP R2,#7 ; case 7:
BNE DEFAULT
MUL R0,R2,R1 ; x = key * y
B SWITCH_END ; break
DEFAULT MOV R0,#168 ; default: x = 168
SWITCH_END NOP
HALT B 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 大于(有符号数)