在32位的arm架構系統中,通用暫存器中有乙個暫存器比較特殊,就是r15,它也是pc暫存器。
pc是program counter。也叫做ip,instruction pointer。
當arm處理器執行一條指令時,在其執行結束時可能會發生兩件事。 如果指令沒有修改pc,則pc只會增加4,因為在32位arm中,指令為32位寬,所以每條指令之間有4個位元組。 如果指令修改了pc,則使用pc的新值。當然64位的arm就是增加8了每次指令過後。
如果一條指令確實將pc修改為例如pc + 4以外的其他值,那麼可以執行該程式的另一條指令。 更改pc值的過程稱為分支。 在arm中,這是使用分支指令完成的。
可以分為無條件分支和有條件分支。
無條件分支就是強制跳轉了,我們主要來看下有條件分支。
這裡涉及到乙個暫存器cpsr(urrent program status register)。
其包含條件flag:
n (negative), z (zero), c (carry) and v (overflow)
n:如果指令結果為負數,則啟用,否則禁用。
z:如果指令的結果為零,則將啟用。 如果非零,則禁用。
c:如果指令的結果產生的值需要完全表示第33位,則將啟用c。 例如,加法溢位了32位整數範圍。 對於減法,有乙個特殊情況,即無借位減法使能c,否則將其禁用:否則,將較大的數減為較小的值將啟用c,但如果反之亦然,則將其禁用。
v:如果指令結果產生的值不能用32位二進位制補碼表示,則將啟用v。
eq(相等)z為1
ne(不相等)z為0
ge(大於或等於,用兩個補碼表示)。當v=n。
lt(低於,兩個補碼)。這與ge相反,v不等於n跳轉
gt(大於,是兩個補碼)。z=0,n=v
le(小於或等於,用兩個補碼表示)。z=0或者v不等於n
mi(負/負)n為1
pl(正/正或零)n為0
vs(溢位設定)v為1
vc(清除溢位)v為0
hi(較高)c為1並且z為0
ls(較低或相同)c為0或z為1
cs / hs(進製設定/更高或相同)當c為1
cc / lo(進製清除/降低)當 c為0
.text
.global main
main:
mov r1, #2 /* r1 ← 2 */
mov r2, #2 /* r2 ← 2 */
cmp r1, r2 /* update cpsr condition codes with the value of r1-r2 */
beq case_equal /* branch to case_equal only if z = 1 */
case_different :
mov r0, #2 /* r0 ← 2 */
b end /* branch to end */
case_equal:
mov r0, #1 /* r0 ← 1 */
end:
bx lr
as -g -o com.o com.s
ld -o com com.o
當r1和r2暫存器相等的時候才會跳轉。
我們再來看下64位的示例**。
.arch armv8-a
.global _start
.text
_start:
mov x1, #2 /* r1 ← 2 */
mov x2, #2 /* r2 ← 2 */
cmp x1, x2 /* update cpsr condition codes with the value of r1-r2 */
beq case_equal /* branch to case_equal only if z = 1 */
case_different :
mov x0, #2 /* r0 ← 2 */
b end /* branch to end */
case_equal:
mov x0, #1 /* r0 ← 1 */
mov x8, 93
svc 0
as -g -o com64.o com64.s
ld -o com64 com64.o
第10部分 Linux ARM彙編 定址方式
都遵循gas彙編器的語法。mov ro,1234 mov r0,r1 lsl 邏輯左移,移位後暫存器空出的低位補0。lsr 邏輯右移,移位後暫存器空出的高位補0。asr 算術右移,移位過程中,符號位保持不變,如果源運算元是正數,則空出的高位補0,否則補1.ror 迴圈右移,移位後移除的低位填入空出的...
Microformats教程 第3部分
本文首發於 http www.lunaticsun.com article microformats three 目前,這個系列已經有兩篇文章了,它們是 什麼是microformats microformats教程 第1部分 microformats教程 第2部分 在這一部分中,我們將討論一種全新的...
BPMN 第5部分 訊息
訊息是乙個基本的 bpmn概念,是不同流程參與者之間通訊的內容。通訊本身稱為訊息流。它顯示了兩個通訊參與者之間的互動,他們由兩個單獨的池表示。訊息流必須將兩個單獨的池或乙個池的物件與另乙個池的物件連線。它無法連線乙個池中的兩個物件。從圖形上看,訊息流是帶有開啟箭頭的虛線。虛線將其與 序列流 區分開來...