二进制炸弹的fp是什么?

2024-06-23 10:04
文章标签 fp 二进制 炸弹

本文主要是介绍二进制炸弹的fp是什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  我在解二进制炸弹第四阶段的递归时,对主函数中的片段的理解如下:

8bc4:    e3530002     cmp    r3, #2
8bc8:    1a000005     bne    8be4 <phase_4+0x50>
........
8be4:    eb000275     bl    95c0 <explode_bomb>

输入的第一个数必须是2,否则会爆炸

    8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 8bd0:    e3530002     cmp    r3, #28bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于28bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec8bdc:    e3530007     cmp    r3, #7  第二个数要小于78be0:    da000000     ble    8be8 <phase_4+0x54>8be4:    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 <func4+0x28>8b30:    e3a03000     mov    r3, #08b34:    ea000013     b    8b88 <func4+0x78>        r3小于等于0时8b38:    e51b3010     ldr    r3, [fp, #-16]                r3大于0 将r3传入[fp-16]8b3c:    e3530001     cmp    r3, #1                        r3与1进行比较8b40:    1a000001     bne    8b4c <func4+0x3c>8b44:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec        等于1将r3传入[fp-20],return8b48:    ea00000e     b    8b88 <func4+0x78>        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 <func4>8b60:    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 <func4>8b80:    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_4+0x90> “%d %d”8bac:    e24b2018     sub    r2, fp, #248bb0:    e24b3014     sub    r3, fp, #208bb4:    ebfffe92     bl    8604 <_init+0x50>   ; 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_4+0x50>8bcc:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 8bd0:    e3530002     cmp    r3, #28bd4:    da000002     ble    8be4 <phase_4+0x50> 第二个数要大于等于28bd8:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec8bdc:    e3530007     cmp    r3, #7 第二个数要小于78be0:    da000000     ble    8be8 <phase_4+0x54>8be4:    eb000275     bl    95c0 <explode_bomb>8be8:    e3a03005     mov    r3, #58bec:    e50b3010     str    r3, [fp, #-16]8bf0:    e51b3014     ldr    r3, [fp, #-20]    ; 0xffffffec 取第二个数8bf4:    e51b0010     ldr    r0, [fp, #-16]  ; r0=58bf8:    e1a01003     mov    r1, r3        ;r1=r38bfc:    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_4+0x88>8c18:    eb000268     bl    95c0 <explode_bomb>8c1c:    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年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


这篇关于二进制炸弹的fp是什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086847

相关文章

二进制文件转化成文本文件

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~   1.区别 如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇) 如果一

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

剑指Offer—编程题10(二进制中1 的个数)

代码如下,请在JDK7及以上版本运行: public class Test10 {/*** 请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。* 例如把9表示成二进制是1001 ,有2位是1. 因此如果输入9,该出2。** @param n 待的数字* @return 数字中二进制表表的1的数目*/public static int numberOfOne(int

递归实现十进制转二进制

#include<stdio.h>#include<stdlib.h>//输入一个十进制,自己写一个函数转换为二进制//10进制转2进制:方法是除以2取余,逆序排列 //如果想转换为 8进制,则把代码中的2改为8就OK //下面这个是递归!!! void change2(int num)//如果输入num为10 {if(num==0){return ; }else{/* 不能这样写

java字符串在内存和文件中编码的不同——如何理解进制(二进制)与编码(UTF-8)的关系

不管是在内存中,还是文件中,还是网络传输中,计算机运算和存储的都只能是二进制。 内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。 “外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令

C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出

目录 题目 实例 方法一:直接交换 方法二:间接交换 拓展 题目 编写一个函数,将一个无符号整数的所有位逆序(在32位机器下) 实例 例如有一个无符号整数  unsigned int num = 32; unsigned int 在32位系统中占4个字节(32位) 32的二进制数是:       0000 0000 0000 0000 0000 0000  0010

【Rust日报】2021-7-29 与c相比,如何改善Rust巨大的二进制大小?

什么时候去使用#[inline] Reddit上有人问: 我一直在每一个我认为会经常被调用的函数上拼命地写#[inline],但这真的需要吗?inline只是提示编译器该函数可以被内联,而编译器可以忽略这一点或自行决定何时进行内联,所以我应该在什么时候用#[inline]标记我的函数?我正在制作一个使用一些自定义迭代器进行音频处理/合成的crate,我希望这些crate能快速运行。 推介阅读

电影数据集关联分析及FP-Growth实现

(1)数据预处理 我们先对数据集进行观察,其属性为’movieId’         ‘title’ ‘genres’,其中’movieId’为电影的序号,但并不完整,‘title’为电影名称及年份,‘genres’为电影的分类标签。因此电影的分类标签可以作为我们研究此数据集关联分析的文本数据。 我们可以看到电影的分类标签在同一个电影下不只有一个,且用’|’分开,因此我们对数据进行以下

C++ 统计二进制串中0出现的个数

描述 一个32位有符号整数,使用二进制来表示,现在要统计一下二进制串中'0'的个数。 示例1 输入: 11 返回值: 29 说明: 二进制00000000000000000000000000001011中有29位0 class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整

0左边必有1的二进制字符串数量

//0左边必有1的二进制字符串数量public class GetNum{//递归的解法public static int GetNum01(int n){if(n<1){return 0;}return process(1,n);}//递归函数public static int process(int i,int n){if(i==n-1){return 2;}if(i==n){ret