亿网行网站建设114企业网,网站页面做成自适应优缺点,网站建设技术员,模板建站广团#x1f3c6;本文收录于「Bug调优」专栏#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案#xff0c;希望能够助你一臂之力#xff0c;帮你早日登顶实现财富自由#x1f680;#xff1b;同时#xff0c;欢迎大家关注收藏… 本文收录于「Bug调优」专栏主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案希望能够助你一臂之力帮你早日登顶实现财富自由同时欢迎大家关注收藏订阅持续更新中upupup 问题描述 我在解二进制炸弹第四阶段的递归时对主函数中的片段的理解如下
8bc4: e3530002 cmp r3, #2
8bc8: 1a000005 bne 8be4 phase_40x50
........
8be4: eb000275 bl 95c0 explode_bomb输入的第一个数必须是2否则会爆炸 8bcc: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 8bd0: e3530002 cmp r3, #28bd4: da000002 ble 8be4 phase_40x50 第二个数要大于等于28bd8: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec8bdc: e3530007 cmp r3, #7 第二个数要小于78be0: da000000 ble 8be8 phase_40x548be4: eb000275 bl 95c0 explode_bomb
第二个数必须在[2,7)之间但是输入了所有组合后却没有能成功的请问是我的这个思路错了吗
是我对fp的理解错了吗我认为fp-8是输入的第一个数fp-20输入的是第二个数附上完整的phase_4以及递归函数func4
00008b10 func4:8b10: e92d4810 push {r4, fp, lr}8b14: e28db008 add fp, sp, #88b18: e24dd00c sub sp, sp, #128b1c: e50b0010 str r0, [fp, #-16]8b20: e50b1014 str r1, [fp, #-20] ; 0xffffffec8b24: e51b3010 ldr r3, [fp, #-16]8b28: e3530000 cmp r3, #08b2c: ca000001 bgt 8b38 func40x288b30: e3a03000 mov r3, #08b34: ea000013 b 8b88 func40x78 r3小于等于0时8b38: e51b3010 ldr r3, [fp, #-16] r3大于0 将r3传入[fp-16]8b3c: e3530001 cmp r3, #1 r3与1进行比较8b40: 1a000001 bne 8b4c func40x3c8b44: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 等于1将r3传入[fp-20]return8b48: ea00000e b 8b88 func40x78 8b4c: e51b3010 ldr r3, [fp, #-16]8b50: e2433001 sub r3, r3, #18b54: e1a00003 mov r0, r38b58: e51b1014 ldr r1, [fp, #-20] ; 0xffffffec8b5c: ebffffeb bl 8b10 func48b60: e1a02000 mov r2, r08b64: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec8b68: e0824003 add r4, r2, r38b6c: e51b3010 ldr r3, [fp, #-16]8b70: e2433002 sub r3, r3, #28b74: e1a00003 mov r0, r38b78: e51b1014 ldr r1, [fp, #-20] ; 0xffffffec8b7c: ebffffe3 bl 8b10 func48b80: e1a03000 mov r3, r08b84: e0843003 add r3, r4, r38b88: e1a00003 mov r0, r38b8c: e24bd008 sub sp, fp, #88b90: e8bd8810 pop {r4, fp, pc}00008b94 phase_4:8b94: e92d4800 push {fp, lr}8b98: e28db004 add fp, sp, #48b9c: e24dd020 sub sp, sp, #328ba0: e50b0020 str r0, [fp, #-32] ; 0xffffffe08ba4: e51b0020 ldr r0, [fp, #-32] ; 0xffffffe08ba8: e59f1074 ldr r1, [pc, #116] ; 8c24 phase_40x90 “%d %d”8bac: e24b2018 sub r2, fp, #248bb0: e24b3014 sub r3, fp, #208bb4: ebfffe92 bl 8604 _init0x50 ; 8604: e28fc600 add ip, pc, #0, 128bb8: e1a03000 mov r3, r08bbc: e50b3008 str r3, [fp, #-8]8bc0: e51b3008 ldr r3, [fp, #-8]8bc4: e3530002 cmp r3, #28bc8: 1a000005 bne 8be4 phase_40x508bcc: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 8bd0: e3530002 cmp r3, #28bd4: da000002 ble 8be4 phase_40x50 第二个数要大于等于28bd8: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec8bdc: e3530007 cmp r3, #7 第二个数要小于78be0: da000000 ble 8be8 phase_40x548be4: eb000275 bl 95c0 explode_bomb8be8: e3a03005 mov r3, #58bec: e50b3010 str r3, [fp, #-16]8bf0: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 取第二个数8bf4: e51b0010 ldr r0, [fp, #-16] ; r058bf8: e1a01003 mov r1, r3 ;r1r38bfc: ebffffc3 bl 8b10 func4 8c00: e1a03000 mov r3, r0 8c04: e50b300c str r3, [fp, #-12] 8c08: e51b3018 ldr r3, [fp, #-24] ; 0xffffffe8 8c0c: e51b200c ldr r2, [fp, #-12] ;r2 [fp, #-12] 8c10: e1520003 cmp r2, r38c14: 0a000000 beq 8c1c phase_40x888c18: eb000268 bl 95c0 explode_bomb8c1c: e24bd004 sub sp, fp, #48c20: e8bd8800 pop {fp, pc}8c24: 000098a0 .word 0x000098a0如上问题有来自我自身项目开发有的收集网站有的来自读者如有侵权立马删除。 解决方案 如下是上述问题的解决方案仅供参考 在ARM汇编语言中fp通常指的是frame pointer帧指针它是一个寄存器用于指向当前栈帧的开始位置。在有的程序中fp可能不是必须的特别是在使用像gcc这样的编译器时可能会优化掉帧指针的使用。 从你提供的代码来看fp被用于访问局部变量。在phase_4函数中fp被设置为指向比栈顶高4个字节的位置e28db004同时栈指针sp被减去32个字节以分配局部变量空间e24dd020。这意味着局部变量可以通过相对于fp的偏移量来访问。 这里是一些关键指令的解释
e51b3014 ldr r3, [fp, #-20]从fp地址减去20字节的位置加载数据到r3寄存器。这通常用于访问函数的参数或局部变量。e3530002 cmp r3, #2比较r3寄存器的值和数字2。 根据你提供的代码phase_4函数首先检查第一个输入参数通过r3寄存器它被加载自[fp, #-20]是否等于2如果不等则调用explode_bomb函数触发炸弹爆炸。 接下来它检查第二个输入参数同样通过r3寄存器再次加载自[fp, #-20]确保它在2到6的范围内不包括7。如果检查失败同样会触发炸弹爆炸。 你的思路关于fp的理解基本是正确的。fp-8可能指向第一个输入参数fp-20指向第二个输入参数。但是你需要注意的是ARM架构中函数参数通常通过寄存器传递而不是通过帧指针的偏移量。这意味着fp-20可能并不是第二个参数的正确偏移这取决于编译器如何安排寄存器和栈帧。 为了解决你的问题你需要正确地识别出哪些寄存器或偏移量用于传递参数并确保你的输入满足所有条件。如果输入了所有可能的组合后仍然失败那么可能存在对代码的误解或者有其他未被注意到的条件。 如果你需要进一步的帮助请提供更多的上下文或详细信息以便更准确地分析和解决问题。 希望能够帮到有需要的你。 PS如若遇到采纳如下方案还是未解决的同学希望不要抱怨急躁毕竟影响因素众多我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴即把你未解决或者产生新Bug黏贴在评论区我们大家一起来努力一起帮你看看可以不咯。 若有对当前Bug有与如下提供的方法不一致有个不情之请希望你能把你的新思路或新方法分享到评论区一起学习目的就是帮助更多所需要的同学正所谓「赠人玫瑰手留余香」。 ☀️写在最后 ok以上就是我这期的Bug修复内容啦如果还想查找更多解决方案你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」都是实战中碰到的Bug希望对你有所帮助。到此咱们下期拜拜。 码字不易如果这篇文章对你有所帮助帮忙给bugj菌来个一键三连(关注、点赞、收藏) 您的支持就是我坚持写作分享知识点传播技术的最大动力。 同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 以第一手学习bug菌的首发干货不仅能学习更多技术硬货还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料你想要的我都有 关于我
我是bug菌CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家C站博客之星Top30华为云2023年度十佳博主掘金多年度人气作者Top4051CTO年度博主Top12掘金/InfoQ/51CTO等社区优质创作者全网粉丝合计 20w硬核微信公众号「猿圈奇妙屋」欢迎你的加入免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料你想要的我都有关键是你不来拿。