第1天-ARM匯編指令B/BL
B : 分支
本文引用地址:http://m.butianyuan.cn/article/201611/321990.htm(Branch)
B{條件} <地址>
B是最簡單的分支。一旦遇到一個B指令,ARM 處理器將立即跳轉到給定的地址,從那里繼續(xù)執(zhí)行。注意存儲在分支指令中的實際的值是相對當前的 R15 的值的一個偏移量;而不是一個絕對地址。它的值由匯編器來計算,它是 24 位有符號數(shù),左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(+/- 32 M)。
在其他處理器上,你可能經常見到這樣的指令:
OPT 1 LDA &70 CMP #0 BEQ Zero STA &72 .Zero RTS
(取自 Acorn Electron User Guide issue 1 page 213)
在 ARM 處理器上,它們將變成下面這些東西:
OPT 1 ADR R1, #&70 LDR R0, [R1] CMP #0 BEQ Zero STR R0, [R1, #2] .Zero MOV PC, R14
這不是一個很好的例子,但你可以構想如何更好的去條件執(zhí)行而不是分支。另一方面,如果你有大段的代碼或者你的代碼使用狀態(tài)標志,那么你可以使用條件執(zhí)行來實現(xiàn)各類分支: 這樣一個單一的簡單條件執(zhí)行指令可以替代在其他處理器中存在的所有這些分支和跳轉指令。
OPT 1 ADR R1, #&70 LDR R0, [R1] CMP R0, #0 STRNE R0, [R1, #2] MOV PC, R14
BL : 帶連接的分支
(Branch withLink)
BL{條件} <地址>
BL是另一個分支指令。就在分支之前,在寄存器 14 中裝載上 R15 的內容。你可以重新裝載 R14 到 R15 中來返回到在這個分支之后的那個指令,它是子例程的一個基本但強力的實現(xiàn)。它的作用在屏幕裝載器 2 (例子 4)中得以很好的展現(xiàn)...
.load_new_format BL switch_screen_mode BL get_screen_info BL load_palette .new_loop MOV R1, R5 BL read_byte CMP R0, #255 BLEQ read_loop STRB R0, [R2, #1]!
評論