Vektorok vetülete asm nyelven

Vektorok vetülete asm nyelven
2012-11-29T13:01:58+01:00
2012-11-29T18:07:05+01:00
2022-11-27T13:50:40+01:00
Bany
Kaptam egy kötelező házit ami a következő lenne
Adott a v=ai+bj+ck vektor. Írjon programot, amely meghatározza a vektor hosszát, valamint az XY, XZ, YZ síkokra eső vetületek hosszát!

Az adatok kiíratását és bekérését C nyelven kell megírni csak a számolást kell gépi utasítás szinten megírni.

Idáig jutottam el a feladatba


#include "stdafx.h" #include<math.h> int _tmain(int argc, _TCHAR* argv[]){ int a,b,c,e; double alfa,beta,gamma,x,y,z; printf("Kerem adja meg i iranyu osszetevot: "); scanf("%d",&a); printf("Kerem adja meg j iranyu osszetevot: "); scanf("%d",&b); printf("Kerem adja meg k iranyu osszetevot: "); scanf("%d",&c); printf("A megadott vektor: /v/=%d*i+%d*j+%d*k\n",a,b,c); _asm{ mov eax,a; mul ax; mov ebx,eax; mov eax,b; mul ax; mov ecx,eax; mov eax,c; mul ax; add eax,ebx; add eax,ecx; mov e,eax; } double hossz=e; _asm { fld hossz; fsqrt; fst hossz; } printf("A megadott vektor hossza: %2.2f\n",hossz); alfa=a/hossz; alfa=cos(alfa); beta=b/hossz; beta=cos(beta); gamma=c/hossz; gamma=cos(gamma); /*a=hossz; _asm{ mov eax,a; mul alfa; mov b,eax; } printf("Az x tengelyre eso vetulet hossza: %2.2f.\nAz y tengelyre eso vetulet hossza: %2.2f.\nA z tengelyre eso vetulet hossza: %2.2f.\n",x,y,z);*/ return 0; }
Valaki tudna nekem forrás kód beli segítséget nyújtani hogy hogyan tovább?
Mutasd a teljes hozzászólást!
Ezt csak poenbol megirtam SSE-re, kivancsi voltam a HorizontalAddPackedSingle utasitasra.
Osszesen 9 utasitasbol (legóból) kijön az egész :D
program PSSEVectLen; {$APPTYPE CONSOLE} var v:array[0..3]of single; begin Write('X=?');Readln(v[0]); Write('Y=?');Readln(v[1]); Write('Z=?');Readln(v[2]); v[3]:=0; asm movups xmm0, v mulps xmm0, xmm0 //xmm0: (x^2, y^2, z^2, 0 ) pshufd xmm1, xmm0, $98 //xmm1: (x^2, z^2, y^2, z^2) haddps xmm0, xmm1 //xmm0: (XY, Z, XZ, YZ) //XY=x^2+y^2 ... movaps xmm1, xmm0 //save haddps xmm0, xmm0 //xmm0: XYZ,... insertps xmm1, xmm0, $10 //xmm1: (XY, XYZ, XZ, YZ) sqrtps xmm1, xmm1 movups v, xmm1 end; writeln('len(XYZ)=',v[1]:10:3); writeln('len(XY) =',v[0]:10:3); writeln('len(XZ) =',v[2]:10:3); writeln('len(YZ) =',v[3]:10:3); readln; end.
Mutasd a teljes hozzászólást!

  • Mi a gond? Kiszámoltad a legnehezebbet, az elv ugyanaz a másik három esetben, nem szükséges új utasítás, sin/cos sem.

    (síkban kell elvégezni a hossz számítást, amit már megcsináltál)
    Mutasd a teljes hozzászólást!
  • valamint az XY, XZ, YZ síkokra eső vetületek hosszát!


    Az x tengelyre eso vetulet hossza: %2.2f


    Ja, azért jó lenne, ha eldöntenéd, mi a feladat.
    Mutasd a teljes hozzászólást!
  • Szerintem a 28. sorban lévő C-ben megvalósított int->double kasztolást elhagyhatod, és helyette a FILD utasítással töltsd be az adatot az FPU-ba.

    _asm{ mov eax,a; mul ax; mov ebx,eax; mov eax,b; mul ax; mov ecx,eax; mov eax,c; mul ax; add eax,ebx; add eax,ecx; mov e,eax; fild e; fsqrt; fst hossz; }

    A folytatáshoz pedig mindenképp először a matematikai alapokat kell tisztáznod.
    Mutasd a teljes hozzászólást!
  • Ezt csak poenbol megirtam SSE-re, kivancsi voltam a HorizontalAddPackedSingle utasitasra.
    Osszesen 9 utasitasbol (legóból) kijön az egész :D
    program PSSEVectLen; {$APPTYPE CONSOLE} var v:array[0..3]of single; begin Write('X=?');Readln(v[0]); Write('Y=?');Readln(v[1]); Write('Z=?');Readln(v[2]); v[3]:=0; asm movups xmm0, v mulps xmm0, xmm0 //xmm0: (x^2, y^2, z^2, 0 ) pshufd xmm1, xmm0, $98 //xmm1: (x^2, z^2, y^2, z^2) haddps xmm0, xmm1 //xmm0: (XY, Z, XZ, YZ) //XY=x^2+y^2 ... movaps xmm1, xmm0 //save haddps xmm0, xmm0 //xmm0: XYZ,... insertps xmm1, xmm0, $10 //xmm1: (XY, XYZ, XZ, YZ) sqrtps xmm1, xmm1 movups v, xmm1 end; writeln('len(XYZ)=',v[1]:10:3); writeln('len(XY) =',v[0]:10:3); writeln('len(XZ) =',v[2]:10:3); writeln('len(YZ) =',v[3]:10:3); readln; end.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd