Segitség High level assembly-ben?
procedure Fgv1(VAL i:int32; VAL j:int16); @cdecl; @use EAX; @returns("EAX"); @external;
procedure Fgv1(VAL i:int32; VAL j:int16); @nodisplay;
VAR r:int32;
begin Fgv1;
// return (((66 * i) + 109) * ((i + (19 * i)) * (j + i)));
push(eax); push(ebx);
mov(i, eax);
intmul(66, eax);
add(106, eax);
mov(i, ebx);
intmul(19, ebx);
add(i, ebx);
mov(ebx, r);
movsx(j, ebx);
add(i, ebx);
intmul(r, ebx);
intmul(ebx, eax);
pop(ebx); pop(eax);
end Fgv1;
end unit_1;
1. teszt eset ( i= 457830, j= 348 ): eredmény: 348, helyes: 1407829616
2. teszt eset ( i= 457830, j= 913 ): eredmény: 913, helyes: 571313160
3. teszt eset ( i= 457830, j= 3475 ): eredmény: 3475, helyes: 518160504
4. teszt eset ( i= 457830, j= 8948 ): eredmény: 8948, helyes: -1556787280
5. teszt eset ( i= 457830, j= 29684 ): eredmény: 29684, helyes: -246872144
Bármit csinálok a végeredmény mindig egyenlő j-vel. A végeredmény miért egyenlő mindig j-vel?
Hát aszondod a fordítónak ,hogy returns eax, tehát eax a visszatérőm, majd az elején a gondosen verembe elmebtett EAX-edet visszaszed pop(eax)-al...
De kicsit utánaolvastam ennek az életellenes highlevel asm katasztrófának, és aszongya egy főiskolai könyvben valami nagyokos, hogy a "use eax" akkor adható ki, ha nincs benne átadott vagy visszatérő paraméter, tehát használd csak, nekem nem kell.
Itt meg közben returns eax tehát az a visszatérőm.
Gyanitom egyfajta véletlen hogy a 2. bemenő paramétert kapod vissza pont, egyszerűen regiszter értékmaradvány okozza, a hívás előtt a fordító az EAX-ben hagyta a paraméter értékét valamilyen szintetizált kód eredményeként, te meg szépen elteszed majd visszaszeded.
(az elmentett "szemetet" ami véletlenül benne volt.
Ez igy biztosan nem jó.
Nemtudom mi a cél, ha lehet returns ax, akkor ax-re nem kell vigyázni, hisz ha benne kérek visszatérőt ez lehetetlen..
Viszont igazi magas szintű programnyelvben meg illik mindenre vigyázni, nem a fordító dolga mindent levermelni vagyis semminek az értékében nem bízni egy hívás után, ott jó ez a push midnenség, pop indenség, de ez nyilván üti a regiszter szintű paraméterátadást.
Sima assemblyben mi uraljuk a regisztereket, mi dolgunk figyelni, tiszta sor, minden kód a mienk, ha eltoljuk magunk csesztük el.
Ezt a high level asm izémizét ezt ezért (sem) értem, koncepciójában sem.
procedure Fgv1(VAL i:int32; VAL j:int16); @cdecl; @use EAX; @returns("EAX"); @external;
procedure Fgv1(VAL i:int32; VAL j:int16); @nodisplay;
VAR r:int32;
begin Fgv1;
˙˙˙˙// return (((66 * i) + 109) * ((i + (19 * i)) * (j + i)));
˙˙˙˙PUSH(EAX);
˙˙˙˙PUSH(EBX);
˙˙˙˙PUSH(ECX);
˙˙˙˙PUSH(EDX);
˙˙˙˙
˙˙˙˙//EAX = (66 * i) + 109
˙˙˙˙MOV(i, EAX);
˙˙˙˙INTMUL(66, EAX);
˙˙˙˙ADD(106, EAX);
˙˙˙˙
˙˙˙˙//EBX = i + (19 * i)
˙˙˙˙//ECX = i
˙˙˙˙MOV(i, EBX);
˙˙˙˙INTMUL(19, EBX);
˙˙˙˙MOV(i, ECX);
˙˙˙˙ADD(ECX, EBX);
˙˙˙˙
˙˙˙˙//EDX = (j + i)
˙˙˙˙MOVSX(j, EDX);
˙˙˙˙ADD(ECX, EDX);
˙˙˙˙
˙˙˙˙//EAX = (((66 * i) + 109) * ((i + (19 * i)) * (j + i)))
˙˙˙˙INTMUL(EBX, EDX);
˙˙˙˙INTMUL(EDX, EAX);
˙˙˙˙
˙˙˙˙POP(EDX);
˙˙˙˙POP(ECX);
˙˙˙˙POP(EBX);
˙˙˙˙POP(EAX);
end Fgv1;
Mondjuk, ha EAX-ba kell eredmény, azt lehet, nem kell POP-olni a veremből...
ezt hogy is kéne ?????? : procedure Fgv5 (V1:int32 in EBX; V2:int32 in EAX; mask:int32); @external;
procedure Fgv5 (V1:int32 in EBX; V2:int32 in EAX; mask:int32);
Begin Fgv5;//(V1 ÉS V2) bitjeivel felülírja V2-bitjeit, ahol a mask-ban 1-es bit van
End Fgv5;
én csak kértem legalább nem megyek el odáig hogy mástól kérem... :D
plusz én majd dec 31.-én küldöm be.
Ki a f.om az a Halász Gábor! Mi köze volt itt a dolgokhoz.
Azt se tudja, hogy beadandóról van-e szó, vagy egy hobby projectről, vagy gyakorlásról!!
De nagy magyar módjára mindjárt kitalálja, hogy mi a tuti, ugye??!!! >(
// Halász Gábor := ismeretlen idegesítő nyámnyila stréber //
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!