abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 00:22 | Nová verze

    Byla vydána verze 1.96.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    včera 20:33 | IT novinky

    Společnosti IBM a Red Hat představily Project Lightwell s investicí 5 miliard dolarů. Jedná se o důvěryhodné clearingové centrum pro bezpečnost open source softwaru a zabezpečení dodavatelských řetězců s novým AI modelem a globální skupinou více než 20 000 softwarových inženýrů. Služby centra budou dostupné prostřednictvím komerčních předplatných. Project Lightwell staví na iniciativách jako Anthropic Glasswing nebo OpenAI Trust Access for Cyber.

    Ladislav Hagara | Komentářů: 1
    včera 18:22 | Nová verze

    Open source 3D herní a simulační engine Open 3D Engine (O3DE) byl vydán v nové verzi 26.05. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 11:44 | IT novinky

    Český stát by v budoucnu mohl provozovat vlastní alternativu ke komunikačním aplikacím typu WhatsApp, Signal, Telegram, Facebook Messenger a podobně. Cílem je zajistit bezpečnou datovou komunikaci pro stát a jeho důležité subjekty, jako jsou bezpečnostní složky, ministerstva a další organizace.

    Ladislav Hagara | Komentářů: 23
    včera 11:22 | Pozvánky

    Už za týden, ve čtvrtek 4. června, se v Národní technické knihovně v pražských Dejvicích uskuteční další konference věnovaná tématům spojeným s IPv6 - Den IPv6. Program akce a registrační formulář jsou k dispozici na webu akce. Kapacita konference je omezená, proto organizátoři doporučují, aby se vážní zájemci přihlásili včas (k dnešnímu dni zbývá přibližně 30 volných míst). Konferenci Den IPv6 2026 organizují i letos společně sdružení CESNET, CZ.NIC a NIX.CZ.

    VSladek | Komentářů: 1
    včera 05:22 | IT novinky

    Zařízení Steam Deck OLED bylo znovu naskladněno, ale vlivem rostoucích cen pamětí a úložišť má novou, vyšší cenovku. Steam Deck OLED 512 GB stojí nově 779 EUR (stál 569 EUR) a Steam Deck OLED 1 TB stojí 919 EUR (stál 679 EUR). Samotné zařízení se nijak nezměnilo a nové ceny tedy pouze odráží aktuální náklady na komponenty a další globální logistické výzvy, se kterými se potýká celá branže.

    Ladislav Hagara | Komentářů: 0
    27.5. 22:22 | IT novinky

    Český telekomunikační úřad zahajuje novou etapu využívání vysokofrekvenčního rádiového spektra v pásmu 26 GHz. Toto pásmo bude od 1. 7. 2026 otevřeno pro provoz moderních bezdrátových sítí, zejména sítí páté generace (5G), pevných bezdrátových přístupových sítí (FWA) a lokálních či průmyslových sítí určených například pro výrobní areály, logistická centra nebo technologické kampusy. Současně s otevřením pásma 26 GHz přistoupil ČTÚ ke zpřístupnění informací o využívání rádiových kmitočtů v tomto pásmu.

    Ladislav Hagara | Komentářů: 9
    27.5. 22:11 | IT novinky

    Logitech představil myš Signature Comfort Plus M850 L s polstrovanou opěrkou dlaně pro větší pohodlí a sadu s touto myší a klávesnicí s integrovanou opěrkou dlaní Signature Comfort Plus Combo MK880.

    Ladislav Hagara | Komentářů: 1
    27.5. 16:33 | IT novinky

    Gaël Duval se rozepsal o novinkách a plánech Murena a /e/OS. Počet uživatelů telefonů Murena a mobilního operačního systému /e/OS bez aplikací a služeb od Googlu se blíží 100 000. Ambicí je, aby se /e/OS stal třetí mobilní platformou v Evropě i na světě, s potenciálem dostat se i na PC. Blíží se vydání nové verze 4 s funkcemi zálohování a obnova, import e-mailů z Gmailu a rozpoznávání hlasu. Murena Workspace přinese videohovory, elektronický podpis a správu zařízení (MDM).

    Ladislav Hagara | Komentářů: 4
    27.5. 15:22 | Komunita

    Dnes a zítra probíhá Ubuntu Summit 26.04. Na programu je řada zajímavých přednášek. Sledovat je lze na YouTube. Úvodní slovo měli Mark Shuttleworth a Jon Seager.

    Ladislav Hagara | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (12%)
     (8%)
     (2%)
     (14%)
     (31%)
     (4%)
     (6%)
     (3%)
     (16%)
     (26%)
    Celkem 1753 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník
    Štítky: není přiřazen žádný štítek


    Vložit další komentář
    27.1.2009 10:13 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: AsmJit - Podpora pro 64 bitů
    Paradoxem je, že 8 a 16 bitovou hodnotu načíst/uložit lze

    ???

    Táto, ty de byl? V práci, já debil.
    27.1.2009 14:43 Deleted [8409] | skóre: 14 | blog: darkblog
    Rozbalit Rozbalit vše Re: AsmJit - Podpora pro 64 bitů

    Udělal jsem chybu, 8 bit samozřejmě nelze ani v x86:) (Opraveno).

    x86:
    push ax // lze
    push eax // lze
    
    x64:
    push ax // lze
    push eax // nelze
    push rax // lze
    
    27.1.2009 10:26 YYY | skóre: 29 | blog: martinek
    Rozbalit Rozbalit vše Re: AsmJit - Podpora pro 64 bitů
    Je to moc pekne. Preju hodne stesti pro dalsi vyvoj ;-)
    31.8.2009 15:07 backup
    Rozbalit Rozbalit vše Záloha: AsmJit - Podpora pro 64 bitů

    Nedávno jsem napsal zápisek o knihovně AsmJit, díky které je možné dynamicky generovat a spustit x86 assembler v C++. Knihovna byla od samého začátku psaná pro 32 bitovou X86 architekturu a kód neobsahoval ani jeden řádek, který by do budoucna ulehčil portování na 64 bitů. V dnešní době je ale podpora pro 64 bitů povinnost. Rekl bych, že se jedná o hodně důležitý prvek pro životnost jakéhokoliv projektu.

    Úvod k X64

    Architektura X64 nebyla navržená úplně od začátku, je to zjednodušeně jen obohacený 32 bitový model o 64 bitové adresy, 64 bitové operandy a 16 nových registrů. FPU je prakticky nezměněné, SSE instrukce jsou obohacené o 8 nových SSE registrů (XMM8 až XMM15) a klasické instrukce jsou obohacené o dalších 8 GP (general purpose) registrů (R8 až R15). U GP registrů je velice zajímavé, že to nejsou jen 64 bitové varianty, ale jako klasická architektura X86 obsahují i 32 bitové, 16 bitové a 8 bitové varianty.

    Seznam nových registrů

    • RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP - rozšíření klasických registrů (64 bitové)
    • R8 až R15 - nové 64 bitové registry
    • R8D až R15D - nové 32 bitové registry
    • R8W až R15W - nové 16 bitové registry
    • R8B až R15B - nové 8 bitové registry
    • XMM8 až XMM15 - nové 128 bitové SSE registry.

    Některé registry spolu sdílí společný prostor. Například změnou R8B registru se modifikují registry R8W, R8D a R8. Tento způsob používá X86 architektura už od začátku své existence a v programování se dá celkem dobře využít.

    Kódování nových registrů a 64 bitový mód

    Architektura X86 a kódování instrukcí je podle mě jeden velký zmatek. Držení zpětné kompatibility a postupné přidávání nových instrukcí způsobilo, že jen velmi těžko se hledá prostor pro další instrukce. To samozřejmě způsobilo, že aby bylo možné navrhnout 64 bitový mód, bylo potřeba některé (dnes nepoužívané nebo používané málo) instrukce vyhodit a popřemýšlet o napasování nových. Rozšíření registrů, které je popsané v minulém odstavci má totiž jeden velký háček. Jak kódovat 16 registrů, když pro kódování registru jsou v architektuře X86 použité pouze 3 bity (3 bity = 8 kombinací = počet registrů X86, MMX, SSE)? Návrháři vymysleli tzv. REX prefix. Jedná se o prefix, do kterého můžete vložit 4 upřesňující bity před každou instrukci.

    REX prefix je BYTE, který obsahuje bity W, R, X, B:

    • W - obsahuje velikost operandu (Width) (0 = 32 bitový, 1 = 64 bitový)
    • R - upřesňuje Register field (ModRM) (0 = index 0-7, 1 = index 8-15)
    • X - upřesňuje indeX field (SiB) (0 = index 0-7, 1 = index 8-15)
    • B - upřesňuje Base field (ModRM/SiB) (0 = index 0-7, 1 = index 8-15)

    (Index field a base field se používá pro ukazatele, pokud je operace jen registr/registr, tak se index ignoruje a base znamená zdrojový registr)

    REX prefix tedy umožňuje použití nových registrů a pro 64 bitové operace se musí použít skoro vždy (v Intel manuálu je to napsané jako promování (povýšení) instrukce - povýšíte ji do 64 bitového režimu). Zakódovat REX prefix je jednoduché (REX = 0x40 | (W << 3) | (R << 2) | (X << 1) | B). Problém byl s číslem 0x40, protože je to opkód pro jednu variantu instrukcí INC a DEC (variant existuje ale více). Architektura X64 tedy umožňuje používat jak 32 bitové, tak 64 bitové operace. Ale aby v tom nebyl háček:-) Některé instrukce jsou povýšené na 64 bitů i bez REX prefixu. Jsou to například instrukce PUSH a POP, které slouží k manipulaci se zásobníkem. Tyto instrukce se nadají přepnout do 32 bitového režimu a na zásobník tak není možné uložit/načíst obsah 32 bitového registru. Paradoxem je, že 16 bitovou hodnotu načíst/uložit lze (a samozřejmě 64 bitů).

    REX prefix má ještě další háček. Architektura X86 obsahuje více možností, jak prefixovat instrukce. Některé instrukce se pomocí prefixu 0x66 přepínají do 16 bitového režimu a některé MMX/SSE funkce používají speciální prefix 0xF3, 0xF2 a 0x66, který se ovšem v manuálech zapisuje jako opkód instrukce. Takže například pro instrukci psbsb(), kde opkód je v manuálu v podobě 0x66 0x0F 0x38 0x1C se REX prefix musí vložit mezi 0x66 a 0x0F.

    Implementace v AsmJit

    Když jsem začal vytvářet knihovnu AsmJit, vycházel jsem hlavně z kódu ve V8, který je čistě 32bitový. Experimenty pro podporu 64 bitů začaly pár dní zpět, kdy jsem se rozhodl počíst si Intel SW Developer Manual, a začal jsem studovat, co to ten REX prefix vlastně je, a co všechno je potřeba udělat. Největší problém byl v návrhu generování instrukcí, kdy skoro každá instrukce vypadala nějak takto:

      //! @brief Packed Shuffle Bytes (SSSE3).
      void palignr(const XMMRegister& dst, const Op& src, int imm8)
      {
        ASMJIT_ASSERT((src.op() == OP_REG && 
                       src.regType() == REG_SSE) || 
                      (src.op() == OP_MEM));
        if (!ensureSpace()) return;
    
        emitByte(0x66);
        emitByte(0x0F);
        emitByte(0x3A);
        emitByte(0x0F);
        emitOp(dst.regCode(), src);
        emitByte(imm8 & 0xFF);
      }
    
    

    Pro mě to bylo velmi čitelné, věděl jsem přesně, z jakých částí se instrukce skládá a v jakém pořadí. Napsat ale kód pro REX prefix ke každé instrukci by vedlo jen k nepřehlednosti, tak jsem musel návrh změnit. Napsal jsem pár funkcí, které vygenerují kompletní instrukci ze vstupu, který obsahuje opkódy a operandy. Kód se tedy změnil ve většině případech do tohoto tvaru:

      //! @brief Packed Shuffle Bytes (SSSE3).
      void palignr(const XMMRegister& dst, const Op& src, int imm8)
      {
        ASMJIT_ASSERT((src.op() == OP_REG &&
                       src.regType() == REG_SSE) || 
                      (src.op() == OP_MEM));
        emitMMi(0x66, 0x0F, 0x3A, 0x0F, dst.regCode(), src, imm8);
      }
    

    Funkce emitMM/emitMMi (používá se pro MMX a SSE) emituje kompletní binární kód instrukce. První parametr je prefix (protože REX prefix se dává až za tento prefix), další parametry jsou opkód instrukce, zdrojový registr, operand, a popřípadě 8 bitové upřesňující číslo. Pokud je prefix nebo první opkód nula, tak se nepoužije (instrukce mají totiž různou délku opkódů).

    Toto byl ten lepší případ, některé instrukce jsem musel předělat ručně, takže korektnost všech instrukcí ukáže až čas. Výhoda v AsmJit jsou asserty, které kontrolují vstupní parametry, minimalizuje se tím šance, že vám některá funkce vygeneruje neplatný opkód.

    Podpora pro 64 bitů ale neznamenala jen použít REX prefix. Některé části kódu jsem musel přepsat tak, aby bylo možné používat i 64 bitové proměnné. Starý kód používal na hodně místech int, protože se jednalo u 32 bitový X86 assembler. Nový kód používá typ SysInt, který je 32bitový nebo 64bitový podle cílové architektury (použil bych long, ale ten je pod Windows 32 bitů vždy). Bohužel se kód neobešel bez těchto maker:

    // [AsmJit - Types]
    namespace AsmJit
    {
      typedef char Int8;
      typedef unsigned char UInt8;
      typedef short Int16;
      typedef unsigned short UInt16;
      typedef int Int32;
      typedef unsigned int UInt32;
    
    #if defined(_MSC_VER)
      typedef __int64 Int64;
      typedef unsigned __int64 UInt64;
    #else // GCC, other compilers ?
      typedef long long Int64;
      typedef unsigned long long UInt64;
    #endif
    
    #if defined(ASMJIT_X86)
      typedef Int32 SysInt;
      typedef UInt32 SysUInt;
    #else
      typedef Int64 SysInt;
      typedef UInt64 SysUInt;
    #endif
    }
    
    #if defined(_MSC_VER)
    # define ASMJIT_INT64_C(num) num##i64
    # define ASMJIT_UINT64_C(num) num##ui64
    #else
    # define ASMJIT_INT64_C(num) num##LL
    # define ASMJIT_UINT64_C(num) num##ULL
    #endif
    

    Taky používáte něco podobného ve vašich programech:-) ?

    Použití AsmJit pro X64

    Používání AsmJit se nijak neliší od 32bitové verze. Je ale potřeba si uvědomit, že 64bitový režim je trochu jiný. Dřív, než se spálíte, by asi bylo dobré si přečíst nějakou dokumentaci pro přechod na X64. Asi nejdůležitější je vědět, že registry, kde máte ukazatele, už nezačínají písmenem 'e', ale písmenem 'r'. Následuje příklad z původního zápisku, přepsaný pro 64 bitů:

      X86 a;
    
      // Prolog.
      a.push(rbp);
      a.mov(rbp, rsp);
    
      // Move 1024 to rax (return value)
      a.mov(rax, 1024);
    
      // Epilog
      a.mov(rsp, rbp);
      a.pop(rbp);
      a.ret();
    

    Můžete si všimnout, že v takto triviálním příkladu jsou veškeré změny jen přepsání registrů z 'e' na 'r'. Aby bylo snadnější psát assembler více přenositelně, nabízí AsmJit malé rozšíření v podobě nativních registrů. Nativní registr je registr o bitové velikosti 32 nebo 64 bitů v závislosti na současné architektuře. První písmeno takového registru je 'n', tedy nax, nbx, ncx, atd. (to n má být jako nativní, pokud máte návrh na lepší písmenko, tak napište do diskuze). Ukázkový kód by se tedy dal přepsat tak, aby podporoval 32 a 64 bitů současně:

      X86 a;
    
      // Prolog.
      a.push(nbp);
      a.mov(nbp, nsp);
    
      // Move 1024 to eax/rax (return value)
      a.mov(nax, 1024);
    
      // Epilog
      a.mov(nsp, nbp);
      a.pop(nbp);
      a.ret();
    

    Pokračování příště...

    Jako pokračování v tomto tématu bych se už nechtěl věnovat implementaci AsmJit, ale použití. Mám přepravený malý kód, který zkompiluje matematický výraz do X86/X64 kódu a pak jej vyhodnotí.

    Zdroj

    Adresa projektu je http://code.google.com/p/asmjit/. Verze, která podporuje X64 architekturu, je 0.3 nebo SVN.

    Zajímavosti v X64

    • X86 nebo X64 instrukce musí být zakódovaná maximálně do 15 BYTŮ.
    • Číselné konstanty jsou v mnoha případech v instrukcích zakódovány maximálně v 32 bitech, i když je cílová instrukce čistě 64bitová.
    • Procesory od AMD jsou schopné přeskočit 15 nop instrukcí v jednom cyklu (Intel nevím)
    • Instrukce ENTER a LEAVE, vytvořené pro vstup a návrat z funkce, se nepoužívají, protože jsou pomalé.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.