用C编写ASM并产生结果“;“南”;或-“南”;。平方根函数
我之前编译时出错,但在处理这些错误后,没有收到任何错误/警告。虽然给出的结果是NaN 以下是代码: C: ASM2: 所以是的。C代码中的返回是“-nan和--nan”。经过几个小时的寄存器检查和代码更改,我不知道该如何克服这个问题 C中的代码=输入和输出 ASM1是计算根1,ASM2是计算根2用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。这乘以
有什么想法吗?您正在执行
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