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