如何打印C代码中指定指令的运行时地址以在反汇编中快速定位
实现方法
你可以通过以下两种常用方案打印目标指令的运行时地址,打印后直接在反汇编结果中搜索对应十六进制地址即可快速定位:
方案1:标签地址法(兼容性最高,支持GCC、Clang、ARMCC等多数编译器)
在目标指令的上一行插入自定义标签,通过编译器扩展语法直接取标签对应的指令地址,修改代码如下:
// force driver reset spi_control_mark: SPIdrv->Control( DD_SPI_MODE_INACTIVE, 0); // 打印标签对应地址,即目标指令的运行时地址 printf("Target instruction address: %p\n", &&spi_control_mark); printf("...SPIdrv->Control( DD_SPI_MODE_INACTIVE, 0)...\n");
说明:
&&标签名是GCC体系支持的标签地址获取语法,返回值为标签所在位置的程序计数器(PC)值,恰好对应后续第一条指令的内存地址。
方案2:内置PC获取函数(适用于不支持标签地址语法的编译器)
在目标指令前直接调用编译器内置的程序计数器读取函数获取当前地址:
// force driver reset // ARM架构可直接用__current_pc(),其他架构替换为对应内置函数即可 void *current_pc = (void*)__current_pc(); printf("Target instruction address: %p\n", current_pc); SPIdrv->Control( DD_SPI_MODE_INACTIVE, 0);
拿到打印的地址后,直接在反汇编文件中搜索该十六进制值,就能立刻定位到这条Control调用对应的汇编代码段。
内容的提问来源于stack exchange,提问作者Dooraim
相关产品推荐
相关产品推荐

