Forum Delphi.cz

Delphi => Obecné => Téma založeno: Morrison 29-09-2019, 08:15:21

Název: nepodporované instrukce ASM
Přispěvatel: Morrison 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)
Název: Re:nepodporované instrukce ASM
Přispěvatel: JaroB 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é.
Název: Re:nepodporované instrukce ASM
Přispěvatel: JaroB 29-09-2019, 09:35:40
Např. CPUID je rozepsaný se spoustě starších knihoven a komponentů
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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í.
Název: Re:nepodporované instrukce ASM
Přispěvatel: JaroB 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
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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?
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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.  
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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.  
Název: Re:nepodporované instrukce ASM
Přispěvatel: pf1957 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]
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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ů.
Název: Re:nepodporované instrukce ASM
Přispěvatel: pf1957 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 (https://en.wikibooks.org/wiki/X86_Assembly/Machine_Language_Conversion)
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 30-09-2019, 12:16:49
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 :)
Název: Re:nepodporované instrukce ASM
Přispěvatel: vandrovnik 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ů...
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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.
Název: Re:nepodporované instrukce ASM
Přispěvatel: Radek Červinka 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.
Název: Re:nepodporované instrukce ASM
Přispěvatel: Morrison 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.
Název: Re:nepodporované instrukce ASM
Přispěvatel: pepak 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
Název: Re:nepodporované instrukce ASM
Přispěvatel: Slappy 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).
Název: Re:nepodporované instrukce ASM
Přispěvatel: Daniel_Andrascik 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...
Název: Re:nepodporované instrukce ASM
Přispěvatel: Radek Červinka 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).