我需要有人详细解释以下说明:
.text:000084AC PUSH {R3,LR}
.text:000084AE LDR R0, =0x111C
.text:000084B0 ADD R0, PC
.text:000084B2 BL sub_9354
.text:000084B6 MOVS R0, #1
.text:000084B8 POP {R3,PC}
答案 0 :(得分:1)
这组特定的指令代表主程序集中的子程序。让我们逐一理解每条指令:
.text:000084AC PUSH {R3,LR}
PUSH <register_list>
Register_list可以来自r0-r7和LR。 PUSH
在Thumb状态下将多个寄存器推送到堆栈。
PUSH
- 将注册推送到堆栈
在外行术语中,您可以说&#34;输入子程序&#34;
.text:000084AE LDR R0,= 0x111C
LDR
- 从内存中加载寄存器
LDR rd, =numeric constant
LDR R0, =0x111C => generate LDR R0, #0x111c
ADD R0,PC
ADD op{S}{cond} {Rd,} Rn, Operand2
这里在你的情况下省略Rd,所以Rd = Rn。所以
R0=Program counter + R0
.text:000084B2 BL sub_9354
带分支的分支(BL)将旧PC写入当前银行的链接寄存器(R14)。
B{L}{cond} <expression>
是目的地。汇编程序计算偏移量。
BL - 带链接的分支
该指令强制程序计数器pc
指向新地址
MOVS R0,#1
MOV<opcode>{cond}{S} Rd,<Op2>
MOV
移动寄存器或常量
如果存在S(暗示CMP,CMN,TEQ, TST)然后将常数1移动到R0
POP {R3,PC}
POP
- 从堆栈中弹出寄存器
在外行术语中,您可以说&#34;从子程序返回&#34;。
返回时,R3将从堆栈中弹出,并将返回地址加载到pc中。这从子程序返回。 参考来自