天天看點

ARM彙編實作将寄存器高低位對稱換位

實作将寄存器高位和低位對稱換位操作,如:R0 = 0x55555555

分析:5(十六進制) = 0101(二進制)

           高低位對稱交換:0101(二進制) -> 1010(二進制) = A(十六進制)

           是以最終的結果應該是 R0 = 0xAAAAAAAA

思路: 網上有一個什麼蝶式交換算法,但是我太笨了,我是真的看不懂,這是我的做法

         先把R0中的内容存進R1(其它也可以),清空R0;

         循環32次(一個寄存器有32位),每次循環做這麼幾件事:

         R1和0x1做與運算(為了得到R1的最低位),R0加上這個與運算的結果;

         加完後,R0左移一位,R1右移一位,計數器加1,進行下一次循環

代碼:

AREA TEST, CODE, READONLY 
    ENTRY
    MOV R0, #0         ;R0清零
    LDR R1,=0x55555555 ;這裡我直接把R1的值賦成要換位的數了 為啥要這麼指派是因為這是一個不合法的立即數,不能用MOV來指派,隻能用僞指令來做,大概是這樣,我隻模糊地記得老師大概是這麼說的
    MOV R3, #1         ;R3用來做計數器
loop
    TEQ R3, #32        ;判斷計數器是否已經加到32
    BEQ return         ;若已加到32,跳轉到程式結束處;否則繼續執行
	
    ADD R3, R3, #1     ;計數器自加1,向前推進
	       
    AND R2, R1, #1     ;将R1與1做與運算的結果存到R2中,即擷取R1的低1位
    TEQ R2, #0         ;判斷R1的低1位是0還是1
    BEQ add0           ;如果是0,跳轉到給R0的低1位加上0的代碼段
	               ;如果是1,執行給R0的低1位加上1的代碼段
     
    ADD R0, R0, #1     ;R0最低位加1
    LSL R0, #1         ;R0左移一位,空出最低位
    LSR R1, #1         ;R1右移一位,更新最低位
	
    B loop             ;無條件跳轉,繼續執行
	
add0
    ADD R0, R0, #0     ;R0最低位加0 
    LSL R0, #1         ;R0左移一位,空出最低位
    LSR R1, #1         ;R1右移一位,更新最低位
    B loop             ;無條件跳轉,繼續執行
	
return   
    END                ;結束程式
           

結果:

ARM彙編實作将寄存器高低位對稱換位