• 逆向-beginners之浮点数参数传递


    #include <stdio.h>

    /*
     * 在线进制转换
     * https://lostphp.com/hexconvert/
     */

    double f(double a, double b)
    {
        return a / 3.14 + b * 4.1;
    }

    int main()
    {
        printf("%f\n", f(1.2, 3.4));
    }

    #if 0

    /*
     * intel
     */
    0000000000001149 :
        1149:    f3 0f 1e fa              endbr64
        114d:    55                       push   %rbp
        114e:    48 89 e5                 mov    %rsp,%rbp
        1151:    f2 0f 11 45 f8           movsd  %xmm0,-0x8(%rbp)        // rbp-0x8=xmm0=a
        1156:    f2 0f 11 4d f0           movsd  %xmm1,-0x10(%rbp)    // rbp-0x10=xmm1=b
        115b:    f2 0f 10 45 f8           movsd  -0x8(%rbp),%xmm0        // xmm0=rbp-0x8
        1160:    f2 0f 10 0d a8 0e 00     movsd  0xea8(%rip),%xmm1        # 2010 <_IO_stdin_used+0x10> xmm1=rip+0xea8=3.14
        1167:    00
        1168:    f2 0f 5e c1              divsd  %xmm1,%xmm0            // xmm0=a/xmm1
        116c:    66 0f 28 c8              movapd %xmm0,%xmm1            // xmm1=xmm0,把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节.
        1170:    f2 0f 10 55 f0           movsd  -0x10(%rbp),%xmm2    // xmm2=rbp-0x10=b
        1175:    f2 0f 10 05 9b 0e 00     movsd  0xe9b(%rip),%xmm0        # 2018 <_IO_stdin_used+0x18> xmm0=rip+0xe9b=4.1
        117c:    00
        117d:    f2 0f 59 c2              mulsd  %xmm2,%xmm0            // xmm0*=xmm2
        1181:    f2 0f 58 c1              addsd  %xmm1,%xmm0            // xmm0+=xmm1
        1185:    5d                       pop    %rbp
        1186:    c3                       retq   

    0000000000001187

    :
        1187:    f3 0f 1e fa              endbr64
        118b:    55                       push   %rbp
        118c:    48 89 e5                 mov    %rsp,%rbp
        118f:    f2 0f 10 05 89 0e 00     movsd  0xe89(%rip),%xmm0        # 2020 <_IO_stdin_used+0x20>    xmm0=rip+0xe89=1.2
        1196:    00
        1197:    48 8b 05 8a 0e 00 00     mov    0xe8a(%rip),%rax        # 2028 <_IO_stdin_used+0x28>        rax=rip+0xe8a=3.4
        119e:    66 0f 28 c8              movapd %xmm0,%xmm1            // xmm1=xmm0=1.2
        11a2:    66 48 0f 6e c0           movq   %rax,%xmm0            // xmm0=rax=3.4
        11a7:    e8 9d ff ff ff           callq  1149                 // f(xmm0, xmm1)
        11ac:    48 8d 3d 55 0e 00 00     lea    0xe55(%rip),%rdi        # 2008 <_IO_stdin_used+0x8>    rdi=rip+0xe55
        11b3:    b8 01 00 00 00           mov    $0x1,%eax            // eax=1
        11b8:    e8 93 fe ff ff           callq  1050     // printf(rdi, xmm0)
        11bd:    b8 00 00 00 00           mov    $0x0,%eax
        11c2:    5d                       pop    %rbp
        11c3:    c3                       retq   
        11c4:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
        11cb:    00 00 00
        11ce:    66 90                    xchg   %ax,%ax

      [16] .text             PROGBITS         0000000000001060  00001060
           00000000000001e5  0000000000000000  AX       0     0     16
      [17] .fini             PROGBITS         0000000000001248  00001248
           000000000000000d  0000000000000000  AX       0     0     4
      [18] .rodata           PROGBITS         0000000000002000  00002000
           0000000000000030  0000000000000000   A       0     0     8
      [19] .eh_frame_hdr     PROGBITS         0000000000002030  00002030
           000000000000004c  0000000000000000   A       0     0     4

    /*
     * arm
     */
    000000000040055c :
      40055c:    d10043ff     sub    sp, sp, #0x10
      400560:    fd0007e0     str    d0, [sp, #8]
      400564:    fd0003e1     str    d1, [sp]
      400568:    90000000     adrp    x0, 400000 <_init-0x3e8>
      40056c:    911a2000     add    x0, x0, #0x688
      400570:    fd400000     ldr    d0, [x0]
      400574:    fd4007e1     ldr    d1, [sp, #8]
      400578:    1e601821     fdiv    d1, d1, d0
      40057c:    fd4003e0     ldr    d0, [sp]
      400580:    b203e7e0     mov    x0, #0x6666666666666666        // #7378697629483820646
      400584:    f2e80200     movk    x0, #0x4010, lsl #48
      400588:    9e670002     fmov    d2, x0
      40058c:    1e620800     fmul    d0, d0, d2
      400590:    1e602820     fadd    d0, d1, d0
      400594:    910043ff     add    sp, sp, #0x10
      400598:    d65f03c0     ret

    000000000040059c

    :
      40059c:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
      4005a0:    910003fd     mov    x29, sp
      4005a4:    b200e7e0     mov    x0, #0x3333333333333333        // #3689348814741910323
      4005a8:    f2e80160     movk    x0, #0x400b, lsl #48
      4005ac:    9e670001     fmov    d1, x0
      4005b0:    b200e7e0     mov    x0, #0x3333333333333333        // #3689348814741910323
      4005b4:    f2e7fe60     movk    x0, #0x3ff3, lsl #48
      4005b8:    9e670000     fmov    d0, x0
      4005bc:    97ffffe8     bl    40055c
      4005c0:    90000000     adrp    x0, 400000 <_init-0x3e8>
      4005c4:    911a4000     add    x0, x0, #0x690
      4005c8:    97ffffa2     bl    400450
      4005cc:    52800000     mov    w0, #0x0                       // #0
      4005d0:    a8c17bfd     ldp    x29, x30, [sp], #16
      4005d4:    d65f03c0     ret

    #endif

  • 相关阅读:
    在Ubuntu上安装最新的neovim(with LinuxBrew)
    最新版仿东郊到家小程序源码 上门服务小程序源码
    IAR 下的雅特力AT32F415CBT7工程创建与设置
    UNIX环境高级编程-第五章
    Docker的学习记录
    ExcelServer EXCEL服务器使用- 用户、角色权限配置
    程序员天天 CURD,怎么才能成长,职业发展的思考 ?
    机器学习模型选择流程
    【多用户商城系统】多用户商城系统网站怎么做?
    二、软件生命周期
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/133042840