[OSy] Ztraceno v prekladu
Dalibor Straka
dast at panelnet.cz
Fri Nov 2 19:01:16 CET 2007
Preji vsem hezky vecer,
nasledujici kod se prelozi pro mne nepochopitelnym zpusobem:
inline unsigned int test(unsigned int nasob) {
unsigned long long int vysledek;
vysledek = nasob * nejaka_globalni_prom;
vysledek /= 12345;
return vysledek;
}
lui v0, 0x8000
lw a0, 0x3c50(v0)
lui a2, 0x000f
ori a2, a2, 0x4240
mult a1, a0
addu a3, 0, 0
mflo a0
---> jal +0x0
addu a1, 0, 0
j +0x4c4
nop
Kdezto pozmeneny kod
vysledek = nasob * prom / 12345;
ze prelozi na
800024A4 lui v1, 0x8000 # 0x8000=32768, v0: 0x0->0x2,
800024A8 lw v0, 0x3c60(v1) # 0x3c60=15456, v0: 0x2->0x4588de
800024AC sw 0, 0x14(a0) # 0x14=20
800024B0 lui a0, 0x8000 # 0x8000=32768, a0: 0x80003c40->0x80000000
800024B4 mult a1, v0 # loreg: 0x0->0x3864bfc0, hireg: 0x4->0x15
800024B8 lui a1, 0x53c1 # 0x53c1=21441, a1: 0x4e20->0x53c10000
800024BC ori a1, a1, 0xdf1d # 0xffffdf1dh=57117, a1: 0x53c10000->0x53c1df1d
800024C0 addiu a0, a0, 0x3a88 # 0x3a88=14984, a0: 0x80000000->0x80003a88
800024C4 mflo v0 # v0: 0x4588de->0x3864bfc0
800024C8 nop
800024CC nop
800024D0 multu v0, a1 # loreg: 0x3864bfc0->0xf631f8c0, hireg: 0x15->0x12735f45
800024D4 mfhi a1 # a1: 0x53c1df1d->0x12735f45
800024D8 subu v0, v0, a1 # v0: 0x3864bfc0->0x25f1607b
800024DC srl v0, v0, 0x01 # 0x1=1, v0: 0x25f1607b->0x12f8b03d
800024E0 addu a1, a1, v0 # a1: 0x12735f45->0x256c0f82
800024E4 srl a1, a1, 0x0d # 0xd=13, a1: 0x256c0f82->0x12b60
Vzhledem k tomu, ze je "inline", nedochazi k volani a "telicko" jsem
odhadl. Funkce vraci nesmyslne hodnoty.
Nesetkal jsem se s tim nekdo? Diky za kazde vyjadreni.
-- Dalibor Straka
P.S. Mam sva tuseni, ale nechci nikoho ovlivnovat ;-).
More information about the NSWI004
mailing list