日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux程序计数器,如何在C中打印程序计数器的确切值

發布時間:2023/11/27 linux 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux程序计数器,如何在C中打印程序计数器的确切值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小編典典

您應該能夠使用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

總結

以上是生活随笔為你收集整理的linux程序计数器,如何在C中打印程序计数器的确切值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:linux程序计数器,如何在C中打印程序计数器的确切值