[ rapidlord @ 16.06.2005. 09:56 ] @
Imam funkciju koja je napisana za PalmOS (Motorola 68000) i za Linux (x86) , meni je potrebna ista takva pisana za PocketPC (ARM) , nemam iskustva sa asemblerom na ovu funkciju sam naleteo prebacujuci neki c/c++ kod sa jedne platforme na drugu, u principu ne volim da trazim da neko nesto radi umesto mene ali se nalazim u beznadeznom polozaju, pokusao sam da provalim sam nesto ali uzima mi previse vremena koga nemam, ne znam kolko je ovo tesko ali funkcija nije velika pa ako nekom nije tesko bio bih mu zahvalan ako mi pokazao kako ova funkcija treba da izgleda za ARM ili barem u Microsoft-ovom MASM (x86) (bilo bi mi razumljivije, jer sam u njemu radio nesto malo). Inace u fixed-u je predstavljen broj sa pokretnim zarezom. Hvala Code: typedef long fixed; #ifdef LINUX /* PALM (m68) */ fixed asm m68_fixed_mul(fixed a : __D0, fixed b : __D1) : __D0 { movem.l d2-d4, -(sp) move.l d0, d2 mulu.w d1, d0 add.l #0x8000, d0 clr.w d0 swap d0 // d0=alo*blo>>16, d1=b, d2=a move.l d1, d3 move.l d2, d4 swap d4 mulu.w d4, d3 add.l d3, d0 // d0=alo*blo>>16 + ahi*blo, d4=alo.ahi move.l d1, d3 swap d3 mulu.w d2, d3 // d3= alo*bhi add.l d3, d0 // d0=d0 + alo*bhi move.l d1, d3 swap d3 mulu.w d4, d3 // d3 = ahi*bhi swap d3 clr.w d3 add.l d3, d0 // d0 is now the unsigned product // d1=b, d2=a, d3=??, d4=alo.ahi swap d1 move.l d4, d3 ext.l d3 and.l d1, d3 clr.w d3 sub.l d3, d0 ext.l d1 and.l d4, d1 clr.w d1 sub.l d1, d0 movem.l (sp)+, d2-d4 rts } #else /* LINUX (x86) */ inline fixed intel_fixed_mul(fixed a, fixed b) { fixed __s; asm ( "imull %2 \n\t" "add $0x8000,%%eax \n\t" "adc $0,%%edx \n\t" "shrd $16,%%edx,%%eax" : "=a" (__s) : "a" (a), "rm" (b) : "%edx"); return __s; } #endif |