Delphillä assemblerin+merkkijonojen käyttö helppoa !

Delphifani80

Delphillä myös assemblerin käyttö koodissa on helppoa, kuten (myös binääristen) merkkijonojenkin !

Seuraava funktio esimerkiksi palauttaa merkkojonon, jonka arvo on prosessoristasi riippuen esim.

'genuineIntel'
'AuthenticAmd' jne ...

function CpuBrandID:String;
begin
SetLength(Result, 12);
asm
push EBX
push EDI
mov EAX,Result
mov EDI,[eax]
xor EAX,EAX
CPUID
cld
mov [edi], ebx
mov [edi 4], edx
mov [edi 8], ecx
pop EDI
pop EBX
end;
end;

Samalla paljastuu se asia, että vaikka objectpascalissa voikin tehdä tyyppimuunnoksen tähän tapaan:

var
St1 : String;
P : PChar;

begin
St1 := CpuBrandID;
P := PChar(St1);
end;

niin konekielikoodin kannalta tuo string onkin enemmänkin PPChar kuin PChar !

C-koodaajille siis:

enemmänkin char ** kuin char * !

Kuitenkin, jos Delphi -koodi ja C -koodi pitää saada keskustelemaan keskenään, niin yleensä homma kuitenkin hoidetaan näin:

### jokudll.c tai jokudll.cpp:

#ifdef CPP
extern "C" {
#endif

void omafunktio(char * Value) {

}

#ifdef CPP
}
#endif

...

ja sitten delphissä näin:

### jokudllimpu.pas:

unit jokudllimpu;

procedure omafunktio(Value:PChar); cdecl; external 'jokudll.dll';

tämän jälkeen kun kutsut delphissä omafunktio(PChar(St1));

niin se kutsuu jokudll.dll:ssä olevaa C:llä koodattua omafunktio -funktiota välittäen sille St1:String -muuttujan, mutta PChar:ksi muunnettuna.

huomaa: C -koodissa ei ole syytä muuttaa merkkijonoa, varsinkaan sen pituutta !

Ja jos sen arvoakaan muutetaan C-koodissa, olisi Delphissä ennen ko. funktiokutsua suoritettava:

UniqueString(St1);

Tuon UniqueString:n ansiosta C -koodi voi muuttaa muuttujan St1 arvoa, kuitenkin siten, että sen pituus ei muutu.

Jos pituutta on tarpee muuttaa C:llä, silloin pitäisi C:ssä määritellä:

int omafunktio(char * Value);

ja vastaavasti Delphissä:

function omafunktio(Value:PChar):Integer; cdecl; external 'jokudll.dll';

tällöin annetaan C -funktion palauttaa uusi pituus (joka ei saa siltikään ylittää alkuperäistä pituutta!)

ja omafunktio -kutsu delphissä pitäisi tällöin tehdä näin:

UniqueString(St1);
SetLength(St1, omafunktio(PChar(St1)));

Näin siis C:ssä voi muuttaa merkkijonon sisältöä ja/tai lyhentää sitä, mutta EI pidentää.

Delphin String EI siis oikeasti ole PChar, mutta on suunniteltu siten, että sitä voi tietyin rajoituksin kohdella PChar:na, kunhan:

a) merkkijonoa ei muuteta PChar -viittauksen kautta

tai

b) UniqueString -kutsulla varmistetaan, että merkkijonon viitteiden määrä=1, tällöin sisältöä voi muuttaa, pituutta ei.

Pituutta ei siis tule milloinkaan suoraan muuttaa PChar -viittauksen kautta, mutta toki PChar -viittauksen saava funktio voi palauttaa uuden (saman tai lyhyemmän pituuden kuin alkuper. pituus) pituuden, joka sitten Delphillä asetetaan voimaan SetLength -proseduurilla.

Huomaa myös:

St1 := 'abc'#0'def';

nyt:

length(St1) = 7,

mutta:

strlen(PChar(St1)) = 3

!!!

strlen(PChar(St1)) on yleensä sama kuin length(St1), mutta JOS St1 sisältää NULL -merkkejä eli #0 = chr(0) ( basicissa chr$(0) )

niin tällöin strlen ilmoittaa merkkien määrän ennen ensimmäistä null -merkkiä, mutta length merkkijonon koko pituuden null -merkkeineen.

Jos merkkijono voi sisältää NULL -merkkejä, tulee mahd. C -koodille välittää erikseen merkkijonon pituus kokonaislukuna, koska muuten C:ssä oletusarvoisesti ensimmäinen NULL katkaisee merkkijonon, Delphissä taas ei.

Huomaa: monet I/O -aliohjelmat (kuten windows MessageBox ja delphin omakin ShowMessage) tulkitsevat merkkijonon päättyvän NULL -merkkiin.

Näppärä toki koodaa tarvittaessa oman apufunktion, joka esim tekee merkkijonosta kopion siten, että NULL -merkin tilalle tuleekin merkkijono '' ...

0

346

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000

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

      Luetuimmat keskustelut

      1. Mikä sun salaisuus on,kun näytät niin nuorelta..

        Vaikka oot jo noin vanha!?
        Ikävä
        111
        1348
      2. MiltäKaivattusi

        Näyttää? !
        Ikävä
        45
        911
      3. Myönnetään, tunnen lämpimiä tunteita kohtaasi

        Vaikutat tosin liian hyvältä ollaksesi totta. Komeita miehiä on maailma pullollaan mutta sinussa on jotain.....
        Ikävä
        50
        736
      4. Perhoseni (miehelle)

        Miksi et usko, että mun rakkaus sinuun on aitoa ja vilpitöntä? Tai että se oli jo silloin? Miksi ajattelet, ettet ole r
        Ikävä
        132
        697
      5. Mitä meidän välillämme

        On käynyt näiden vuosien aikana?
        Ikävä
        70
        666
      6. Uskaltaisitko

        Tavata kaivattusi tässä tilanteessa?
        Ikävä
        67
        616
      7. Olen tavattavissa

        tänään klo 17-02 siinä ravintolassa. Tulethan sinäkin?
        Ikävä
        53
        607
      8. Halaus juuri sinulle

        Kaikki järjestyy kyllä. Luota vain. ❤️🫶
        Ikävä
        55
        555
      9. Onko Sofia jälleen jätetty?

        Moni asia viittaisi siihen, että hän on jälleen sinkku.
        Kotimaiset julkkisjuorut
        94
        485
      10. Mies, näetkö minut myös

        Seksuaalisena ihmisenä ja naisena? Haluatko minua seksuaalisesti? Vai olenko mielestäsi tyttönen?
        Ikävä
        20
        480
      11. Voiko se ikinä toimia

        Voiko meistä ikinä tulla mitään? Näin kauan aikaa on kulunut ja mitään ei tapahdu... En usko, että sinä mietit minua het
        Ikävä
        32
        468
      12. Meneekö unohtamis

        Projektisi hyvin??
        Ikävä
        34
        467
      13. Rekat seisovat dieselin hinnan takia . Ala ei kestä tällaista hintatasoa, sanoo yrittäjä .

        EU:n kallein diesel on kova paikka kuljetusalalle. Ajoja on jätetty ajamatta kannattavuus­ongelmien vuoksi, sanoo alan e
        Kajaani
        94
        457
      14. Mitä jos...

        Susta tykätään poikana enemmän, kun tyttönä? Miten asian käsittelet tai otat tiedon vastaan? T nainen gubetellija herät
        Sinkut
        142
        453
      15. Nainen, mitä mieltä olet kodittomista?

        Ja heistä jotka eivät kykene huolehtimaan asioistaan, itsestään eikä terveydestään? Miten heidän kanssaan tulisi toimia?
        Ikävä
        115
        453
      16. Kuka se on

        Kuhmon komein aikamies?
        Kuhmo
        5
        448
      17. Uskallatko paljastaa

        Millä nimellä löydyn puhelimestasi?
        Ikävä
        49
        447
      18. Voin tulla

        Sisustamaan sulle 🤭
        Ikävä
        51
        445
      19. Miksi jätit vastaamatta mies

        Silloin kauan sitten 😔
        Ikävä
        42
        410
      20. Et sinä mitään

        Oikeasti halua
        Ikävä
        52
        403
      Aihe