逆向-beginners之浮点数结构体

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <memory.h>

struct float_as_struct
{
    unsigned int fraction:23;     /* 小数 */
    unsigned int exponent:8;    /* 指数 + 0x3FF */
    unsigned int sign:1;        /* 符号 */
};

float f(float _in)
{
    float f = _in;
    struct float_as_struct t;

    assert(sizeof(struct float_as_struct) == sizeof(float));

    memcpy(&t, &f, sizeof(float));

    t.sign = 1; /* set negative sign */
    t.exponent = t.exponent+2; /* multiply d by 2^n (n here is 2) */

    memcpy(&f, &t, sizeof(float));

    return f;
}

void main()
{
    printf("%f\n", f(1.234));
}


#if 0
/*
 * intel
 */
0000000000001169 <f>:
    1169:    f3 0f 1e fa              endbr64                        // rsp=0x7fffffffe138    rbp=0x7fffffffe140
    116d:    55                       push   %rbp                    // rsp=0x7fffffffe130    rbp=0x7fffffffe140
    116e:    48 89 e5                 mov    %rsp,%rbp            // rsp=0x7fffffffe130    rbp=0x7fffffffe130
    1171:    48 83 ec 20              sub    $0x20,%rsp            // rsp=0x7fffffffe110    rbp=0x7fffffffe130
    1175:    f3 0f 11 45 ec           movss  %xmm0,-0x14(%rbp)    // (rbp-0x14)=0x7fffffffe11c:0x3f9df3b6
    117a:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax        // rax=0xb61168defb9cf400
    1181:    00 00 
    1183:    48 89 45 f8              mov    %rax,-0x8(%rbp)        // (rbp-0x8)=0x7fffffffe128: 0xb61168defb9cf400
    1187:    31 c0                    xor    %eax,%eax
    1189:    f3 0f 10 45 ec           movss  -0x14(%rbp),%xmm0    // xmm0=0x3f9df3b6
    118e:    f3 0f 11 45 f0           movss  %xmm0,-0x10(%rbp)    // (rbp-0x10)=0x7fffffffe120: 0x000000003f9df3b6
    1193:    8b 45 f0                 mov    -0x10(%rbp),%eax        // eax=0x3f9df3b6
    1196:    89 45 f4                 mov    %eax,-0xc(%rbp)        // (rbp-0xc)=0x7fffffffe124: 0xfb9cf4003f9df3b6
    1199:    0f b6 45 f7              movzbl -0x9(%rbp),%eax        // eax=0x3f    rbp-0x9=0x7fffffffe127 x/10b $rbp-0xc 0x7fffffffe124: 0xb6    0xf3    0x9d    0x3f    0x00    0xf4    0x9c    0xfb
    119d:    83 c8 80                 or     $0xffffff80,%eax        // eax=0xffffffbf
    11a0:    88 45 f7                 mov    %al,-0x9(%rbp)        // (rbp-0x9)=0x7fffffffe127: 0xbf    al=0xbf
    11a3:    0f b7 45 f6              movzwl -0xa(%rbp),%eax        // eax=0xbf9d    (rbp-0xa)=0x7fffffffe126: 0x9d
    11a7:    66 c1 e8 07              shr    $0x7,%ax                // ax=0x17f
    11ab:    80 e4 ff                 and    $0xff,%ah            // ah=0x1
    11ae:    83 c0 02                 add    $0x2,%eax            // eax=0x181
    11b1:    0f b6 c0                 movzbl %al,%eax                // eax=0x81    al=0x81
    11b4:    c1 e0 07                 shl    $0x7,%eax            // eax=0x4080
    11b7:    89 c2                    mov    %eax,%edx            // edx=0x4080
    11b9:    0f b7 45 f6              movzwl -0xa(%rbp),%eax        // eax=0xbf9d
    11bd:    66 25 7f 80              and    $0x807f,%ax            // ax=0x801d
    11c1:    09 d0                    or     %edx,%eax            // eax=0xc09d
    11c3:    66 89 45 f6              mov    %ax,-0xa(%rbp)        // (rbp-0xa)=0x7fffffffe126: 0x9d    ax=0xc09d
    11c7:    8b 45 f4                 mov    -0xc(%rbp),%eax        // eax=0xc09df3b6    $rbp-0xc=0x7fffffffe124: 0xfb9cf400c09df3b6
    11ca:    89 45 f0                 mov    %eax,-0x10(%rbp)        // (rbp-0x10)=0x7fffffffe120: 0xc09df3b6c09df3b6    eax=0xc09df3b6
    11cd:    f3 0f 10 45 f0           movss  -0x10(%rbp),%xmm0    // xmm0=0xc09df3b6
    11d2:    48 8b 45 f8              mov    -0x8(%rbp),%rax        // rax=0xb61168defb9cf400    (rbp-0x8)=0x7fffffffe128: 0xb61168defb9cf400
    11d6:    64 48 33 04 25 28 00     xor    %fs:0x28,%rax
    11dd:    00 00 
    11df:    74 05                    je     11e6 <f+0x7d>
    11e1:    e8 7a fe ff ff           callq  1060 <__stack_chk_fail@plt>
    11e6:    c9                       leaveq 
    11e7:    c3                       retq   

00000000000011e8 <main>:
    11e8:    f3 0f 1e fa              endbr64                // rsp=0x7fffffffe148    rbp=0
    11ec:    55                       push   %rbp            // rsp=0x7fffffffe140
    11ed:    48 89 e5                 mov    %rsp,%rbp    // rbp=0x7fffffffe140
    11f0:    f3 0f 10 05 10 0e 00     movss  0xe10(%rip),%xmm0        # 2008 <_IO_stdin_used+0x8>    xmm0=0x3f9df3b6=1.2339999675750732
    11f7:    00 
    11f8:    e8 6c ff ff ff           callq  1169 <f>        // rsp=0x7fffffffe138    rbp=0x7fffffffe140
    11fd:    f3 0f 5a c0              cvtss2sd %xmm0,%xmm0    // xmm0=0xc013be76c0000000
    1201:    48 8d 3d fc 0d 00 00     lea    0xdfc(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    1208:    b8 01 00 00 00           mov    $0x1,%eax
    120d:    e8 5e fe ff ff           callq  1070 <printf@plt>        // -4.936000
    1212:    90                       nop
    1213:    5d                       pop    %rbp
    1214:    c3                       retq   
    1215:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
    121c:    00 00 00 
    121f:    90                       nop

/*
 * arm
 */
000000000040055c <f>:
  40055c:    d10083ff     sub    sp, sp, #0x20
  400560:    bd000fe0     str    s0, [sp, #12]
  400564:    bd400fe0     ldr    s0, [sp, #12]
  400568:    bd001fe0     str    s0, [sp, #28]
  40056c:    b9401fe0     ldr    w0, [sp, #28]
  400570:    b9001be0     str    w0, [sp, #24]
  400574:    39406fe0     ldrb    w0, [sp, #27]
  400578:    32196000     orr    w0, w0, #0xffffff80
  40057c:    39006fe0     strb    w0, [sp, #27]
  400580:    794037e0     ldrh    w0, [sp, #26]
  400584:    d3473800     ubfx    x0, x0, #7, #8
  400588:    12001c00     and    w0, w0, #0xff
  40058c:    11000800     add    w0, w0, #0x2
  400590:    12001c01     and    w1, w0, #0xff
  400594:    794037e0     ldrh    w0, [sp, #26]
  400598:    33191c20     bfi    w0, w1, #7, #8
  40059c:    790037e0     strh    w0, [sp, #26]
  4005a0:    b9401be0     ldr    w0, [sp, #24]
  4005a4:    b9001fe0     str    w0, [sp, #28]
  4005a8:    bd401fe0     ldr    s0, [sp, #28]
  4005ac:    910083ff     add    sp, sp, #0x20
  4005b0:    d65f03c0     ret

00000000004005b4 <main>:
  4005b4:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  4005b8:    910003fd     mov    x29, sp
  4005bc:    529e76c0     mov    w0, #0xf3b6                    // #62390
  4005c0:    72a7f3a0     movk    w0, #0x3f9d, lsl #16
  4005c4:    1e270000     fmov    s0, w0
  4005c8:    97ffffe5     bl    40055c <f>
  4005cc:    1e22c000     fcvt    d0, s0
  4005d0:    90000000     adrp    x0, 400000 <_init-0x3e8>
  4005d4:    911a6000     add    x0, x0, #0x698
  4005d8:    97ffff9e     bl    400450 <printf@plt>
  4005dc:    d503201f     nop
  4005e0:    a8c17bfd     ldp    x29, x30, [sp], #16
  4005e4:    d65f03c0     ret


#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我是一名AI语言模型,无法进行安装操作。但是,我可以提供一些安装ROS Academy for Beginners的指导: 1. 首先,确保你的计算机已经安装了ROS(Robot Operating System)。 2. 在终端中输入以下命令,下载ROS Academy for Beginners: ``` git clone https://github.com/qboticslabs/ros-academy-for-beginners.git ``` 3. 进入下载的文件夹: ``` cd ros-academy-for-beginners ``` 4. 运行安装脚本: ``` ./install.sh ``` 5. 安装完成后,你可以在终端中输入以下命令,启动ROS Academy for Beginners: ``` roslaunch academy academy.launch ``` 希望这些指导能够帮助你安装ROS Academy for Beginners。如果你遇到了任何问题,可以在ROS社区中寻求帮助。 ### 回答2: 首先,安装ROS的前提是已经安装好了Ubuntu操作系统,推荐使用Ubuntu 18.04。可以从Ubuntu的官网上下载系统镜像并且安装。 其次,在安装ROS之前,需要先添加ROS的软件源,这里以Melodic版本为例。打开终端,输入以下命令,添加ROS的软件源: ``` sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 由于ROS的安装需要与ubuntu操作系统的软件进行整合,为了确保最佳匹配,需要先运行以下命令进行更新: ``` sudo apt update sudo apt upgrade ``` 然后是ROS的安装,运行以下命令: ``` sudo apt install ros-melodic-desktop-full ``` 该命令会安装ROS桌面完整版,其中包含许多常用的软件包和工具。安装完成后,可以通过以下命令检查ROS的版本: ``` rosversion -d ``` 接下来,还需配置ROS环境变量。在终端中输入: ``` echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc ``` 安装ROS的最后一步是安装ROS初始工作区(catkin工作区)。打开终端,输入以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 这个命令创建一个名为catkin_ws的文件夹,并在其中创建一个src文件夹,用于存放ROS软件包源代码。 最后,我们可以安装ros-academy-for-beginners这个包,这个包可以用于学习ROS的基础知识,包括ROS的概念、练习和示例等等。在终端输入以下命令: ``` cd ~/catkin_ws/src git clone https://github.com/OTL/ros-academy-for-beginners.git cd ~/catkin_ws catkin_make ``` 至此,ros-academy-for-beginners的安装就完成了。如果想要使用该软件包内的示例和练习程序,可以查看ros-academy-for-beginners中的README文件,然后通过以下命令运行: ``` roslaunch ros_academy_publisher publisher.launch ``` ### 回答3: ROS(机器人操作系统)是一种流行的开源软件框架,它可以帮助开发人员为机器人软件构建底层、中间层、以及可视化的应用程序。ROS Academy for Beginners是一个为初学者提供ROS学习和实践的平台,这个平台包含了一系列的教程,如基础知识、机器人操作、感知和导航等。 在安装ROS Academy for Beginners之前,首先需要准备以下工具: 1. 一个ROS Kinetic(或更高版本)的Ubuntu操作系统。 2. 一个支持VirtualBox或VMware的虚拟机管理软件。 3. 一个ROS学习环境的Ubuntu虚拟机镜像文件。 下面是安装ROS Academy for Beginners的步骤: 1. 在VirtualBox(或其他虚拟机软件)中创建一台新的虚拟机。请确保选择Ubuntu x64的版本。 2. 启动Ubuntu虚拟机,并使用管理员权限运行Terminal。 3. 输入以下命令,添加ROS Kinetic的存储库以及密钥: $ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' $ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 4. 更新存储库并安装ROS Kinetic Desktop Full: $ sudo apt-get update $ sudo apt-get install ros-kinetic-desktop-full 5. 安装ROS依赖项: $ sudo apt-get install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential 6. 初始化rosdep: $ sudo rosdep init $ rosdep update 7. 设置ROS环境变量: $ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc $ source ~/.bashrc 8. 下载ROS Academy for Beginners虚拟机镜像: $ wget https://s3-us-west-2.amazonaws.com/ros-academy/ROS-Academy-For-Beginners.ova 9. 启动VirtualBox软件,选择“File” -> “Import Appliance”,并选择已下载的ROS Academy for Beginners虚拟机镜像文件。 10. 等待虚拟机导入完成后,启动ROS Academy for Beginners虚拟机,并按照教程开始学习ROS! 希望这些步骤可以帮助您安装ROS Academy for Beginners。如果您在安装过程中遇到任何问题,请参考ROS官方文档或社区论坛,寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值