在 ARM 汇编中,BL 指令正确地将我链接回初始例程,但显示的地址总是不正确
In ARM assembly, BL instruction rightly links me back to initial routine but the address shown is always incorrect
运行 在 TM4C1233H6PM 的 Keil 上以 THUMB 模式初始化后的代码:
1) loop1
2) BL loop2
3) MOV R3, #3
4) loop2
5) PUSH {LR}
6) POP {PC}
第 (2) 行将我带到循环 2 并将 0x00000381 存储到 LR,但在第 (6) 行将堆栈弹出到 PC 后,PC 中存储了 0x00000380,这正是第 (3) 行的地址).
为什么 PC 取的是 0x00000380 而实际上 0x00000381 被压入堆栈并弹出堆栈?
一些 ARM Cortex-M 处理器可以执行 Thumb2 代码或原始 ARM 代码,其中所有指令都是 32 位的。因此,当从子程序 returning 时,处理器需要知道它要 returning 到哪种代码。如果 return 地址的 LSB 设置为 1,则处理器知道它正在 returning 到 Thumb2 代码。
注意实际指令必须是半字对齐的,所以真正的分支目标地址必须有一个LSB为0。在检查LSB以查看要执行的代码类型之后,处理器强制LSB为0之前实际获取指令。
运行 在 TM4C1233H6PM 的 Keil 上以 THUMB 模式初始化后的代码:
1) loop1
2) BL loop2
3) MOV R3, #3
4) loop2
5) PUSH {LR}
6) POP {PC}
第 (2) 行将我带到循环 2 并将 0x00000381 存储到 LR,但在第 (6) 行将堆栈弹出到 PC 后,PC 中存储了 0x00000380,这正是第 (3) 行的地址).
为什么 PC 取的是 0x00000380 而实际上 0x00000381 被压入堆栈并弹出堆栈?
一些 ARM Cortex-M 处理器可以执行 Thumb2 代码或原始 ARM 代码,其中所有指令都是 32 位的。因此,当从子程序 returning 时,处理器需要知道它要 returning 到哪种代码。如果 return 地址的 LSB 设置为 1,则处理器知道它正在 returning 到 Thumb2 代码。
注意实际指令必须是半字对齐的,所以真正的分支目标地址必须有一个LSB为0。在检查LSB以查看要执行的代码类型之后,处理器强制LSB为0之前实际获取指令。