我用C编写了对我来说很好用的函数,但是我需要在汇编中编写相同的函数。我使用gcc -S rrd.c生成了该函数的汇编代码,在asm中实现它需要一些帮助。我正在使用Linux,x86汇编。

我的C函数:

double rrd (double a)
{

FILE *f=fopen("inital.txt","r");

    if(f==NULL)
        return 1;

    double first, second;

    do
    {
        fscanf(f, "%lf", &first);
        fscanf(f, "%lf", &second);
    }
    while(a >= first);

    close(f);
    return second;
}


这是我得到的:
http://pastebin.com/zyEBgTEC

这就是我到目前为止所拥有的:

.data
mode:
    .string "r"
file:
    .string "inital.txt"
format:
    .string "%lf"
value:
    .space 8
first:
    .space 8
second:
    .space 8
pointer:
    .space 8
.text
.global re
re:
    pushl   %ebp
    movl    %esp, %ebp
    fldl    8(%ebp)
    fstpl   value

    pushl   $mode
    pushl   $file
    call    fopen
    movl    %eax, pointer
    cmpl    $0, pointer
jne loop

jmp end

loop:
    leal    16(%esp), %edx
    pushl   %edx
    pushl   $format
    pushl   pointer
    call    __isoc99_fscanf

    leal    24(%esp), %edx
    pushl   %edx
    pushl   $format
    pushl   pointer
    call    __isoc99_fscanf

    fldl    16(%esp)
    fldl    32(%esp)

    pushl   pointer
    call    close

end:
leave
ret


fldl指令后的结果:

st0            -2.3534389814351579410727679528547297e-185   (raw 0xbd99ccccd5ffff9ac000)
st1            -1.9968719781118224876337308160145767    (raw 0xbfffff99804025016800)


我的问题是我不完全知道fscanf指令的结果在哪里,也不知道为什么有这些leal指令。

有人可以帮我重写此功能吗?

最佳答案

所以它应该看起来像这样:

wiecej:
        leal    pierwsza, %edx
        pushl   %edx
        pushl   $format
        pushl   wskaznik
        call    __isoc99_fscanf

        leal    druga, %edx
        pushl   %edx
        pushl   $format
        pushl   wskaznik
        call    __isoc99_fscanf

        fldl    pierwsza
        fldl    b
        fucomip %st(1), %st
        fstp    %st(0)
        setae   %al
        testb   %al, %al
    jne wiecej
        fldl    druga

关于c - 用fopen和fscanf从C到汇编的重写功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23638159/

10-14 06:16