實現將暫存器高位和低位對稱換位操作,如: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 ;結束程式
結果:
對大小端模式,記憶體位址高低位,暫存器高低位
cpu 大小端模式的區別 大端模式 big endian 是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 little endian 是指資料的...
ARM彙編中PC暫存器詳解
近日,在研究一些開源native層hook方案的實現方式,並據此對arm彙編層中容易出問題的一些地方做了整理,以便後來人能有從中有所收穫並應用於現實問題中。當然,文中許多介紹參考了許多零散的文章,本文重點工作在於對相關概念的整理收集,並按相對合理順序引出後文中對hook技術中的一些難點的解讀。and...
ARM彙編筆記(1) 暫存器 常用指令
1.通用暫存器 r0 r15 與編譯器有特殊約定的暫存器 r13 別名sp,棧頂指標 r9 r13都有約定,但還是sp最常用到 psr暫存器 狀態暫存器 n 運算結果為負 z 運算結果為零 c 運算發生進製 v 運算發生溢位 與後文cmp,s字尾和condition字尾相關 2.常用指令 mov m...