说来奇怪,我算的为什么和它不一样,但方法大概就是这样,如果有错请告知
ORR指令的格式为: ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。
所以R2 = 0x87878787 | 0x78787878 = FFFFFFFF
AND 是逻辑与运算
R1 = R2 & R3 = FFFFFFFF & 0x87878787 = 0x87878787
ADD是相加运算
R1 = R1 + 0x66666666 = 0x87878787 + 0x66666666 = 0xEDEDEDED
BIC是位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。
0x44444444的反码是3BBBBBBB
所以R2 = 3BBBBBBB & R1 = 3BBBBBBB & 0xEDEDEDED = 29A9A9A9
解析也错的,这种就应该自己写代码跑啊
static void test_asm(){
int val[6] = {0};
int* pval = val;
asm volatile(
"MOV r0, %1\n"
"LDR r3, =0x87878787\n"
"STR r3, [r0, #0]\n" //val[0] = r3
"ORR r2, r3, #0x78787878\n"
"STR r2, [r0, #4]\n" //val[1] = r2
"AND r1, r2, r3\n"
"STR r1, [r0, #8]\n" //val[2] = r1
"ADD r1, r1, #0x66666666\n"
"STR r1, [r0, #12]\n" //val[3] = r1
"BIC r2, r1, #0x44444444\n"
"STR r2, [r0, #16]\n" //val[4] = r2
: "+r"(pval)
);
printf("--------------------------------------------\n")
printf("LDR r3, =0x87878787 R3 = 0x%08X\n", val[0]);
printf("ORR r2, r3, #0x78787878 R2 = 0x%08X\n", val[1]);
printf("AND r1, r2, r3 R1 = 0x%08X\n", val[2]);
printf("ADD r1, r1, #0x66666666 R1 = 0x%08X\n", val[3]);
printf("BIC r2, r1, #0x44444444 R2 = 0x%08X\n", val[4]);
printf("--------------------------------------------\n")
}
输出:
--------------------------------------------
LDR r3, =0x87878787 R3 = 0x87878787
ORR r2, r3, #0x78787878 R2 = 0xFFFFFFFF
AND r1, r2, r3 R1 = 0x87878787
ADD r1, r1, #0x66666666 R1 = 0xEDEDEDED
BIC r2, r1, #0x44444444 R2 = 0xA9A9A9A9
--------------------------------------------