實作将寄存器高位和低位對稱換位操作,如: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 ;結束程式
結果: