Autor Téma: nepodporované instrukce ASM  (Přečteno 1219 krát)

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
nepodporované instrukce ASM
« kdy: 29-09-2019, 08:15:21 »
Zdravím vespolek,
poradíte mi, prosím, jak ve vestavěném assembleru volat instrukce, které nezná? x86 assembler není moje parketa, ale jestli se nepletu, je možné volat instrukce přímo pomocí OP CODE, namísto aliasu.
Takže například CPUID assembler v D5 nezná, ale mohl bych místo toho použít následující?
Kód: Delphi [Vybrat]
  1. asm
  2.   MOV     EAX, 1
  3.   DB      $00f
  4.   DB      $0a2
  5. end;
  6.  

A jak na instrukce, které pracují s operandem? Jak přepsat třeba "STMXCSR [ESP].DWord"? (STMXCSR mi asm nebere, OP CODE STMXCSR je 0F AE)
nil

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 968
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:nepodporované instrukce ASM
« Odpověď #1 kdy: 29-09-2019, 09:33:59 »
Přepsat jako sadu DB nebo DW. Případně napsat funkci v asm přeložit a připojit jako obj, to v dobách D5 bývalo obvyklé.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 968
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:nepodporované instrukce ASM
« Odpověď #2 kdy: 29-09-2019, 09:35:40 »
Např. CPUID je rozepsaný se spoustě starších knihoven a komponentů

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #3 kdy: 29-09-2019, 14:20:49 »
Díky za reakci. Bohužel z toho nejsem o moc chytřejší. Jak jsem napsal, x86 assembler moc nedávám :( Takže například to CPUID mám rozepsané dobře? Mám k dispozici docela dost free knihoven (JCL a pod.), ale nikde jsem v nich zrovna to CPUID nenašel.
Zrovna tak to STMXCSR, nevím si s tím vůbec rady. Pokud vyjdu z toho, že CPUID jsem přepsal správně, tak zkusím něco takového:
Kód: Delphi [Vybrat]
  1. db    $ae
  2. db    $0f
  3. // a jak to teď dostat do [ESP].DWord?
  4. mov   [ESP].DWord, eax   // ??
  5.  

EDIT: omlouvám se, špatně jsem hledal. V JclSysInfo.pas jsem našel ukázku alternativního volaní CPUID, takže to mám asi v podstatě správně. Dotaz ohledně STMXCSR pořád platí.
« Poslední změna: 29-09-2019, 14:28:28 od Morrison »
nil

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 968
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:nepodporované instrukce ASM
« Odpověď #4 kdy: 30-09-2019, 07:26:24 »
pomohlo by tohle?

Kód: Delphi [Vybrat]
  1.  
  2. var
  3.   CPUIDVendor: array[0..11] of Char; //ansichar
  4.   CPUIDSignature: Integer;
  5.   CPUIDFeatures: Integer;
  6.   UseMMX: Boolean;
  7.  
  8. procedure ReadCPUID;
  9. begin
  10.   asm
  11.     push ebx
  12.  
  13.     pushfd
  14.     pop eax
  15.     mov ecx,eax
  16.     xor eax,$200000
  17.     push eax
  18.     popfd
  19.     pushfd
  20.     pop eax
  21.     xor eax,ecx
  22.     jz @@exit
  23.  
  24.     mov eax,0
  25.     db $0F,$A2                  ///cpuid
  26.     cmp eax,1
  27.     jl @@exit
  28.  
  29.     {  Vendor ID  }
  30.     mov eax,0
  31.     db $0F,$A2                  ///cpuid
  32.     mov dword ptr [CPUIDVendor], ebx
  33.     mov dword ptr [CPUIDVendor+4], edx
  34.     mov dword ptr [CPUIDVendor+8], ecx
  35.  
  36.     {  Features, Signature  }
  37.     mov eax,1
  38.     db $0F,$A2                  ///cpuid
  39.     mov CPUIDSignature,eax
  40.     mov CPUIDFeatures,edx
  41.   @@exit:
  42.     pop ebx
  43.   end;
  44.   UseMMX := CPUIDFeatures and CPUIDF_MMX<>0;
  45. end;
  46.  
  47.  

existuje ještě nějaká funkce pro dekódování features

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #5 kdy: 30-09-2019, 08:28:56 »
Díky, CPUID už mám pořešené. Problém mám s tou instrukcí STMXCSR, která ukládá výsledek do cílového operandu. Tuhle instrukci assembler D5 taky nezná, takže se zase musí přepsat pomocí "db", ale jak s tím operandem?
Mnemonicky je to takhle:
Kód: Delphi [Vybrat]
  1. STMXCSR    [ESP].DWord
Jak to přepsat s DB?
Kód: Delphi [Vybrat]
  1. db $ae, $0f    [ESP].DWord     // takhle asi ne, co?
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #6 kdy: 30-09-2019, 08:34:21 »
Nebo ještě jinak, funguje to stejně jako v jiných assemblerech, že parametr můžu předat i na akumulátor?
Čili mohlo by to být třeba nějak takhle (jen tipuji, s x86 asm to fakt neumím)?
Kód: Delphi [Vybrat]
  1. ld    ptr dword [ESP]
  2. db $ae, $0F   // op code STMXCSR
  3.  
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #7 kdy: 30-09-2019, 10:11:16 »
Tak už jsem tomu přišel na kloub. Pomocí instrukce DB vkládám čistá data do spustitelného souboru, takže operand musí být její součástí.
Pokud by to někoho zajímalo, tak překlad
Kód: Delphi [Vybrat]
  1.   push eax;
  2.   STMXCSR [ESP].DWord;
  3.   pop eax
  4.  
Do Delphi 5 je to takto:
Kód: Delphi [Vybrat]
  1.   push eax;
  2.   db $0f, $AE, $1C, $24;
  3.   pop eax;
  4.  
nil

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2594
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:nepodporované instrukce ASM
« Odpověď #8 kdy: 30-09-2019, 10:42:48 »
Nebo ještě jinak, funguje to stejně jako v jiných assemblerech, že parametr můžu předat i na akumulátor?
Ne, operand je m32, cili jako u vsech ostatnich instrukci vcetne displacementu, napr.
Kód: Delphi [Vybrat]
  1. 0FAE18           stmxcsr dword ptr [eax]
  2. 0FAE1B           stmxcsr dword ptr [ebx]
  3. 0FAE5BF8         stmxcsr dword ptr [ebx-$08]
  4. 0FAE19           stmxcsr dword ptr [ecx]
  5. 0FAE1A           stmxcsr dword ptr [edx]
  6. 0FAE1E           stmxcsr dword ptr [esi]
  7. 0FAE5EF4         stmxcsr dword ptr [esi-$0c]
  8. 0FAE1F           stmxcsr dword ptr [edi]
  9. 0FAE5FF0         stmxcsr dword ptr [edi-$10]
  10. 0FAE1C24         stmxcsr dword ptr [esp]
  11. 0FAE5C24FC       stmxcsr dword ptr [esp-$04]

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #9 kdy: 30-09-2019, 10:53:21 »
Díky, tahle tabulka se mi ještě možná bude hodit kvůli těm kódům registrů.
nil

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2594
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:nepodporované instrukce ASM
« Odpověď #10 kdy: 30-09-2019, 11:34:23 »
Díky, tahle tabulka se mi ještě možná bude hodit kvůli těm kódům registrů.
Ale vzdyt je to temer v kazdem manualu o instrukcnim repertoaru jako ModeR/M byte, namatkou https://en.wikibooks.org/wiki/X86_Assembly/Machine_Language_Conversion

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #11 kdy: 30-09-2019, 12:16:49 »
Excellent
Rated 1 time
X86 asm je pro mě zatím španělskou vesnicí. Mám zkušenost jen s primitivnějšími assemblery pro PLC. Díky za odkaz ke studiu. Je učitě dobrý vědět, jak se ten strojový kód skládá. K překladu použitelnému v obstarožním D5 asm jsem se nakonec dostal tak, že jsem si to prostě hodil do Delphi XE2, které už mají novější asm a pak jsem si tam nechal zobrazit disassembled code :)
nil

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 43
    • Verze Delphi: 10.3
Re:nepodporované instrukce ASM
« Odpověď #12 kdy: 30-09-2019, 22:52:36 »
Není tedy lepší si to napsat rovnou v těch XE2? :-) Nebo třeba malou .dll napsat v XE2? Než se mořit se skládáním kódů...

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #13 kdy: 01-10-2019, 01:22:28 »
Bohužel to musí být v D5. Docela už mi leze krkem, jak moc je na nich naše firma závislá. To už není ani pravěk, to je regulérní sw fosilie. Dllka by to asi taky vyřešila, už jsem to taky párkrát aplikovat, když to nešlo jinak. Ale beru to tak, že jsem se něco nového naučil.
nil

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2349
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:nepodporované instrukce ASM
« Odpověď #14 kdy: 04-10-2019, 14:00:00 »
Bohužel to musí být v D5. Docela už mi leze krkem, jak moc je na nich naše firma závislá. To už není ani pravěk, to je regulérní sw fosilie. Dllka by to asi taky vyřešila, už jsem to taky párkrát aplikovat, když to nešlo jinak. Ale beru to tak, že jsem se něco nového naučil.

A mohu se zeptat proc ne aspon D2007? Migrace D5 - D2007 je fakt primitivni, je to posledni neunicode verze a v podstate je to rekompilace. A ten posun je fakt znacny. A jelikoz mate XE2, tak mate i D2007.

Opravdu mne to zajima.
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 273
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:nepodporované instrukce ASM
« Odpověď #15 kdy: 04-10-2019, 18:42:01 »
Už jsem to tu před časem vysvětloval. Důvodem je především snadná instalace D5 nevyžadující on-line autentifikaci. Vývojové prostředí totiž instalujeme na všechny koncové počítače (pod zaheslovaným účtem, takže právně by to mělo být OK, což nám kdysi potvrdil i tehdejší Borland). Je to proto, abychom byli schopni ladit i na místě nebo přes dálkovou správu.
nil

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:nepodporované instrukce ASM
« Odpověď #16 kdy: 04-10-2019, 18:45:54 »
A mohu se zeptat proc ne aspon D2007? Migrace D5 - D2007 je fakt primitivni, je to posledni neunicode verze a v podstate je to rekompilace. A ten posun je fakt znacny. A jelikoz mate XE2, tak mate i D2007.

Opravdu mne to zajima.
Tak třeba pro mě by to byla cena a/nebo dostupnost používaných komponent.

Plus tedy musím říct, že ten posun vidím trochu jako problematický - zase tolik zásadních zlepšení v jazyku a prostředí nevidím (z mého pohledu bych jako nepochybný přínos viděl akorát direktivy $IF, $MESSAGE a $REGION a podporu pro SOAP, sice dost hroznou [a prakticky beze změn nejméně do Delphi 10 Seattle], ale aspoň nějakou; všechno ostatní jsou mírná vylepšení, která bych třeba uvítal, ale nepředstavují pro mě kvalitativní změnu) a naopak vidím poměrně zásadní nedostatky třeba v rychlosti a stabilitě IDE. Plus samozřejmě všudypřítomné "if it ain't broke, don't fix it". Pokud bych byl v situaci, že mi někdo dá zadarmo Delphi i komponenty, tak bych přechod vážně zvažoval, ale za jiných okolností si dovedu docela dobře představit, že zůstanu u Delphi 5

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 185
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:nepodporované instrukce ASM
« Odpověď #17 kdy: 05-10-2019, 05:58:40 »
A mohu se zeptat proc ne aspon D2007? Migrace D5 - D2007 je fakt primitivni, je to posledni neunicode verze a v podstate je to rekompilace. A ten posun je fakt znacny. A jelikoz mate XE2, tak mate i D2007.

Opravdu mne to zajima.
Tak třeba pro mě by to byla cena a/nebo dostupnost používaných komponent.

