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

做网站用什么开发工具可以推广的软件

做网站用什么开发工具,可以推广的软件,太原网站建设方案托管,直播网站 咋做大概意思就是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.w-s-a.com/news/911154/

相关文章:

  • 企业网站设计代码丹东seo排名公司
  • 企业网站建设定制开发服务网站建设说课ppt
  • 大连市城乡建设局网站网站免费网站入口
  • 做暧网站网站备案ps
  • 知名网站建设公司电话长子网站建设
  • 网站建设的意义与目的建立什么船籍港
  • 广州注册公司营业执照网站建设代码优化
  • 百度网站官网马克互联网主题 wordpress
  • 网站制作 客户刁难深圳自助建站
  • 怎么去推广一个网站广东餐饮品牌设计
  • 网站代码加密了怎么做兰州最新大事
  • 现在ui做的比较好的网站去年做啥网站致富
  • 广东网站建设咨询电话好牌子网
  • 公司怎样制作网站南阳网站关键词
  • 营销型网站建设与网盟完整php网站开发
  • 网站做微信链接怎么做的石桥铺网站建设公司
  • 济南mip网站建设公司做图书馆网站模板
  • app 门户网站网站项目框架
  • 做网站视频网站备案 新闻审批号
  • 织梦网站怎么居中视频网站开发与制作
  • 网站上海备案佛山网站seo哪家好
  • 品牌形象网站有哪些珠海市区工商年报在哪个网站做
  • 注册域名不建设网站seo外包服务方案
  • 如何进行外贸网站建设wordpress文章输入密码可见
  • 政务网站建设索引常州做网站信息
  • 南宁做网站找哪家好wordpress 更改首页
  • 一个人在家做网站建设品牌策划流程
  • 小网站广告投放wordpress页面添加js
  • 仿制别人的竞价网站做竞价犯法吗wordpress添加版块
  • wordpress主题 站长互联网站备案表