Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Neobican problem (mix C i ASM)

[es] :: C/C++ programiranje :: Neobican problem (mix C i ASM)

[ Pregleda: 3534 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7176 Profil

icon Neobican problem (mix C i ASM)08.12.2002. u 08:37 - pre 260 meseci
Dakle,

Ako neki ASM guru zna da odgovori na ovo bilo bi jako lepo :)

dakle, problem je sledeci - C projekat je poprilicno veliki i radi se na optimizaciji nekih funkcija mixovanjem asm i c koda.

Simulacija asm-koda u posebnom test.c fajlu (odvojenog od projekata) radi sasvim lepo, ali kada se ubaci u funkciju koja meni treba (u projektu) nastaju vrlo cudni problemi kod adresiranja C varijabli i nizova.

Dakle, imamo globalno definisani niz:

Code:

float  table[16384];


i funkciju:

Code:

int fja()
{

  /* c kod */
  /* ... */

  __asm {
    // .. asm kod
    mov edx,  table
    // ...
  }
}




I sad, kod puca - debugger kasnije kaze da pokusavam da adresiram nesto (indirektno kroz EDX) i EDX je NULA?

EDX uopste ne dobija adresu table, iako u step-by-step modu table pokazuje na memorijsku adresu niza? Posle mov edx, table (i verifikacije da je adresa table OK) edx je i dalje nula u mom projektu?

Zamena table, sa indirektnim pointerom table_ptr (table_ptr = &table[0]) radi posao, ali kasnije kada se ucitava float (fld) dobije se #IND - iako table[n] pokazuje na korektno formatiran float.

Menjanje kompajlera (VC++, ICL) ne pomaze. Napomena - kod radi u posebnom c fajlu koji je test projekat, samo ne radi u velikom projektu?

Da li neko ima ideju? Kod je i386 32-bitni flat model. VC 6.0, ICL 7.0 kao kompajleri?


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.client.attbi.com



+18 Profil

icon Re: Neobican problem (mix C i ASM)08.12.2002. u 09:52 - pre 260 meseci
Da li mozes da zakacis ovde (mini-)projekat u kome se reprodukuje problem?
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7176 Profil

icon Re: Neobican problem (mix C i ASM)08.12.2002. u 11:04 - pre 260 meseci
Na zalost - nemam ga ovde kod kuce

U Ponedeljak cu sa posla da attachujem problem.

Ma problem je sto u tom test C fajlu radi sve kako treba, ali kada taj kod prostom copy/paste metodom ubacim u moj projekat - cela stvar prestaje da funkcionise i pojavljuju se ti veoma specificni problemi (sa edx registrom, na primer) :)

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Bosko
Beograd

Član broj: 4278
Poruke: 49
*.rcub.bg.ac.yu



Profil

icon Re: Neobican problem (mix C i ASM)09.12.2002. u 16:17 - pre 260 meseci
OK, dozvoljava se mesanje assemblera i C-a. da li si obratio mozda paznju na ovo (iz MSDNa):
An __asm block cannot use C or C++ specific operators, such as the << operator. However, operators shared by C and MASM, such as the * operator, are interpreted as assembly-language operators. For instance, outside an __asm block, square brackets ([ ]) are interpreted as enclosing array subscripts, which C automatically scales to the size of an element in the array. Inside an __asm block, they are seen as the MASM index operator, which yields an unscaled byte offset from any data object or label (not just an array). The following code illustrates the difference:

int array[10];

__asm mov array[6], bx ; Store BX at array+6 (not scaled)

array[6] = 0; /* Store 0 at array+12 (scaled) */

The first reference to array is not scaled, but the second is. Note that you can use the TYPE operator to achieve scaling based on a constant. For example, the following statements are equivalent:

__asm mov array[6 * TYPE int], 0 ; Store 0 at array + 12

array[6] = 0; /* Store 0 at array + 12 */


In this world there is no justice - there are only interests!!!
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7176 Profil

icon Re: Neobican problem (mix C i ASM)09.12.2002. u 18:05 - pre 260 meseci
Sorry.. zaboravih da postujem kod opet dok sam bio na poslu.. sutra :)


