Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C编写ASM并产生结果“;“南”;或-“南”;。平方根函数_C_Assembly_Square Root - Fatal编程技术网

用C编写ASM并产生结果“;“南”;或-“南”;。平方根函数

用C编写ASM并产生结果“;“南”;或-“南”;。平方根函数,c,assembly,square-root,C,Assembly,Square Root,我之前编译时出错,但在处理这些错误后,没有收到任何错误/警告。虽然给出的结果是NaN 以下是代码: C: ASM2: 所以是的。C代码中的返回是“-nan和--nan”。经过几个小时的寄存器检查和代码更改,我不知道该如何克服这个问题 C中的代码=输入和输出 ASM1是计算根1,ASM2是计算根2 有什么想法吗?您正在执行fld a,而您应该执行fild a将整数加载到浮点堆栈(将其转换为浮点);因为这些变量是整数,而不是浮点数 例如,作为浮点加载的整数2是非规范的,其大小约为2^-140。这乘以

我之前编译时出错,但在处理这些错误后,没有收到任何错误/警告。虽然给出的结果是NaN

以下是代码:

C:

ASM2:

所以是的。C代码中的返回是“-nan和--nan”。经过几个小时的寄存器检查和代码更改,我不知道该如何克服这个问题

C中的代码=输入和输出

ASM1是计算根1,ASM2是计算根2


有什么想法吗?

您正在执行
fld a
,而您应该执行
fild a
将整数加载到浮点堆栈(将其转换为浮点);因为这些变量是整数,而不是浮点数

例如,作为浮点加载的整数2是非规范的,其大小约为2^-140。这乘以另一个小数字等于零


然后,最后一个
fdivp
将0.0除以0.0,根据定义,这是一个NaN。

在调试器中,您是否验证了寄存器是否从堆栈接收到正确的值?此外,当单步执行时,您的值何时变为NAN?这通常意味着尝试负平方根或可能除以0。在调试器中单步进入汇编程序文件时,这两个代码都应该显示。这是完整的代码,只有这3个代码一起编译。我是否应该将每个fld都更改为fild?@sadasfdafasfgasd显然不是。看看这是错误的原因。一些
fld
s确实加载了本来应该是浮动的东西,所以它们应该保持
fld
。我做了另一种方法,在不将fld更改为fild的情况下将每个int更改为float,但仍然得到-nan。你认为int应该保持int并将它们更改为fild吗?这会有帮助吗?我相信现在是开始使用调试器的好时机。如果您缺少一个,我建议您移动例程的退出块,直到找到返回值与预期值不同的地方。(同样是sqrt(x),当x为负时,浮点操作很可能产生NaN。)(在移动出口块时,确保堆栈平衡,并恢复所有被调用方保存的寄存器。)
iclude <stdio.h>

extern float wynik1 (int a, int b, int c);
extern float wynik2 (int a, int b, int c);

int a = 2;
int b = 2;
int c = 2;

int main ()
{

float licz1 = 0;
float licz2 = 0;

licz1 = wynik1(a, b, c);
licz2 = wynik2(a, b, c);

printf("Roots : %f oraz %f \n", licz1, licz2);

return 0;
}
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
EXIT_SUCCESS = 0
STDIN = 0

.align 32
.data

a: .int 2
b: .int 2
c: .int 2
buf: .float 0
x1: .float 0

cztery: .float 4
dwa: .float 2

.text
.global wynik1

wynik1:

xor %eax, %eax
xor %ebx, %ebx
xor %ecx, %ecx

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
movl 12(%ebp), %ebx
movl 16(%ebp), %eax
pushl %eax
pushl %ebx
pushl %ecx

movl %eax, a
movl %ebx, b
movl %ecx, c

finit 
fld a
fld c

deltaa1:
fmulp
fld cztery
fmulp
fld b
fld b
fmulp
fsubp

pierwiastek1:
fsqrt
fld b
fchs
fsubp
fstp buf
fld a
fld dwa
fmulp
fld buf
fdivp
fstp x1

movl x1, %eax

movl %ebp, %esp
popl %ebp
ret
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
EXIT_SUCCESS = 0
STDIN = 0

.align 32
.data

a: .int 2
b: .int 2
c: .int 2
buf: .float 0
x2: .float 0
cztery: .float 4
dwa: .float 2

.text
.global wynik2

wynik2:

xor %eax, %eax
xor %ebx, %ebx
xor %ecx, %ecx

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
movl 12(%ebp), %ebx
movl 16(%ebp), %eax
pushl %eax
pushl %ebx
pushl %ecx

movl %eax, a
movl %ebx, b
movl %ecx, c

finit 
fld a
fld c

deltaa2:
fmulp
fld cztery
fmulp
fld b
fld b
fmulp
fsubp

pierwiastek2:
fsqrt
fld b
fchs
faddp
fstp buf
fld a
fld dwa
fmulp
fld buf
fdivp
fstp x2


movl %ebp, %esp
popl %ebp
ret