;工程名:Exa3.mcp
;文件名:Exa3.s
;功能:使用数据处理类指令实现以下各功能
;说明:使用ARMulate软件仿真调试
X EQU 11 ; 定义X的值为11
Y EQU 8 ; 定义Y的值为8
Z EQU 5 ; 定义Z的值为5
BIT23 EQU (1<<23) ; 定义BIT23的值为0x00800000展开就是0x00000000 10000000 00000000 00000000
; 只有宏中可以这么写
AREA Example3,CODE,READONLY ; 声明代码段Example3
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令
START ; 使用MVN、SUB指令实现:R5 = 0x5FFFFFF8 - R8 * 8
MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8
SUB R5,R0,R8,LSL #3 ; R8左移3位,结果即是 R8 * 8 R5 = R0 - R8
; 使用CMP指令判断(7*Y/2)>(4*X)吗?若大于则R5 = R5&0xFFFF00a0,否则R5 = R5|0x000000FF
MOV R0,#Y
ADD R0,R0,R0,LSL #3 ; 计算R0 = Y + 8*Y = 9*Y
MOV R0,R0,LSR #1 ; 计算R0 = 7*Y/2
MOV R1,#X
MOV R1,R1,LSL #2 ; 计算R1 = 4*X
CMP R0,R1 ; 比较R0和R1,即(7*Y/2)和(4*X)进行比较
LDRHI R2,=0xFFFF00a0 ; 若(7*Y/2)>(4*X),则R2 <= 0xFFFF00a0
ANDHI R5,R5,R2 ; 若(7*Y/2)>(4*X),则R5 = R5&R2
ORRLS R5,R5,#0x000000FF ; 若(7*Y/2)≤(4*X),则R5 = R5|0x000000FF
; 使用TST指令测试R5的bit23是否为1,若是则将bit6位清零(使用BIC指令)
TST R5,#BIT23
BICNE R5,R5,#0x00000040
;使用MUL和MLA实现R3=(7*Y)+(3*X)+Z的功能
MOV R0,#Y
MOV R1,#7
MUL R2,R0,R1 ;计算R2 = 7*Y
MOV R0,#X
MOV R1,#2
MLA R3,R0,R1,R0 ; 计算R3 = 2*X + X
ADDS R3,R3,R2 ;R3= (7*Y)+(3*X)
ADDS R3,R3,#Z; ;R3= (7*Y)+(3*X)+Z
B START
END
|