小编典典
您应该能够使用ARM编译器工具链中的__current_pc()内在函数来确定PC
(ARM编译器支持许多与GCC相同的扩展)。*这是ARM特有的:
int main () {
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
return 0;
}
*感谢FrankH。指出存在__current_pc()
通常,PC在函数调用中被保存为返回地址。在具有GCC的非ARM linux系统上,您可以调用__builtin_return_address(0)以获取当前函数调用上下文的返回地址。以这种方式获得程序计数器会增加添加函数调用的代价,但是避免了内联汇编,因此该技术可移植到GCC支持的任何系统中。
void * get_pc () { return __builtin_return_address(0); }
int main () {
printf("%p\n", get_pc());
printf("%p\n", get_pc());
printf("%p\n", get_pc());
return 0;
}
当我在x86系统上运行上述程序时,它将产生输出:
0x8048432
0x8048447
0x804845c
在拆卸时gdb:
Dump of assembler code for function main:
0x08048424 : push %ebp
0x08048425 : mov %esp,%ebp
0x08048427 : and $0xfffffff0,%esp
0x0804842a : sub $0x10,%esp
0x0804842d : call 0x804841c
0x08048432 : mov %eax,0x4(%esp)
0x08048436 : movl $0x8048510,(%esp)
0x0804843d : call 0x80482f0
0x08048442 : call 0x804841c
0x08048447 : mov %eax,0x4(%esp)
0x0804844b : movl $0x8048510,(%esp)
0x08048452 : call 0x80482f0
0x08048457 : call 0x804841c
0x0804845c : mov %eax,0x4(%esp)
0x08048460 : movl $0x8048510,(%esp)
0x08048467 : call 0x80482f0
0x0804846c : mov $0x0,%eax
0x08048471 : leave
0x08048472 : ret
End of assembler dump.
2020-06-03