|
本帖最后由 lzwml 于 2014-10-20 17:07 编辑
貌似弄出来了,但是有疑问
- .global _where_pc
- _where_pc:
- mov r0,pc
- mov pc, lr
复制代码
连续两次调用_where_pc函数返回值都是一样的???PC指针不是应该递增吗?
输出:
addr 0x30000198
addr 0x30000198
- extern int _where_pc();
- addr = _where_pc();
- printf("addr 0x%8.8x\n",addr);
- addr = _where_pc();
- printf("addr 0x%8.8x\n",addr);
复制代码
查看反汇编查看0x30000198的位置,
- 30000050 <irq>:
- irq:
- sub lr, lr, #4 @ 计算返回地址
- 30000050: e24ee004 sub lr, lr, #4 ; 0x4
- stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
- 30000054: e92d5fff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
- @ 注意,此时的sp是中断模式的sp
- @ 初始值是上面设置的3072
- ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址
- 30000058: e59fe138 ldr lr, [pc, #312] ; 【30000198<.text+0x198>】地址在这里
- ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中
- 3000005c: e59ff138 ldr pc, [pc, #312] ; 3000019c <.text+0x19c>
复制代码 |
|