2016-06-24 3 views
0

어셈블리 포인트에 방정식을 구현하려고하는데 잘못된 대답을주고 있습니다.어셈블리의 방정식이 잘못된 대답

나는 그것을 caculater에 넣는다. 그리고 그것은 나에게 433.0127018를 준다. .. 그리고 나의 코드와 더불어 나는 0.0193269641235를 얻는다. 대답은 심지어 정확하지 않다. 그러나 can not는 그것이 틀린 aswer를주고있는 이유를 발견한다.

공식 :

initX=sin((degree+ (i∗dStep)) ∗pi/180) ∗ scale 

변수 :

degree  dd 0 
dStep  dq 120.0 
scale  dq 500.0 
pi   dq 3.14159265358979  
oneEighty dq 180.0 
initX  dq 0.0 
tmp   dq 0.0 
tmptmpdegree dq 0.0 

코드 :

; initX=sin((degree+(i*dstep))*pi/180)*scale 

movsxd r10,dword[degree] 
cvtsi2sd xmm0,r10 
movsd qword[tmpdegree],xmm0 
movsd xmm1,qword[pi] 
divss xmm1,dword[oneEighty] 
movsd qword[tmp],xmm1 

movsd xmm0,qword[tmpdegree] 
addsd xmm0,qword[dStep] 
mulsd xmm0,qword[tmp] 
call sin 
mulsd xmm0,qword[scale] 
movsd qword[initX],xmm0 
+4

'i'을 잊어 버렸습니다. 추신 : 디버거를 사용하는 법을 배워보십시오. – Jester

답변

2

divss is single-precision, 당신은 배정 밀도 데이터를 사용했다. 심지어 그 레이블에 dq 부동 소수점을 넣어도, dword [oneEighty]을 썼습니다.

따라서 double의 가수의 낮은 32 비트를 float으로 처리하고 있습니다.

Jester가 말했듯이 디버거에서는 xmm1의 값이 해당 명령어 다음에 예상되는 값으로 변경되지 않았 음을 나타냅니다.

자세한 링크는 태그 위키를 참조하십시오.


더 나은에만 그래서 당신은 모든 분할 할 필요가 없습니다 pi/180.0을 저장하여, 두 상수를 결합에서 시간을 조립하는 것입니다. 기억하십시오, 은 컴파일러입니다. 코드가 빨지 않기를 원한다면 직접 코드를 단순화하는 방법을 찾아야합니다.


또한,이 무의미 : 당신은 그냥 XMM1의 값을 떠나야한다, 그래서 그 지침 사이

movsd qword[tmp], xmm1 
... 
mulsd xmm0, qword[tmp] 

것도, XMM1 소지품하지 않습니다.

동일 함 tmpdegree와 동일합니다. 준비가되었을 때 cvtsi2sd xmm0, [degree]해야합니다.

또한 글로벌이 아닌 레지스터에서 degree을 arg로 취해야합니다. 그리고 여러분은 상수가 변수와 섞여 있습니다. 상수를 .rodata 섹션에 넣으십시오.