繁体   English   中英

用fopen和fscanf从C到汇编的重写功能

[英]Rewriting function with fopen and fscanf from C to assembly

我用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM