Virtual Dynamic

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

Muut lukivat myös

Vastaukset 14

Vanhimmat

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.

Äänestä
  • 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...

    Äänestä

  • 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.

    Äänestä

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

    Äänestä

  • 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ää.

    Äänestä

  • ..... 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!

    Äänestä

  • 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.

    Äänestä

  • ..... 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

    Äänestä

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

Äänestä

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

Äänestä
  • "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 !

    Äänestä

  • 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;

    Äänestä

  • 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ää.

    Äänestä

  • 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!

    Äänestä

Kommentoi aloitusta


ViDy_ kirjoitti:

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

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