我正在使用代码末尾给出的命令来运行此代码,但每次都会遇到分段错误错误。下面提供了两种类型的文件及其代码。 “ .C”文件和“ .ASM”文件。
; roots.asm
segment .text
global _roots
_roots:
enter 0,0
xor EAX,EAX
fld qword[EBP+8] ; a
fadd ST0 ; 2a
fld qword[EBP+8] ; a,2a
fld qword[EBP+24] ; c,a,2a
fmulp ST1 ; ac,2a
fadd ST0 ; 2ac,2a
fadd st0 ; 4ac,2a
fchs ; -4ac,2a
fld qword[EBP+16] ; b,-4ac,2a
fld qword[EBP+16] ; b,b,-4ac,2a
fmulp ST1 ; b*b,-4ac,2a
faddp ST1 ; b*b-4ac,2a
ftst ; cmp (b*b-4ac),0
fstsw AX ; result of test in AX
sahf ; store AH in flag reg
jb no_real_roots ; jb tests the carry flag
fsqrt ; sqrt(b*b-4ac),2a
fld qword[EBP+16] ; b,sqrt(b*b-4ac),2a
fchs ; -b,sqrt(b*b-4ac),2a
fadd ST1 ; -b+sqrt(b*b-4ac),sqrt(b*b-4ac),2a
fdiv ST2 ; -b+sqrt(b*b-4ac)/2a,sqrt(b*b-4ac),2a
mov EAX,dword[EBP+32] ; EAX = -b+sqrt(b*b-4ac)/2a
fstp qword[EAX] ; Store and pop
fchs ; -sqrt(b*b-4ac),2a
fld qword[EBP+16] ; b,-sqrt(b*b-4ac),2a
fchs ; -b,-sqrt(b*b-4ac),2a
faddp ST1 ; -b-sqrt(b*b-4ac),2a
fdivrp ST1 ; -b-sqrt(b*b-4ac)/2a
mov EAX,dword[EBP+36] ; EAX = -b-sqrt(b*b-4ac)/2a
fstp qword[EAX] ; Store and pop
mov EAX,1 ; 1 means real roots
jmp short done
no_real_roots:
fchs ; Make b*b-4ac positive
fsqrt ; sqrt(b*b-4ac),2a
fld qword[EBP+16] ; b,sqrt(b*b-4ac),2a
fchs ; -b,sqrt(b*b-4ac),2a
fadd ST1 ; -b+sqrt(b*b-4ac),sqrt(b*b-4ac),2a
fdiv ST2 ; -b+sqrt(b*b-4ac)/2a,sqrt(b*b-4ac),2a
mov EAX,dword[EBP+32] ; EAX = -b+sqrt(b*b-4ac)/2a
fstp qword[EAX] ; Store and pop
fchs ; -sqrt(b*b-4ac),2a
fld qword[EBP+16] ; b,-sqrt(b*b-4ac),2a
fchs ; -b,-sqrt(b*b-4ac),2a
faddp ST1 ; -b-sqrt(b*b-4ac),2a
fdivrp ST1 ; -b-sqrt(b*b-4ac)/2a
mov EAX,dword[EBP+36] ; EAX = -b-sqrt(b*b-4ac)/2a
fstp qword[EAX] ; Store and pop
sub EAX,EAX ; 0 means no real roots
done:
leave
ret
要组装和链接,请输入:
gcc -c rootsc.c
nasm -f elf64 -g -o roots.o roots.asm
gcc rootsc.o roots.o -o roots