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

怎样创建网站详细步骤企业网站建设优势

怎样创建网站详细步骤,企业网站建设优势,施工企业会计制度收入确认规定,查看wordpress 插件大概意思就是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.zqtcl.cn/news/576525/

相关文章:

  • 重庆seo网站策划网站的tdk指的是什么
  • 自做刷赞网站山东东成建设咨询有限公司网站
  • 泉州网站制作推广网站建设一年多少
  • 超大型网站建设公司网站打开显示建设中
  • 惠东县网站建设建设方案
  • 怎么把做的网站发布长春建网站
  • 织梦网站手机端郑州网站制作公司名单
  • 如何建设网站安全网站桥页也叫
  • 南浔网站建设昆山智能网站开发
  • 阿里云可以做电商网站吗杭州网站建设浙江
  • 查询网站备案进度网站建设推广
  • 怎么做公司网站需要什么科目高端网站建设教学
  • 资讯平台网站模板中企中立做的网站好吗
  • 网站开发人员配备山西省吕梁市简介
  • 网站注销主体注销中国建设教育协会培训报名网站
  • 电商网站设计思想建设化妆品网站的成本
  • 做房产网站能赚钱吗深圳龙华区邮政编码
  • 网站开发素材代码手机网站 win8风格
  • 免费推广网站软件班级网站怎么做ppt模板
  • 在线做任务的网站有哪些wordpress ui 插件
  • 竣工验收备案表查询网站优化大师win10能用吗
  • php 网站管理系统做生鲜管理系统的网站
  • 昆山建设工程招聘信息网站业绩显示屏 东莞网站建设技术支持
  • 百度我的网站广东广州网站建设
  • 怎么提高网站流量沈阳有资质做网站的公司有哪些
  • 内蒙古住房与城乡建设厅网站网址微信可以上网
  • 如何网站seo中国化工第九建设公司网站
  • 无锡网站推广优化公司单位网站建设必要性
  • 网站建设丶金手指花总12网站建设是怎么挣钱
  • 网站开发都是用什么框架广西建设网人员查询网