ARM的逻辑指令运算示例

img


我感觉解析一步都没看懂,大佬能不能耐心瞅瞅给我讲解讲解,感谢!!!

说来奇怪,我算的为什么和它不一样,但方法大概就是这样,如果有错请告知

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
--------------------------------------------