Virtual Dynamic

ViDy_

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

14

747

    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. Istuva kansanedustaja epäiltynä pahoinpitelystä ja ampuma-aserikoksesta

      Seiskan tietojen mukaan Timo Vornanen on epäiltynä pahoinpitelystä ja ampuma-aserikoksesta eikä kenellekään taatusti tul
      Maailman menoa
      432
      3105
    2. Timo Vornanen kilahti

      Mikähän sille kansanedustajalle polisiisi miehelle on noin pahasti mennyt hermot , että tulevaisuudensa pilasi totaalise
      Kotka
      107
      2492
    3. Tollokin tajuaa että Timo Vornanen

      oli joutunut äärimmäiseen tilanteeseen ampuessaa yhden laukauksen katuun. Ei poliisi tee tuollaista hetken mielijohteest
      Maailman menoa
      368
      2306
    4. Pullonpalautusjärjestelmä muuttuu - paluu menneisyyteen

      EU suuressa viisaudessaan on päättänyt, että pulloja pitää kierrättää. Jos oikein ymmärsin, nykyisen järjestelmänmme ti
      Maailman menoa
      158
      2025
    5. Sininen farmari - Ford Focus- YFB-842 on poliisilta kadoksissa Kauhajärvellä

      https://alibi.fi/uutiset/poliisilta-poikkeuksellinen-vihjepyynto-autossa-oleva-henkilo-on-avuntarpeessa/?shared=29255-2d
      Lapua
      7
      1847
    6. Onko oikeudenmukaista? Yhdellä taholla yllättävä valta-asema Tähdet, tähdet -voittajan valinnassa!

      Näinpä, onko sinusta tämä oikein? Viime jaksossakin voittaja selvisi vain yhden äänen erolla ja tänä sunnuntaina ensimm
      Tv-sarjat
      23
      1277
    7. 166
      1255
    8. No kerros nyt nainen

      Kumpi mielestäsi oli se joka väärinkäsitti kaiken? Nyt voi olla jo rehellinen kun koko tilanne on jo lähes haihtunut.
      Ikävä
      97
      1176
    9. Persukansanedustaja Timo Vornanen ammuskellut Helsingissä

      Poliisi siviiliammatiltaan, luvallinen ase mukana baarissa tällä hemmetin valopääpersulla. Meni eduskunnasta suoraan baa
      Haapavesi
      72
      1111
    10. Nainen, mietit miten minä jaksan

      En voi hyvin. Nykyään elämäni on lähinnä selviytymistä tunnista ja päivästä toiseen. Usein tulee epävarma olo, että mite
      Ikävä
      88
      967
    Aihe