Virtual Dynamic

ViDy_

Avainsanojen Virtual ja Dynamic vertailu
Mitä eroa?
Miten käyttötarkoitus eroaa?
Hyödyt/haita?

14

784

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • avainsana

      Noiden ero on lähinnä muistin käytössä ja nopeudessa Dynamic käyttää vähemmän muistia Virtual taas enemmän mutta on nopeampi,liittyy siis siihen miten luokkia käsitellään, kumpi parempi riippuu siis ihan käyttötarkoituksesta ja sovelluksesta.

      • moloaivo

        Eli siis dynamic on menneen talven lumia, ja virtual jyrää, olisi kiva nähdä käytännössä
        mitä kääntäjä tekee noiden parametrien kanssa.

        Asiasta toiseen ABSTRACT- luokka/metodi on hyvä asia, helpottaa käytännön tiimissä paljon...


      • avainsana
        moloaivo kirjoitti:

        Eli siis dynamic on menneen talven lumia, ja virtual jyrää, olisi kiva nähdä käytännössä
        mitä kääntäjä tekee noiden parametrien kanssa.

        Asiasta toiseen ABSTRACT- luokka/metodi on hyvä asia, helpottaa käytännön tiimissä paljon...

        Ei ole menneen talven lumia, jos olisi se olisi jo poitettu, sillä joskus riipuen sovellukseksesta se voi olla todella paikallaan, ja niin siis se erohan on siinä miten niitä muistissa käsitellään.


      • Kysymys?_

        Kuinka paljon nopeampi on virtual?
        Miten paljon dynamic vie vähemmän muistia?


      • .....
        Kysymys?_ kirjoitti:

        Kuinka paljon nopeampi on virtual?
        Miten paljon dynamic vie vähemmän muistia?

        turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.


      • meni....
        ..... kirjoitti:

        turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.

        Kaikki meni niin päin v:ua kun vain mahdollista!


      • .......
        meni.... kirjoitti:

        Kaikki meni niin päin v:ua kun vain mahdollista!

        no kiva, kerro sitten oma käsityksesi asiasta, mutta ei ole minun syy jos olet käsittänyt asiat päin vittua.


      • -_.|._-
        ..... kirjoitti:

        turha tollasiin juuttua miettimään ellei kyseessä sitten ole erityisen kompaktille laitteelle tuleva sovellus missä rahalliset resurssit, nopeusero on lähinnä nimellinen. virtuaalimetodit on hitaampia kutsua, koska metodin koodin alkuosoite pitää hakea luokan virtuaalimetoditaulukosta jotta se osaa ajon aikana kutsun yhteydessä valita oikean ylikirjoitetun metodin. dynamic taas tietää jo käännösvaiheessa oikean metodin. virtuaalikutsu on ehkä 20-30% hitaampi, joten tietenkään missään nopeissa algoritmeissä niitä ei kannata käyttää.

        Dynamic optimoi muistin kulutuksen
        ja virtual optimoi nopeuden

        http://www.delphibasics.co.uk/RTL.asp?Name=Dynamic

        http://www.delphibasics.co.uk/RTL.asp?Name=Virtual


    • ak kaa

      Jos kerran Pascal:ssa voi ohjelmoija valita kumpaa tapaa käyttää niin entäpä muissa kielissä?

    • Onko tietoa?

      Miten on ? Voiko samassa luokassa käyttää
      eri tapoja ristiin? Eli virtual toisessa metodissa ja dynmic toisessa?

      • DelphiGuru

        "Voiko samassa luokassa käyttää
        eri tapoja ristiin? Eli virtual toisessa metodissa ja dynamic toisessa?"

        Kyllä voi!

        mutta em. selitys oli tosiaan hieman pielessä.

        Siis ne metodit, joita EI ole määritelty kummallakaan, sen paremmin virtual kuin dynamic -avainsanallakaan, niiden osalta kääntäjä laittaa suoraan oikean kutsuosoitteen paikalleen, joten ajoaikana kutsu on nopein mahdollinen eikä se vie ylimääräistä muistitilaakaan.

        Valitettavasti tuon huono puoli on tämä:

        type
        TElain = class

        procedure TuotaAani;
        procedure Aantele;

        end;

        TKoira = class(TElain)

        procedure TuotaAani;

        end;

        TKissa = class(TElain)

        procedure TuotaAani;

        end;


        procedure TElain.TuotaAani;
        begin
        WriteLn('Oletusääni !!!');
        end;

        procedure TElain.Aantele;
        begin
        TuotaAani;
        end;

        procedure TKoira.TuotaAani;
        begin
        WriteLn('Hau !');
        end;

        procedure TKissa.TuotaAani;
        begin
        WriteLn('Miau !');
        end;

        Nyt jos teet näin:

        var
        Mirre : TKissa;

        begin
        Mirre := TKissa.Create;
        Mirre.Aantele;
        end;

        Niin tuo ohjelma tulostaa:

        Oletusääni !!!

        Eli tuo Mirre.Aantele kutsuu suoraan TElain.Aantele

        Ja koska TElain.Aantele -metodia ei ole muutettu muissa luokissa, se kutsuu aina TElain.TuotaAani;

        Eli ohjelma ei toimi kuten käyttäjä ehkä olettaisi.

        em. esimerkissä tuo TElain.TuotaAani;

        pitää määritellä joko virtual tai dynamic -avainsanalla, ja vastaavasti TKoira.TuotaAani; ja TKissa.TuotaAani; override:llä.

        Tällöin ohjelma toimii halutulla tavalla.

        erona on tämä:

        Jos käytät:

        virtual;

        -määrettä, niin sen luokan, jossa ko. metodi on määritelty, ja kaikkien siitä (suoraan tai välillisesti) perittyjen luokkien virtuaalimetoditaulukossa on tuon metodin luokkakohtainen toteutusosoite, eli siis erikseen:

        TElain.TuotaAani;
        TKoira.TuotaAani;
        TKissa.TuotaAani;

        Jos taas käytät dynamic -avainsanaa, silloin sen luokan, jossa ko. dynaaminen metodi on alunperin määritelty JA jokaisen sellaisen siitä (suoraan tai välillisesti) perittyjen luokkien, jossa ko. metodi on uudelleenmääritelty (override),

        dynaamisten metodien taulukossa on tuon metodin luokkakohtainen toteutusosoite.

        Tässä tapauksessa ei siis paljon eroa, mutta jos olisi vaikkapa:

        TMustakissa = class(TKissa)

        ja

        TValkoinenKissa = class(TKissa)

        ja oletetaan, että ko. TuotaAani; -metodia EI ole näissä uudelleenmääritelty, niin virtual -avainsanaa käytettäessä tulee virtuaalimetoditaulukkoon silti lisämerkinnät:

        TMustakissa.TuotaAani;

        TValkoinenKissa.TuotaAani;

        Sensijaan dynamic -tapaa käytettäessä TMustakissa ja TValkoinenKissa -luokkiin EI tule merkintää TuotaAani; -metodista (koska sitä ei muutettu).

        Siksi dynamic kuluttaa vähemmän muistitilaa, kun metodiosoitteita ei tarpeettomasti kopioida uusien perytettyjen luokkien taulukkoon jos ko. metodia ei ole ko. luokassa uudelleenmääritelty.

        Mutta samasta syystä, koska dynamic -tavalla ei ole vakiopaikkaa mistä metodin koodin osoite löytyy, niin sen hakeminen on monimutkaisempi (ja siksi hitaampi) prosessi.

        WIN32 -ympäristöstä en ole ihan varma, mutta aikanaan WIN16 -ympäristössä (= Delphi 1.0 ) oli muistaakseni niin, että message -avainsanalla saattoi määritellä käsittelijän windows -viesteille 0..32767 ja 16-bittiset arvot 32768..65535 oli varattu dynaamisten metodien käsittelylle.

        Eli dynaamiset metodit ja suoramääritellyt windows -viestien käsittelijät oli rakennettu kääntäjän puolelta samalla tavalla, mutta arvoalue oli jaettu kahtia, toinen alue dynaamisten metodien ja toinen windows -viestikäsittelijöiden tarpeisiin.

        Kun WIN32 -aikakaudella kokonaislukujen "luonnollisin" koko on 32 bittiä, tuo asia on hieman muuttunut.

        Mutta edelleenkin Delphistä löytyy (VCL:n lähdekoodi) tällaista:

        procedure WMPaint(var Message:TWMPaint) message WM_Paint;

        Asiaa voit itse tutkia ajamalla ohjelmaasi Delphin integroidussa debuggerissa, ja sieltä:

        View/ Debug Windows / CPU

        Tällöin näet, millaista konekielikoodia Delphi mistäkin Objectpascal -koodinpätkästä tuottaa!

        Toivottavasti asia tuli selväksi !


      • kiinnostunut_dx
        DelphiGuru kirjoitti:

        "Voiko samassa luokassa käyttää
        eri tapoja ristiin? Eli virtual toisessa metodissa ja dynamic toisessa?"

        Kyllä voi!

        mutta em. selitys oli tosiaan hieman pielessä.

        Siis ne metodit, joita EI ole määritelty kummallakaan, sen paremmin virtual kuin dynamic -avainsanallakaan, niiden osalta kääntäjä laittaa suoraan oikean kutsuosoitteen paikalleen, joten ajoaikana kutsu on nopein mahdollinen eikä se vie ylimääräistä muistitilaakaan.

        Valitettavasti tuon huono puoli on tämä:

        type
        TElain = class

        procedure TuotaAani;
        procedure Aantele;

        end;

        TKoira = class(TElain)

        procedure TuotaAani;

        end;

        TKissa = class(TElain)

        procedure TuotaAani;

        end;


        procedure TElain.TuotaAani;
        begin
        WriteLn('Oletusääni !!!');
        end;

        procedure TElain.Aantele;
        begin
        TuotaAani;
        end;

        procedure TKoira.TuotaAani;
        begin
        WriteLn('Hau !');
        end;

        procedure TKissa.TuotaAani;
        begin
        WriteLn('Miau !');
        end;

        Nyt jos teet näin:

        var
        Mirre : TKissa;

        begin
        Mirre := TKissa.Create;
        Mirre.Aantele;
        end;

        Niin tuo ohjelma tulostaa:

        Oletusääni !!!

        Eli tuo Mirre.Aantele kutsuu suoraan TElain.Aantele

        Ja koska TElain.Aantele -metodia ei ole muutettu muissa luokissa, se kutsuu aina TElain.TuotaAani;

        Eli ohjelma ei toimi kuten käyttäjä ehkä olettaisi.

        em. esimerkissä tuo TElain.TuotaAani;

        pitää määritellä joko virtual tai dynamic -avainsanalla, ja vastaavasti TKoira.TuotaAani; ja TKissa.TuotaAani; override:llä.

        Tällöin ohjelma toimii halutulla tavalla.

        erona on tämä:

        Jos käytät:

        virtual;

        -määrettä, niin sen luokan, jossa ko. metodi on määritelty, ja kaikkien siitä (suoraan tai välillisesti) perittyjen luokkien virtuaalimetoditaulukossa on tuon metodin luokkakohtainen toteutusosoite, eli siis erikseen:

        TElain.TuotaAani;
        TKoira.TuotaAani;
        TKissa.TuotaAani;

        Jos taas käytät dynamic -avainsanaa, silloin sen luokan, jossa ko. dynaaminen metodi on alunperin määritelty JA jokaisen sellaisen siitä (suoraan tai välillisesti) perittyjen luokkien, jossa ko. metodi on uudelleenmääritelty (override),

        dynaamisten metodien taulukossa on tuon metodin luokkakohtainen toteutusosoite.

        Tässä tapauksessa ei siis paljon eroa, mutta jos olisi vaikkapa:

        TMustakissa = class(TKissa)

        ja

        TValkoinenKissa = class(TKissa)

        ja oletetaan, että ko. TuotaAani; -metodia EI ole näissä uudelleenmääritelty, niin virtual -avainsanaa käytettäessä tulee virtuaalimetoditaulukkoon silti lisämerkinnät:

        TMustakissa.TuotaAani;

        TValkoinenKissa.TuotaAani;

        Sensijaan dynamic -tapaa käytettäessä TMustakissa ja TValkoinenKissa -luokkiin EI tule merkintää TuotaAani; -metodista (koska sitä ei muutettu).

        Siksi dynamic kuluttaa vähemmän muistitilaa, kun metodiosoitteita ei tarpeettomasti kopioida uusien perytettyjen luokkien taulukkoon jos ko. metodia ei ole ko. luokassa uudelleenmääritelty.

        Mutta samasta syystä, koska dynamic -tavalla ei ole vakiopaikkaa mistä metodin koodin osoite löytyy, niin sen hakeminen on monimutkaisempi (ja siksi hitaampi) prosessi.

        WIN32 -ympäristöstä en ole ihan varma, mutta aikanaan WIN16 -ympäristössä (= Delphi 1.0 ) oli muistaakseni niin, että message -avainsanalla saattoi määritellä käsittelijän windows -viesteille 0..32767 ja 16-bittiset arvot 32768..65535 oli varattu dynaamisten metodien käsittelylle.

        Eli dynaamiset metodit ja suoramääritellyt windows -viestien käsittelijät oli rakennettu kääntäjän puolelta samalla tavalla, mutta arvoalue oli jaettu kahtia, toinen alue dynaamisten metodien ja toinen windows -viestikäsittelijöiden tarpeisiin.

        Kun WIN32 -aikakaudella kokonaislukujen "luonnollisin" koko on 32 bittiä, tuo asia on hieman muuttunut.

        Mutta edelleenkin Delphistä löytyy (VCL:n lähdekoodi) tällaista:

        procedure WMPaint(var Message:TWMPaint) message WM_Paint;

        Asiaa voit itse tutkia ajamalla ohjelmaasi Delphin integroidussa debuggerissa, ja sieltä:

        View/ Debug Windows / CPU

        Tällöin näet, millaista konekielikoodia Delphi mistäkin Objectpascal -koodinpätkästä tuottaa!

        Toivottavasti asia tuli selväksi !

        Alla on sama koodi kuin delphin ohjeessa, kertoo aika hienosti dynaamisen ja virtuaalisen kutsun eron, mutta osaako joku tarkentaa noita asm-lauseita, tuo perus asm:n syntaksin ymmärrän, hallitsen monet ylemmät kielet 5v kokemuksella ja lähinnä siksi tässä yritän päästä kiinni tuohon delphin asm:iin, eli olen kommentoinut tuonne epäselvyyksiä suomeksi (Eng. Kieliset ovat D:n ohjeesta kopioitu).

        type
        TExample = class
        procedure DynamicMethod; dynamic;
        procedure VirtualMethod; virtual;
        end;
        ...............
        procedure TExample.DynamicMethod;
        begin
        end;

        procedure TExample.VirtualMethod;
        begin
        end;

        procedure CallDynamicMethod(e: TExample);
        asm
        // Save ESI register
        PUSH ESI

        // Instance pointer needs to be in EAX
        MOV EAX, e


        // MIKÄ ON JA MISTÄ TULEE: DMTINDEX //

        // DMT entry index needs to be in (E)SI
        MOV ESI, DMTINDEX TExample.DynamicMethod

        // Now call the method
        CALL System.@CallDynaInst

        // Restore ESI register
        POP ESI
        end;

        procedure CallVirtualMethod(e: TExample);
        asm
        // Instance pointer needs to be in EAX
        MOV EAX, e

        // MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT //

        // Retrieve VMT table entry
        MOV EDX, [EAX]

        // VMTOFFSET JA NUO HAKASET ?//

        // Now call the method at offset VMTOFFSET
        CALL DWORD PTR [EDX VMTOFFSET TExample.VirtualMethod]
        end;

        procedure TForm1.Button1Click(Sender: TObject);
        var
        e: TExample;
        begin
        e := TExample.Create;
        try
        CallDynamicMethod(e);
        CallVirtualMethod(e);
        finally
        e.Free;
        end;
        end;


      • Delphiguru
        kiinnostunut_dx kirjoitti:

        Alla on sama koodi kuin delphin ohjeessa, kertoo aika hienosti dynaamisen ja virtuaalisen kutsun eron, mutta osaako joku tarkentaa noita asm-lauseita, tuo perus asm:n syntaksin ymmärrän, hallitsen monet ylemmät kielet 5v kokemuksella ja lähinnä siksi tässä yritän päästä kiinni tuohon delphin asm:iin, eli olen kommentoinut tuonne epäselvyyksiä suomeksi (Eng. Kieliset ovat D:n ohjeesta kopioitu).

        type
        TExample = class
        procedure DynamicMethod; dynamic;
        procedure VirtualMethod; virtual;
        end;
        ...............
        procedure TExample.DynamicMethod;
        begin
        end;

        procedure TExample.VirtualMethod;
        begin
        end;

        procedure CallDynamicMethod(e: TExample);
        asm
        // Save ESI register
        PUSH ESI

        // Instance pointer needs to be in EAX
        MOV EAX, e


        // MIKÄ ON JA MISTÄ TULEE: DMTINDEX //

        // DMT entry index needs to be in (E)SI
        MOV ESI, DMTINDEX TExample.DynamicMethod

        // Now call the method
        CALL System.@CallDynaInst

        // Restore ESI register
        POP ESI
        end;

        procedure CallVirtualMethod(e: TExample);
        asm
        // Instance pointer needs to be in EAX
        MOV EAX, e

        // MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT //

        // Retrieve VMT table entry
        MOV EDX, [EAX]

        // VMTOFFSET JA NUO HAKASET ?//

        // Now call the method at offset VMTOFFSET
        CALL DWORD PTR [EDX VMTOFFSET TExample.VirtualMethod]
        end;

        procedure TForm1.Button1Click(Sender: TObject);
        var
        e: TExample;
        begin
        e := TExample.Create;
        try
        CallDynamicMethod(e);
        CallVirtualMethod(e);
        finally
        e.Free;
        end;
        end;

        1. Dynaamisista metodeista:

        Aina, kun lähdekoodissa metodin määrittelyssä käytetään dynamic -avainsanaa, niin Delphi lisää yhden tietueen ohjelman dynaamisten metodien taulukkoon.

        Tuossa taulukossa on siis jokaista dynaamista metodia kohden ainakin:

        a) metodin kutsuosoite
        b) metodin dynaaminen indeksi

        tuo b) voi alkaa nollasta tai ykkösestä, en tiedä kummasta alkaa, mutta jokainen uusi määritelty dynaaminen metodi luo siis yhden uuden tietueen tuohon (=alkion) tuohon taulukkoon ja tuossa uudessa tietueessa tuo indeksi on yhtä suurempi kuin edellisen taulukon tietueen indeksi.

        tuo DMTINDEX siis kuvaa tuota indeksiä.

        Eli tuo

        MOV ESI, DMTINDEX TExample.DynamicMethod

        lataa ESI -rekisteriin metodia TExample.DynamicMethod kuvaavan dynaamisen indeksin, jonka perusteella System.@CallDynaInst -proseduuri etsii ko. dynaamisen metodin osoitteen dynaamisten metodien taulukosta ja jos osoite löytyy, hyppää ko. osoitteeseen.

        Tosin, jos mietit hetken, huomaat, että tuo oli tietyssä mielessä yksinkertaistettu esitys.

        Jos olisit periyttänyt TExample -luokkasi toisesta luokasta, jossa olet määritellyt ko. dynaamisen metodin ja TExample -luokassa itsessään et olisi uudelleenmääritellyt sitä, olisi koodi näyttänyt hieman toiselta (luonnollisesti).

        2.

        "MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT"

        // Retrieve VMT table entry
        MOV EDX, [EAX]

        siis...

        mov EDX, EAX (ilman hakasulkuja) kopioisi rekisterin EAX arvon rekisteriin EDX.

        sensijaan MOV EDX, [EAX] taas kopioi sen muistipaikan sisällön, johon EAX osoittaa, rekisteriin EDX.

        Eli siis:

        mov EDX,EAX ei koskaan aiheuta poikkeusta.

        Sensijaan MOV EDX, [EAX] aiheuttaa poikkeuksen, jos EAX ei osoita kelvolliseen muistiosoitteeseen.

        ...


        "VMTOFFSET JA NUO HAKASET"

        // Now call the method at offset VMTOFFSET
        CALL DWORD PTR [EDX VMTOFFSET]

        niin, siis tässä EDX osoittaa VMT (=Virtual Method Table) -taulukon alkuun, ja VMTOFFSET on offsetti VMT -taulukon sisällä, josta löytyy ko. metodin alkuosoite.

        Ja jälleen kerran, hakasulut kuvaavat (kuten assemblerissa yleensäkin), muistiosoitusta.

        Eli siis CALL -käskyn osalta tarkoittaa siis sitä, että rekisterin EDX sisältö ja tuo luku, jota kuvataan symbolilla VMTOFFSET lasketaan kyllä yhteen, mutta EI kutsuta yhteenlaskun tuloksen osoittamaa osoitetta, vaan sensijaan käytetään tuon yhteenlaskun tulosta muistiosoitteena, josta haetaan se osoite, jota kutsutaan.

        Mutta esim. C -kieleen verrattuna assemblerinkin syntaksi on sentään vielä aika selkeää.


      • kiinnostunut_dx
        Delphiguru kirjoitti:

        1. Dynaamisista metodeista:

        Aina, kun lähdekoodissa metodin määrittelyssä käytetään dynamic -avainsanaa, niin Delphi lisää yhden tietueen ohjelman dynaamisten metodien taulukkoon.

        Tuossa taulukossa on siis jokaista dynaamista metodia kohden ainakin:

        a) metodin kutsuosoite
        b) metodin dynaaminen indeksi

        tuo b) voi alkaa nollasta tai ykkösestä, en tiedä kummasta alkaa, mutta jokainen uusi määritelty dynaaminen metodi luo siis yhden uuden tietueen tuohon (=alkion) tuohon taulukkoon ja tuossa uudessa tietueessa tuo indeksi on yhtä suurempi kuin edellisen taulukon tietueen indeksi.

        tuo DMTINDEX siis kuvaa tuota indeksiä.

        Eli tuo

        MOV ESI, DMTINDEX TExample.DynamicMethod

        lataa ESI -rekisteriin metodia TExample.DynamicMethod kuvaavan dynaamisen indeksin, jonka perusteella System.@CallDynaInst -proseduuri etsii ko. dynaamisen metodin osoitteen dynaamisten metodien taulukosta ja jos osoite löytyy, hyppää ko. osoitteeseen.

        Tosin, jos mietit hetken, huomaat, että tuo oli tietyssä mielessä yksinkertaistettu esitys.

        Jos olisit periyttänyt TExample -luokkasi toisesta luokasta, jossa olet määritellyt ko. dynaamisen metodin ja TExample -luokassa itsessään et olisi uudelleenmääritellyt sitä, olisi koodi näyttänyt hieman toiselta (luonnollisesti).

        2.

        "MITÄ NUO "[]" HAKASULUT TUOSSA TEKEVÄT"

        // Retrieve VMT table entry
        MOV EDX, [EAX]

        siis...

        mov EDX, EAX (ilman hakasulkuja) kopioisi rekisterin EAX arvon rekisteriin EDX.

        sensijaan MOV EDX, [EAX] taas kopioi sen muistipaikan sisällön, johon EAX osoittaa, rekisteriin EDX.

        Eli siis:

        mov EDX,EAX ei koskaan aiheuta poikkeusta.

        Sensijaan MOV EDX, [EAX] aiheuttaa poikkeuksen, jos EAX ei osoita kelvolliseen muistiosoitteeseen.

        ...


        "VMTOFFSET JA NUO HAKASET"

        // Now call the method at offset VMTOFFSET
        CALL DWORD PTR [EDX VMTOFFSET]

        niin, siis tässä EDX osoittaa VMT (=Virtual Method Table) -taulukon alkuun, ja VMTOFFSET on offsetti VMT -taulukon sisällä, josta löytyy ko. metodin alkuosoite.

        Ja jälleen kerran, hakasulut kuvaavat (kuten assemblerissa yleensäkin), muistiosoitusta.

        Eli siis CALL -käskyn osalta tarkoittaa siis sitä, että rekisterin EDX sisältö ja tuo luku, jota kuvataan symbolilla VMTOFFSET lasketaan kyllä yhteen, mutta EI kutsuta yhteenlaskun tuloksen osoittamaa osoitetta, vaan sensijaan käytetään tuon yhteenlaskun tulosta muistiosoitteena, josta haetaan se osoite, jota kutsutaan.

        Mutta esim. C -kieleen verrattuna assemblerinkin syntaksi on sentään vielä aika selkeää.

        Paljon kiitoksia, erittäin selkeästä ja ymmärrettävästä vastauksesta!


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      35
      4289
    2. Kuinka kauan

      Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?
      Ikävä
      114
      1586
    3. Milli-helenalla ongelmia

      Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell
      Kotimaiset julkkisjuorut
      248
      1546
    4. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      218
      1400
    5. Mitä siellä ABC on tapahtunut

      Tavallista isompi operaatio näkyy olevan kyseessä.
      Alajärvi
      35
      1266
    6. Ja taas kerran hallinto-oikeus että pieleen meni

      Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ
      Sysmä
      88
      1078
    7. Löydänköhän koskaan

      Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲
      Ikävä
      132
      1072
    8. Kun näen sinut

      tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain
      Ikävä
      47
      1054
    9. Purra saksii taas. Hän on mielipuuhassaan.

      Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht
      Maailman menoa
      267
      1031
    10. Yhdelle miehelle

      Mä kaipaan sua niin paljon. Miksi sä oot tommonen pösilö?
      Ikävä
      62
      994
    Aihe