当前位置: 首页 > news >正文

discuz是什么网站程序互联网小程序开发

discuz是什么网站程序,互联网小程序开发,北京公司网站制作费用,自己有域名怎么做免费网站大概意思就是arm每个函数开始都会将PC、LR、SP以及FP四个寄存器入栈。 下面我们看一下这四个寄存器里面保存的是什么内存 arm-linux-gnueabi-gcc unwind.c -mapcs -w -g -o unwind#xff08;需要加上-mapcs才会严格按照上面说的入栈#xff09; #include stdio.h … 大概意思就是arm每个函数开始都会将PC、LR、SP以及FP四个寄存器入栈。 下面我们看一下这四个寄存器里面保存的是什么内存 arm-linux-gnueabi-gcc unwind.c -mapcs -w -g -o unwind需要加上-mapcs才会严格按照上面说的入栈 #include stdio.h #include stdlib.hstruct stackframe {unsigned long fp;//低地址unsigned long sp;unsigned long lr;unsigned long pc;//高地址 }; void backtrace() {struct stackframe *frame NULL;unsigned long *sp NULL;asm volatile (mov %0, ip : g(sp));//ip里面保存的是还未压栈的spprintf(sp poniter 0x%lx\n, sp);frame (char*)sp - sizeof(struct stackframe);printf(fp 0x%lx, pc 0x%lx, sp 0x%lx\n, frame-fp,frame-pc, frame-sp);//通过打印栈帧里面的sp确实和ip里面的一样的/* 不知道怎么结束循环.... */for (; frame-fp 0xdeadbeef; frame frame-fp - sizeof(struct stackframe) sizeof(unsigned long)) {printf(Function enter at [%08x] from [%08x]\n, frame-pc, frame-lr);} }void f3(int c) {printf(%d\n, c);backtrace(); } void f2(int b) {f3(b); } void f1(int a) {char arr[5] {0};f2(a); }int main(int argc, char *argv[]) {printf(programe %s\n, argv[0]);f1(1);return 0; }arm-linux-gnueabi-objdump -S unwind objdump  void backtrace() {8500: e1a0c00d mov ip, sp8504: e92dd810 push {r4, fp, ip, lr, pc}8508: e24cb004 sub fp, ip, #4850c: e24dd00c sub sp, sp, #12 ......................................000085c0 f3:void f3(int c) {85c0: e1a0c00d mov ip, sp85c4: e92dd800 push {fp, ip, lr, pc}85c8: e24cb004 sub fp, ip, #485cc: e24dd008 sub sp, sp, #8 ........................................85dc: ebffff6b bl 8390 _init0x20backtrace();85e0: ebffffc6 bl 8500 backtrace }85e4: e24bd00c sub sp, fp, #1285e8: e89da800 ldm sp, {fp, sp, pc}85ec: 0000878c .word 0x0000878c000085f0 f2: void f2(int b) {85f0: e1a0c00d mov ip, sp85f4: e92dd800 push {fp, ip, lr, pc}85f8: e24cb004 sub fp, ip, #485fc: e24dd008 sub sp, sp, #88600: e50b0010 str r0, [fp, #-16]f3(b);8604: e51b0010 ldr r0, [fp, #-16]8608: ebffffec bl 85c0 f3 }860c: e24bd00c sub sp, fp, #128610: e89da800 ldm sp, {fp, sp, pc}00008614 f1: void f1(int a) {8614: e1a0c00d mov ip, sp8618: e92dd800 push {fp, ip, lr, pc}861c: e24cb004 sub fp, ip, #48620: e24dd018 sub sp, sp, #24 ..........................................f2(a);8644: e51b0020 ldr r0, [fp, #-32]8648: ebffffe8 bl 85f0 f2 }864c: e59f3018 ldr r3, [pc, #24] ; 866c f10x5800008670 main:int main(int argc, char *argv[]) {8670: e1a0c00d mov ip, sp8674: e92dd800 push {fp, ip, lr, pc}8678: e24cb004 sub fp, ip, #4867c: e24dd008 sub sp, sp, #88680: e50b0010 str r0, [fp, #-16]8684: e50b1014 str r1, [fp, #-20]printf(programe %s\n, argv[0]);8688: e51b3014 ldr r3, [fp, #-20]868c: e5933000 ldr r3, [r3]8690: e59f001c ldr r0, [pc, #28] ; 86b4 main0x448694: e1a01003 mov r1, r38698: ebffff3c bl 8390 _init0x20f1(1);869c: e3a00001 mov r0, #186a0: ebffffdb bl 8614 f1return 0;86a4: e3a03000 mov r3, #0 } 上面是样例代码对应的汇编代码截取。在函数的最开头都存在如下代码 8500: e1a0c00d mov ip, sp8504: e92dd810 push {r4, fp, ip, lr, pc}8508: e24cb004 sub fp, ip, #4 就是文章最开始说的函数一开始都会将fp、sp、lr以及pc压栈。那这几个寄存器里面的内容是什么呢 sp即栈顶指针sp里面记录的是当前函数的栈顶位置并且从汇编代码里面能看到先是将sp给ip然后将ip入栈。因此栈中记录的sp位置是压栈之前的 lr用于保存函数的返回地址若f2调用f3那在样例代码中对应的位置就是这一行8558:    e89da800     ldm    sp, {fp, sp, pc} pc指针程序计数器用于记录当前执行到哪条指令。但是由于ARM采用流水线机制。当正确读取PC时该值为当前指令正在执行的指令地址8个字节。即PC执行当前指令的下两条地址。所以这就解释了样例代码的打印是0000850c void backtrace() {     8500:    e1a0c00d     mov    ip, sp     8504:    e92dd810     push    {r4, fp, ip, lr, pc}//执行到这里时pc里面记录的是下面两条指令     8508:    e24cb004     sub    fp, ip, #4     850c:    e24dd00c     sub    sp, sp, #12 ...................................... 具体可以查看这篇文章 ARM体系结构相关杂记_这个我好像学过的博客-CSDN博客 fp:frame pointer同样也是这段代码。sub    fp, ip, #4// fp ip - 4。那fp其实保存的就是上一个函数的函数栈起始位置-4。这也是for循环里面下一个函数栈需要写为 for (;; frame frame-fp - sizeof(struct stackframe) sizeof(unsigned long)) 即下一个函数栈是fp 4 - 12 为什么是上一个函数栈呢 我们看下面的代码f1调用f2。函数f2最开始压入的fp这个fp寄存器里面记录的是什么值呢。它里面其实就是上一个函数里面的sub    fp, ip, #4得到的啊。ip里面又是上一个函数f1的函数栈开始位置。 000085f0 f2: void f2(int b) {85f0: e1a0c00d mov ip, sp85f4: e92dd800 push {fp, ip, lr, pc}85f8: e24cb004 sub fp, ip, #485fc: e24dd008 sub sp, sp, #88600: e50b0010 str r0, [fp, #-16]f3(b);8604: e51b0010 ldr r0, [fp, #-16]8608: ebffffec bl 85c0 f3 }860c: e24bd00c sub sp, fp, #128610: e89da800 ldm sp, {fp, sp, pc}00008614 f1: void f1(int a) {8614: e1a0c00d mov ip, sp8618: e92dd800 push {fp, ip, lr, pc}861c: e24cb004 sub fp, ip, #48620: e24dd018 sub sp, sp, #24 ..........................................f2(a);8644: e51b0020 ldr r0, [fp, #-32]8648: ebffffe8 bl 85f0 f2 }864c: e59f3018 ldr r3, [pc, #24] ; 866c f10x58 因此最终的函数栈构成了下图所示。那我怎么感觉文章开始的那张图片是错的呢。。。。 最后样例代码运行结果如下图。由于不知道怎么算回溯结束所以程序报错了 另外程序打印出来的地址也会汇编代码吻合.具体可以看汇编信息 另外用arm-linux-gnueabi-addr2line解析出来的行号也是准确的
http://www.yutouwan.com/news/490515/

相关文章:

  • 企业企业网站建设公司注册资金最新规定
  • 做的漂亮的家居网站百度怎么搜索关键词
  • 太原网站设计公司wordpress采集插件中文
  • 网站后台更新怎么做wordpress加速插件
  • 怎么建设境外网站宜昌哪里有做网站的
  • 凡科网站建设wordpress 插件 调用
  • 崇礼网站建设成品网站w灬源码伊甸
  • 河北省建设信息网站网站透明flash
  • 网站整体运营思路资讯类网站模板asp
  • 有自己域名如何做网站长春关键词优化平台
  • 网站建设合同违约责任建设工程信息网评价起评分
  • 河南网站建设报价wordpress网仿站
  • 短租房网站哪家做最好网站推广服务网站连锁
  • 做网站首页布局设计注意事项泰州专业做网站
  • 河北易县建设局官方网站做展馆好的设计网站
  • 网站排版淄博服装网站建设
  • 兖州网站制作t么做文献索引ot网站
  • 网站怎么伪静态网站电子商务网站建设课设网站模板
  • 有好看图片的软件网站模板软件技术学的是什么
  • 国外游戏网站设计北京模板网站建设
  • 新闻类网站开发多久怎样建设网站后台
  • 杭州企业建站程序个人导航网站怎么备案
  • 网站的中英文切换怎么做网站免费的不用下载
  • 网站微信认证费用多少钱国家专业分类目录
  • 网站怎么被黑wordpress 淘宝客 主题
  • 学校特色网站建设情况天津网站设计 河西
  • 自己动手建立个人网站wordpress 文章导航
  • 在电商网站上做推广的技巧龙山县建设局网站
  • wordpress模板 站长哈尔滨的网络科技开发公司
  • 杭州精品课程网站建设宠物网站首页模板