[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