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

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 278
  • 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ů: 971
  • 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ů: 971
  • 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ů: 278
  • 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ů: 971
  • 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ů: 278
  • 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ů: 278
  • 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ů: 278
  • 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ů: 2611
  • 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ů: 278
  • 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ů: 2611
  • 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ů: 278
  • 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ů: 811
  • Karma: 45
    • 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ů: 278
  • 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ů: 2391
  • Karma: 103
    • 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