Joku vaan inttää tätä faktaa vastaan:

operaatio "XCHG EAX,EAX" on nopeampi tehtä c-kielellä ja muilla tavoin.

Kun ei perusasioita ymmärrä, niin odotan innolla c-rutiinin joka tekee tuollaisen rekisterioperaation nopeammin!
6249
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

asm("nop"); ?

Äänestä

Aivan, mutta kauanko vie aikaa tuon c-funktion kutsuminen joka tuon funktion suorittaa?

Onko silloin No Operation?

Äänestä
  • "Aivan, mutta kauanko vie aikaa tuon c-funktion kutsuminen joka tuon funktion suorittaa?"

    Tuostahan ei tule funktiokutsua. Kääntyy ihan siihen paikalleen.

    asm -jututhan ovat kyllä c-kielen lisämausteita. Jos niitä on käytettävissä, saa xchg-käskyn toimimaan tasan yhtä nopeasti C:llä. Jos ei ole, voi olla vaikeaa tehdä sellaista c-koodia, joka kääntyisi nimenomaan "xchg eax, eax" -käskyksi.

    Äänestä

Entä käskyt:

push ax
pop cs

Eli koodisegmentin muuttaminen pinon kautta, miten teet c-kielellä paremmin?

Äänestä
  • pop CS ????

    Nykyprosessoreissa tuota käskyä ei ole olemassakaan, sama konekielikoodi (1 tavu) on otettu muuhun käyttöön.

    Ainoa, missä tuo käsky on edes teoriassa ollut olemassa, on 8086 ja 8088.

    Ja niissäkin, jotta tuo tekisi mitään järkevää, pitäisi olla 2 koodisegmenttiä siten, että kun CS muutetaan mutta IP (niin, 8086/8088:ssa se on nimenomaan IP, ei EIP)

    ei muuteta, niin tuo pitää tehdä niin, että eri koodisegmentissä, mutta samassa ofssetissa kuin tuon pop CS jälkeinen käsky, on todella jotain järkevää koodia, muussa tapauksessahan tuo alkaa suorittaa satunnaista dataa konekielikoodina, ja siitä ei yleensä hyvää seuraa !

    Vaikka tuollaisen koodin oikein tekeminen on toki mahdollista, niin kuka (poikkeuksena ehkä viruskoodarit) haluaa tehdä tuota, kun JMP / CALL / RET -käskyt ovat paljon fiksumpia tapoja kun halutaan hypätä koodissa eri kohtaan suoritusta jatkamaan.

    Mutta, mitäpä C:llä sekoilemaan, Delphi assembly -yhdistelmä riittää minulle.

    Äänestä

  • Delphi+Asm! kirjoitti:

    pop CS ????

    Nykyprosessoreissa tuota käskyä ei ole olemassakaan, sama konekielikoodi (1 tavu) on otettu muuhun käyttöön.

    Ainoa, missä tuo käsky on edes teoriassa ollut olemassa, on 8086 ja 8088.

    Ja niissäkin, jotta tuo tekisi mitään järkevää, pitäisi olla 2 koodisegmenttiä siten, että kun CS muutetaan mutta IP (niin, 8086/8088:ssa se on nimenomaan IP, ei EIP)

    ei muuteta, niin tuo pitää tehdä niin, että eri koodisegmentissä, mutta samassa ofssetissa kuin tuon pop CS jälkeinen käsky, on todella jotain järkevää koodia, muussa tapauksessahan tuo alkaa suorittaa satunnaista dataa konekielikoodina, ja siitä ei yleensä hyvää seuraa !

    Vaikka tuollaisen koodin oikein tekeminen on toki mahdollista, niin kuka (poikkeuksena ehkä viruskoodarit) haluaa tehdä tuota, kun JMP / CALL / RET -käskyt ovat paljon fiksumpia tapoja kun halutaan hypätä koodissa eri kohtaan suoritusta jatkamaan.

    Mutta, mitäpä C:llä sekoilemaan, Delphi assembly -yhdistelmä riittää minulle.

    pop cs on sellainen hyppy, jolla hypätään toiseen koodiin, esim. videomuistiin suorittamaan jatkavaa koodia, esim:

    push ax
    pop cs

    Äänestä

Kommentoi aloitusta


todistatekemällä kirjoitti:

operaatio "XCHG EAX,EAX" on nopeampi tehtä c-kielellä ja muilla tavoin.

Kun ei perusasioita ymmärrä, niin odotan innolla c-rutiinin joka tekee tuollaisen rekisterioperaation nopeammin!

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu