【发布时间】:2018-05-04 17:24:14
【问题描述】:
我有一个使用 NASM 函数的 C 语言程序。下面是C程序的代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
extern float hyp(float a); // supposed to calculate 1/(2 - a) + 6
void test(float (*f)(float)){
printf("%f %f %f\n", f(2.1), f(2.1), f(2.1));
}
void main(int argc, char** argv){
for(int i = 1; i < argc; i++){
if(!strcmp(argv[i], "calculate")){
test(hyp);
}
}
}
这里是 NASM 函数:
section .data
a dd 1.0
b dd 2.0
c dd 6.0
section .text
global hyp
hyp:
push ebp
mov ebp, esp
finit
fld dword[b]
fsub dword[ebp + 8]
fstp dword[b]
fld dword[a]
fdiv dword[b]
fadd dword[c]
mov esp, ebp
pop ebp
ret
这些程序在 Linux 中通过 gcc 和 nasm 链接。这是 Makefile:
all: project clean
main.o: main.c
gcc -c main.c -o main.o -m32 -std=c99
hyp.o: hyp.asm
nasm -f elf32 -o hyp.o hyp.asm -D UNIX
project: main.o hyp.o
gcc -o project main.o hyp.o -m32 -lm
clean:
rm -rf *.o
程序运行时,输出如下:
5.767442 5.545455 -4.000010
最后一个数字是正确的。我的问题是:为什么即使输入相同,这些结果也会不同?
【问题讨论】:
-
您是否在 C 中重新实现了
hyp(),以检查您的堆栈处理是否正确? (对我来说它看起来有点轻......) -
没有固定的指定顺序来评估函数的参数。可能与此有关。
-
@Someprogrammerdude Nasm函数符合cdecl,所以参数应该在ebp + 8上
-
@Attie 堆栈处理在这里应该是正确的,我在 Nasm 中运行了这样的堆栈处理程序,它们运行良好
-
好的 - 仍然值得在 C 中实现 A)查看它是否有效(帮助确定问题的原因),B)将编译器的输出与您的 ASM 进行比较。