逆向-beginners之float联合体

#include <stdio.h>
#include <stdint.h>

union uint_float
{
    unsigned int i;
    float f;
};

float calculate_machine_epsilon(float start)
{
    union uint_float v;

    v.f = start;
    v.i++;

    return v.f - start;
}

int main()
{
    printf("%f\n", calculate_machine_epsilon(1.0));

    return 0;
}

#if 0
/*
 * intel
 */
0000000000001149 <calculate_machine_epsilon>:
    1149:    f3 0f 1e fa              endbr64 
    114d:    55                       push   %rbp
    114e:    48 89 e5                 mov    %rsp,%rbp
    1151:    f3 0f 11 45 ec           movss  %xmm0,-0x14(%rbp)        // (rbp-0x14)=0x3f800000
    1156:    f3 0f 10 45 ec           movss  -0x14(%rbp),%xmm0        // xmm0=0x3f800000
    115b:    f3 0f 11 45 fc           movss  %xmm0,-0x4(%rbp)            // (rbp-0x4)=0x3f800000
    1160:    8b 45 fc                 mov    -0x4(%rbp),%eax            // eax=0x3f800000
    1163:    83 c0 01                 add    $0x1,%eax                // eax=0x3f800001
    1166:    89 45 fc                 mov    %eax,-0x4(%rbp)            // (rbp-0x4)=0x3f800001
    1169:    f3 0f 10 45 fc           movss  -0x4(%rbp),%xmm0            // xmm0=0x3f800001
    116e:    f3 0f 5c 45 ec           subss  -0x14(%rbp),%xmm0        // 0x3f800001-0x3f800000=0x34000000    --> 
                                                                    // 1.0000001192092896 - 1.0 = 1.1920928955078125e-7
    1173:    5d                       pop    %rbp
    1174:    c3                       retq   

0000000000001175 <main>:
    1175:    f3 0f 1e fa              endbr64 
    1179:    55                       push   %rbp
    117a:    48 89 e5                 mov    %rsp,%rbp
    117d:    f3 0f 10 05 83 0e 00     movss  0xe83(%rip),%xmm0        # 2008 <_IO_stdin_used+0x8>    // xmm0=0x3f800000=1.0
    1184:    00 
    1185:    e8 bf ff ff ff           callq  1149 <calculate_machine_epsilon>
    118a:    f3 0f 5a c0              cvtss2sd %xmm0,%xmm0            // xmm0=0x3e80000000000000
    118e:    48 8d 3d 6f 0e 00 00     lea    0xe6f(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    1195:    b8 01 00 00 00           mov    $0x1,%eax
    119a:    e8 b1 fe ff ff           callq  1050 <printf@plt>        // 0.000000
    119f:    b8 00 00 00 00           mov    $0x0,%eax
    11a4:    5d                       pop    %rbp
    11a5:    c3                       retq   
    11a6:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
    11ad:    00 00 00 

/*
 * arm
 */
000000000040055c <calculate_machine_epsilon>:
  40055c:    d10083ff     sub    sp, sp, #0x20
  400560:    bd000fe0     str    s0, [sp, #12]
  400564:    bd400fe0     ldr    s0, [sp, #12]
  400568:    bd001be0     str    s0, [sp, #24]
  40056c:    b9401be0     ldr    w0, [sp, #24]
  400570:    11000400     add    w0, w0, #0x1
  400574:    b9001be0     str    w0, [sp, #24]
  400578:    bd401be1     ldr    s1, [sp, #24]
  40057c:    bd400fe0     ldr    s0, [sp, #12]
  400580:    1e203820     fsub    s0, s1, s0
  400584:    910083ff     add    sp, sp, #0x20
  400588:    d65f03c0     ret

000000000040058c <main>:
  40058c:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400590:    910003fd     mov    x29, sp
  400594:    1e2e1000     fmov    s0, #1.000000000000000000e+00
  400598:    97fffff1     bl    40055c <calculate_machine_epsilon>
  40059c:    1e22c000     fcvt    d0, s0
  4005a0:    90000000     adrp    x0, 400000 <_init-0x3e8>
  4005a4:    9119a000     add    x0, x0, #0x668
  4005a8:    97ffffaa     bl    400450 <printf@plt>
  4005ac:    52800000     mov    w0, #0x0                       // #0
  4005b0:    a8c17bfd     ldp    x29, x30, [sp], #16
  4005b4:    d65f03c0     ret


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值