Plus tedy musím říct, že ten posun vidím trochu jako problematický - zase tolik zásadních zlepšení v jazyku a prostředí nevidím (z mého pohledu bych jako nepochybný přínos viděl akorát direktivy $IF, $MESSAGE a $REGION a podporu pro SOAP, sice dost hroznou [a prakticky beze změn nejméně do Delphi 10 Seattle], ale aspoň nějakou; všechno ostatní jsou mírná vylepšení, která bych třeba uvítal, ale nepředstavují pro mě kvalitativní změnu) a naopak vidím poměrně zásadní nedostatky třeba v rychlosti a stabilitě IDE. Plus samozřejmě všudypřítomné "if it ain't broke, don't fix it". Pokud bych byl v situaci, že mi někdo dá zadarmo Delphi i komponenty, tak bych přechod vážně zvažoval, ale za jiných okolností si dovedu docela dobře představit, že zůstanu u Delphi 5

Ja odporucam Delphi 7 - je to najlepsie IDE (uplne celkovo za tie roky). Zacinal som na nom a mozem povedat, ze 99% veci funguje. Je male, rychle, bezproblemove a este aj doteraz sa pouziva a je pren mnozstvo komponentov.

Neskor som potreboval Unicode, tak som presiel na XE8, oproti D7 je pomalsie, zasekava sa a podobne, ale zase ma tu vyhodu, ze pren existuje Dark Theme co setri oci (co je pre programatorov priorita #1).
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 460
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:nepodporované instrukce ASM
« Odpověď #18 kdy: 05-10-2019, 17:36:06 »
Ja odporucam Delphi 7 - je to najlepsie IDE (uplne celkovo za tie roky). Zacinal som na nom a mozem povedat, ze 99% veci funguje. Je male, rychle, bezproblemove a este aj doteraz sa pouziva a je pren mnozstvo komponentov.

Neskor som potreboval Unicode, tak som presiel na XE8, oproti D7 je pomalsie, zasekava sa a podobne, ale zase ma tu vyhodu, ze pren existuje Dark Theme co setri oci (co je pre programatorov priorita #1).

A to este musim povedat ze XE8 bolo pre mna este ztych vsetkyh XEx a 10.x najsviznejsie, vsetky neskorsie az po 10.2 vratane mi uz zasekavaju aj obycajne skrolovanie i v tom najmansom pas  subore... Posledne 10.3 som zatial este neskusal.

Ale D7 by som naozaj nikomu neodporucal. Zacinal som s D5 ktratku chvilu, potom dlho D7. Ano nebolo to zle a potom najviac som robil na D2007 - posledna neunicode verzia - pretoze sa mi nechcelo vsetko migrovat a mal som ine dolezitejsie veci na hlave. Asi mesiac som si zvykal na ten novy vizual oproti D7 a potom sa mi v D2007 robilo velmi dobre. Cize to najnizsie IDE ktore by som odporucil tak by bolo D2007 pre tych co sa boja Unicode, v opacnom pripade by som urcite odporucil aspon XE8 a vyssie...

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2349
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:nepodporované instrukce ASM
« Odpověď #19 kdy: 06-10-2019, 23:08:50 »
...
zadarmo Delphi i komponenty, tak bych přechod vážně zvažoval, ale za jiných okolností si dovedu docela dobře představit, že zůstanu u Delphi 5

Jelikož D5 nepodporuje CommCtrl z Windows XP (a vsech naslednych win), bez ruznych patchu a pouziti FastMM je to pro normalni pouziti spise usmevne (dlouho jsem je musel podporovat) a slusne vypadajici aplikace z toho nevypne bez dalsich komponent (pricemz D5 uz nikdo davno nepodporuje).

To uz spise D7, ale stejne D2007 obsahuje zasadni zmeny v RTL, VCL a hlavne debuggeru (mel jsem o tom dvoudilny clanek na delphi.cz), bez kterych bych si ukousal spise ruce (a ta licence se da taky resit, u pozdejsich verzi uz hure).

Embarcadero MVP - Czech republic