装配64位积分算法

时间:2016-05-07 20:38:29

标签: assembly x86 integral

我自己在C中编写了一个函数,用于计算给定步数的积分:

double integr(double start, double end, unsigned int steps){
    double integral = 0,
            currentStep = start;
    double step = (end-start)/steps,
            halfStep = 1/2*step;

    while(currentStep <= end){
            integral += 1/(currentStep+halfStep)*step;
            currentStep += step;
    }

    return integral;
}

然后我用gcc反编译它,这就是我留下的东西:

.global integr
integr:
    pushq   %rbp
    movq    %rsp, %rbp

    movsd   %xmm0, -40(%rbp)
    movsd   %xmm1, -48(%rbp)
    movl    %edi, -52(%rbp)
    movl    $0, %eax
    movq    %rax, -32(%rbp)

    movq    -40(%rbp), %rax
    movq    %rax, -24(%rbp)

    movsd   -48(%rbp), %xmm0
    movapd  %xmm0, %xmm1
    subsd   -40(%rbp), %xmm1
    movl    -52(%rbp), %eax

    testq   %rax, %rax
    js      .L2

    cvtsi2sdq       %rax, %xmm0
    jmp     .L3
.L2:
        #
        movq    %rax, %rdx
        shrq    %rdx
        andl    $1, %eax
        orq     %rax, %rdx
        cvtsi2sdq       %rdx, %xmm0
        addsd   %xmm0, %xmm0
.L3:
    divsd   %xmm0, %xmm1
    movapd  %xmm1, %xmm0
    movsd   %xmm0, -16(%rbp)
    movsd   -16(%rbp), %xmm1
    xorpd   %xmm0, %xmm0
    mulsd   %xmm1, %xmm0
    movsd   %xmm0, -8(%rbp)
    jmp     .L4
.L5:
    movsd   -24(%rbp), %xmm0
    addsd   -8(%rbp), %xmm0
    movsd   .LC1(%rip), %xmm1
    divsd   %xmm0, %xmm1
    movapd  %xmm1, %xmm0
    mulsd   -16(%rbp), %xmm0
    movsd   -32(%rbp), %xmm1
    addsd   %xmm1, %xmm0
    movsd   %xmm0, -32(%rbp)
    movsd   -24(%rbp), %xmm0
    addsd   -16(%rbp), %xmm0
    movsd   %xmm0, -24(%rbp)
.L4:
    movsd   -48(%rbp), %xmm0
    ucomisd -24(%rbp), %xmm0
    jae     .L5
    movq    -32(%rbp), %rax
    movq    %rax, -64(%rbp)
    movsd   -64(%rbp), %xmm0
    popq    %rbp
    ret
.LC1:
    .long   0
    .long   1072693248

我知道第一行和第二行正在推送旧堆栈指针并移动一个新指针。耦合下一行是获取参数(开始,结束,步骤)并将它们移动到堆栈上。

据我所知,Testq为我们提供了一个信息,如果%rax&lt; 0

我无法找出其他线路的用途。 请帮帮我

0 个答案:

没有答案