第1天-ARM汇编指令
B : 分支
(Branch)
B{条件} <地址>
B是最简略的分支。一旦遇到一个B指令,ARM 处理器将当即跳转到给定的地址,从那里持续履行。留意存储在分支指令中的实践的值是相对当时的 R15 的值的一个偏移量;而不是一个肯定地址。它的值由汇编器来核算,它是 24 位有符号数,左移两位后有符号扩展为 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
这不是一个很好的比如,但你能够设想怎么更好的去条件履行而不是分支。另一方面,假如你有大段的代码或许你的代码运用状况标志,那么你能够运用条件履行来完成各类分支: 这样一个单一的简略条件履行指令能够代替在其他处理器中存在的所有这些分支和跳转指令。
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 中来返回到在这个分支之后的那个指令,它是子例程的一个根本但强力的完成。它的作用在屏幕装载器 2 (比如 4)中得以很好的展示…
.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]!