2012-03-07 8 views
0

: 나는 eq2을 얻을 수있는 방정식을 주석하는 경우, 내가 얻을 수있는 이전 식의 오른쪽 출력을 얻을 것이다, 어떤 이유NASM 부동 소수점 오류 부동 소수점 스택에 조작을 수행에서 작업

fld  qword [perResult]  ;load st0 with perimeter 
fsub qword [firstSide]  ;take st0 and minus firstSide, st0= perimeter - firstSide 
fmul qword [perResult]  ;take st0 and multiply by perimeter, st0 = difference of first equation * perimeter 
fstp qword [res1]   ;take the result off of st0 and place them into variable equation1 

;setting up to take perimeter minus second side 
fld  qword [perResult]  ;load up perimeter into st0 
fsub qword [secondSide]  ;take st0 and minus secondSide, st0 = perimeter - secondSide 
fstp qword [eq2] 

일 후 함수가있는 경우 res1,

하지만 주석 식 (2)를두면 내가 0 출력

하고 다음 방정식 같은 일 같은 얻을 것이다, 어떤 이유로 그것을 밖으로 제로 있어요 e previous.

아무도 전에이 문제에 직면 한 적이 있습니까?

는 여기에 내가 위의 코드에 문제를 볼 인쇄 기능

mov rdi, areaMsg  
call print_string 
xor r14,r14 
movsd xmm0, [eq2] ;move sumResult into xmm0 for printing 
mov qword rax, 1 
mov r14, [eq2] ;move result into r14 register for printing float 
call print_float 
call print_nl 
jmp Decision 

답변

0

입니다. Windows XP에서 컴파일하고 실행했습니다 :

bits 16 
org 0x100 

fld  qword [perResult]  ;load st0 with perimeter 
fsub qword [firstSide]  ;take st0 and minus firstSide, st0= perimeter - firstSide 
fmul qword [perResult]  ;take st0 and multiply by perimeter, st0 = difference of first equation * perimeter 
fstp qword [res1]   ;take the result off of st0 and place them into variable equation1 

;setting up to take perimeter minus second side 
fld  qword [perResult]  ;load up perimeter into st0 
fsub qword [secondSide]  ;take st0 and minus secondSide, st0 = perimeter - secondSide 
fstp qword [eq2] 

ret 

align 8 

perResult  dq 11.0 
firstSide  dq 1.0 
res1   dq 0.0 ; (perResult - firstSide) * perResult = (11-1)*11 = 110 
secondSide  dq 2.0 
eq2    dq 0.0 ; perResult - secondSide = 11-2 = 9 

그리고 제대로 계산 된 110과 9 (디버거에서 확인).

문제가있는 경우 표시되지 않은 코드에 있습니다.

+0

괜찮아, 윙윙 거리다가 출력해야합니다. – user1050632