Hmm. problem je drugacije prirode - znaci imas instrukciju:

mov edx, table // gde je table float[16384], znaci pointer na table

i kad stepujes u debuggeru u sledecoj liniji je EDX 0

iako TABLE pokazuje na validan pointer.


Problem nestaje ako je table >lokalna< varijabla, ali se onda javljaju neki drugi problemi. Sve u svemu, vrlo cudna situacija.



DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
207.46.137.*



+18 Profil

icon Re: Neobican problem (mix C i ASM)09.12.2002. u 19:08 - pre 260 meseci
E stvarno sam zardjao, trebao sam ovo odmah da napisem.... Evo o cemu se radi:

mov edx, table
je isto sto i
mov edx, table[0]
(prover sa table[0]=1, table[0]=2, itd.)

Ono sto tebi treba je:

lea edx, table

Ono sto takodje mozes da uradis je:

mov edx, OFFSET table

Ali to radi samo za globalne promenljive. Lokalne promenljive nemaju fiksni offset (jer su stack-based), pa zato ne mozes da koristis OFFSET na njima.

Nadam se da ovo pomaze.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7176 Profil

icon Re: Neobican problem (mix C i ASM)09.12.2002. u 19:26 - pre 260 meseci
Cini mi se da smo probali sa dword ptr

ali probacu sa LEA sutra - i mislmi da je table pokazivao na adresu &table[0] ako se ne varam (provereno par puta) - ali svejedno provericu jos jednom

Ovaj deo koda nisam ja radio, vec kolega koji se bavi asm-om (meni asm i nije jaca strana :-)


Hvala na odgovorima - probacu sutra to da sredim (mada i nije neki priority...)


Za lokalne promenljive se adresa racuna i preko EBP valjda ako me pamcenje drzi :)

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
207.46.137.*



+18 Profil

icon Re: Neobican problem (mix C i ASM)09.12.2002. u 20:07 - pre 260 meseci
Ovo sam koristio kao program za testiranje na VC7 - to je valjda to (bez DWORD PTR):

Code:

float table[12123];

int _tmain(int argc, _TCHAR* argv[])
{
    int result;
    table[0]=1;
    _asm
    {
        mov edx, table
        mov result, edx
    }
    printf("mov edx, table = %08X\n",result);

    _asm
    {
        lea edx, table
        mov result, edx
    }
    printf("lea edx, table = %08X\n",result);
    printf("table          = %08X\n",table);
    return 0;
}

Output:


mov edx, table = 3F800000
lea edx, table = 0042C880
table          = 0042C880
 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
*.rcub.bg.ac.yu

ICQ: 44582291


+58 Profil

icon Re: Neobican problem (mix C i ASM)12.12.2002. u 23:28 - pre 260 meseci
jel problem resen i kako?
-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.sc.philips.com



+1001 Profil

icon Re: Neobican problem (mix C i ASM)16.12.2002. u 21:26 - pre 260 meseci
Ivane,

mozda je ovo u pitanju:

Ako u vecem projektu upotrebljavas MMX instrukcije, one koriste floating point registre, i na neki nacin 'otkacinju' FP unit od pristupa tim registrima. Naravno, procesor se moze izbaciti iz tog 'okupatorskog' moda tako sto se stavi da po izlasku iz MMX rutine izvrsi 'emms' instrukciju.

Meni su se desavale slicne stvari: napravim funkciju u MMX-u, i kad izadjem iz nje dobijem totalni haos - najprostija floating point instrukcija nije htela da radi kako treba. Setim se i zavrsim MMX kod sa emms, i sve je opet kako treba.

Javi sta si uradio.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net



+7176 Profil

icon Re: Neobican problem (mix C i ASM)16.12.2002. u 21:32 - pre 260 meseci
Hmm, kod koristi MMX i SIMD, ali iskljucivo kroz Intel IPP library, pretpostavljam da IPP uvek uradi emms pre izlaza inace bi nastao totalni haos.

Problem jos nije resen, ali nije na nekom prioritetu tako da cu se sa njim pozabaviti sledece godine :)

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

[es] :: C/C++ programiranje :: Neobican problem (mix C i ASM)

[ Pregleda: 3534 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.