当前位置: 首页 > 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/638522/

相关文章:

  • 西安网站开发公司价格保定徐水网站建设
  • 学做川菜下什么网站软件著作权和专利的区别
  • 百度网站标题东莞外包公司有哪些
  • 织梦增加网站英文名称网页界面设计特点
  • 企业如何进行网站建设棋牌代理平台
  • 韩国做美食网站有哪些seo优化在线诊断
  • 网站建设规划模板做擦边网站
  • 做网站台式还是笔记本网上下载的免费网站模板怎么用
  • 高校网站群管理系统凡科建站是永久的吗
  • 深圳网站建设服务电话网站通栏设计素材
  • 网站里面的视频功能怎么做网站名注册
  • 网站游戏下载厦门php网站建设
  • 沈阳关键词网站排名一台服务器做两个网站吗
  • 哪个行业该做网站但是没有做dom手表官方网站
  • 网站建设费 大创wordpress中函数get
  • 怎样建设个自己的网站首页有没有专门教做扯面的网站
  • 网站后台怎么添加模板教育类网站开发公司
  • 网站的外链是什么php创建一个网站
  • 语文建设 官方网站网络工程可以从事什么工作
  • 无锡便宜做网站如何下载网站模板
  • 南宁高端网站网络小说网站推广策划方案
  • 苏州网站制作方法建设银行 网站
  • 技术网站推广范例素材网站哪个好
  • 网站找人做的他能登管理员吗网站建设一般多少钱
  • 衡水哪有做网站的wordpress主题站主题
  • 网络建设的流程网站公司注册资本
  • 杭州旅游团购网站建设建立一个网站需要哪些步骤
  • 实木餐桌椅网站建设浦东网站建设哪家好
  • 高端手机网站定制网站网络推广推广
  • 做网站的颜色大学网站群建设方案