Java týden Java týden
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Lekce 1 - Úvod do x86 a x64 assembleru

Ostatní jazyky Assembler Úvod do x86 a x64 assembleru

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V této sérii článků chci porovnat různé typy překladačů jejich možnosti a současné použití. V dalších dílech se budu zabývat převážně tvorbou knihoven "dll" jejich vazbu na C# a C++ jak pro x86 a x64.

Hlavní důraz zaměřím na tvorbu programů x64, začlenění API funkcí do programu a optimalizace. Jako překladač assembleru budu používat EasyCode v.2. a kompilátor JwAsm. Pro C# a C++ používám Visual Studio 2015, popřípadě Visual Studio 2017.

Firma SmidgeonSoft nabízí výkonné a přitom snadno použitelné nástroje pro kontrolu vašeho kódu zdarma, musíte souhlasit s licenčními podmínkami. Windows Debugger, disassembler, kódové analyzátory můžete stáhnou zde. Jedná se o nástroje jak pro 64 bitový software tak i pro 32 bitový software. V dalších dílech se s těmito nástroji podrobněji seznámíme.

Stručný popis překladačů

Hodnocení je můj subjektivní dojem.

  • Netwide Assembler (NASM) je multiplatformní kompilátor programovacího jazyka assembler. Podporuje architekturu x86 a x86-64. Také podporuje většinu výstupních formátů. NASM zvládne velkou část instrukčních sad včetně nedokumentovaných a včetně specifických instrukcí některých procesorů. Kromě překladače má i velmi omezený dissassembler s názvem ndisasm. Pro x86 je popsán v knize "Mistrovství v jazyce assembler". Používá se také ke kompilaci do Linuxového formátu. V dnešní době je udržován malým týmem vývojářů. Z mého osobního hlediska je již zastaralý a práce s ním je pro soudobý stav instrukcí procesorů neefektivní. Je využíván převážně pro 16 a 32 bitové programy. Nedoporučuji používat.
  • MASM makro assembler je dvojprůchodový assembler. Byl vyvinut v roce 1981. Používá syntaxi Intel pro MS-DOS a Microsoft Windows. Pro x86 je popsán v knize "Mistrovství v jazyce assembler". V současné době již není samostatně na trhu, ale nejnovější verze MASM jsou součástí programu Microsoft Visual Studio. O jeho používání platí to samé jako o NASM. Nedoporučuji používat.
  • WinAsm studio je v současné době otevřeným vývojovým prostředím pro vývoj 16 a 32 bitových aplikací. Používá se pro vývoj aplikací jak pro DOS tak i Windows. Využívá plně makro assembler MASM a je doplněn řadou dalších vylepšení (optimalizován na velikost a rychlost, intellisense, možnost vytváření programů založených na Windows API). Poslední aktualizace květen 2011.
WinAsm_Studio

Úvodní obrázek výběr aplikace z assembleru WinAsm studio.

WinAsm_Studio

Ukázka WinAsm studia

WinAsm studio je vhodné pro první pokusy s tvorbou programů pro Windows. Na mém webu jsem připravil na základě dostupné literatury popis k MASM a WinAsm studio, jedná se o stažení a instalaci - Popis a použití WinAsm studio.

  • Další assembler, který jsem testoval, byl VisualMasm. Bohužel tento assembler vzhledově vypadá pěkně, ale je nedodělaný a nelze ho profesionálně používat.
  • Pokud se rozhodnete pouze pro x86 programování, pak výborný assembler je Easy Code Visual Assembler, verze 1.07, můžete ho stáhnout zde Easy Code Visual Ide . Poslední aktualizace listopad 2018. Program testován pro (Windows 95/98, ME, NT40, 2000, XP, 2003, 2008, Vista, 7, 8/8.1, 10). Využívá verzi 1.09 Masm. Úmyslně se nezmiňuji programování pro Linux, není to má parketa, jedná se o program GenSys. Program Easy Code 1.07 pracuje v režimu Unicode při spuštění v systému Windows NT a novějších systémech. Tento nový formát umožňuje snadno a rychle vytvářet aplikace Unicode (viz téma aplikace ANSI / Unicode). V obou režimech jsou ANSI nebo Unicode, editor kódů a všechny názvy a soubory související s projekty (názvy a soubory projektů, zdrojů, oken a ovládacích prvků) vždy zpracovány jako text ANSI z důvodů kompatibility. Při spuštění jako Unicode (tj. v systému Windows NT nebo novější) je dialogové okno pro otevírání a ukládání souborů také okno Unicode. Jakmile je však vybrán soubor, jeho cesta a jméno jsou vždy převedeny na ANSI, proto to prosím berte v úvahu při výběru složek nebo jmenování objektů a souborů pro vaše projekty. Easy Code 1.07 používá funkci API wsprintfW ve svých vizuálních knihovnách a verze před Masm32 v10 nezahrnula tuto funkci do souboru User32.lib. Pokud používáte Masm32 SDK, měli byste stáhnout a nainstalovat Masm32 v10 (doporučeno). Pokud tomu tak není, musíte alespoň nahradit soubory User32.inc a User32.lib těmi, které přicházejí s Masm32 v10. To nebude nutné, pokud používáte GeneSys SDK.
  • Masm32 a GeneSys, obsahují soubory polink.exe (linker), porc.exe (kompilátor prostředků) a polib.exe (kompilátor knihovny). GeneSys kromě toho obsahuje také soubor poasm.exe (kompilátor). Pro ty, kteří chtějí používat tyto vynikající věci (viz Konfigurace Easy Code v menu Tools-> Settings), berte v úvahu, že příklady, které přicházejí se systémem Easy Code, kompilují a propojují správně, pokud se oba soubory ml.exe (kompilátor) a .exe (linker) používají, protože podporují všechny syntaxe maker assembleru (Masm). Podrobný popis uvedu u EasyCode Visual assembleru verze 2.02.0.0007. Tyto popisy využívají některé části helpu pana Ramon Saly s jeho vědomím.

Easy Code Visual Assembler v.2.02.0.0007

Easy Code Visual Assembler v2.02.0.0007 32/64 bits. Poslední aktualizace provedena 16.listopadu 2018, jedná se podle mne o jeden z nejlepších assemblerů. Po instalaci vytvoří dvě ikony Easy Code 32 a druhou Easy Code 64. Podporuje kompilátory Fasm, GoAsm, JWasm, Masm, PoAsm, SolAsm i UAsm (32 i 64 bits). Přeloží instrukce MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, FPU, částečně instrukce AVX. Verze 2.00.0.0012 a novější také obsahují 64bitovou verzi softwaru EasyCode. Pokud používáte 64bitový systém Windows, budete moci spustit soubor "EasyCode64.exe" (umístěný ve složce "\EasyCode\Bin"). Obě verze 32bitové ("EasyCode.exe") a 64bitové ("EasyCode64.exe") používají stejné soubory, takže můžete pracovat s libovolným z nich, aniž byste museli provést jednu změnu (poznámka autora programu). Patrně nějaká změna existuje, jsou rozdílné velikosti souborů, autorem není popsána, osobně mám nastavenou x86 verzi na EasyCode.exe a x64 verzi na EasyCode64.exe.

Dovolte malé odbočení. Důsledně jsem testoval různé typy kompilátorů. Podle mého zjištění kompilace závisí jak na operačním systému tak hlavně na procesoru (platí pouze pro x64). Používám OS Windows 10 procesor AMD A10-Radeon R7. Některé kompilátory hlavně ML64 při kompilaci zhruba z 10 pokusů 2 pokusy vyvolaly chybové hlášení "neznámá chyba při kompilaci", program se zasekl a musel být zastaven ve správci úloh. Spojil jsem se autorem panem Ramonem Salou, ten mi potvrdil tuto skutečnost. Pro můj PC nejlépe vyhovoval pro x86 i x64 kompilátor JWasm. Proto se ve svém článku budu zabývat nastavením Easy Code pro tento kompilátor. Později jsem testy prováděl i na PC, kde byly jiné procesory, a neshledal jsem žádné chyby.

Úplný popis a nastavení je zde, budu se držet nastavení pro kompilátor a linker JWasm.

Nastavení pro Windows 8.1 /10

Pokud kopírujeme soubory nebo instalujeme programy do systémové složky na disku C: u těchto dvou verzí systému Windows, systém změní oprávnění až po restartování počítače. Windows 8.1 / 10 změní oprávnění k zápisu do této složky a všech jejích podsložek a souborů. Jedná se o součást rozšířených bezpečnostních opatření těchto dvou operačních systémů, ale je to překážka pro programy, které zapisují data do konfiguračních souborů a jiných typů dokumentů. Složka, kde budeme ukládat projekty, by neměla být jen na disku C:. Pokud používáme disk C: (máme pouze jeden disk v počítači), můžete nastavit vlastnosti souboru EasyCode.exe „Spustit jako správce“ nebo přesunout složku „EasyCode“ na C:\Users\<Username>\AppData\EasyCode, kde mají všechny aplikace oprávnění k zápisu a upravují konfigurační soubory podle nové cesty.

Pokud máte 128bitové šifrování ve vaší skupinové politice, může to znamenat, že některé 64bitové spustitelné soubory nelze spustit a kód Easy se uzavře. Máte-li problémy Spuštění souborů 64-bit v souvislosti s projektem generaci (překladač, linker a kompilátor zdrojů a knihoven), nastavte vlastnosti všech dotčených souborů, které mají být spuštěny s právy správce.

V dalším díle, Assembler x86 a x64 - Seznámení a nastavení, budeme pokračovat v možnostech a nastavení EasyCode Visual assembleru v.2.02.0.0007.


 

 

Článek pro vás napsal zpavlu
Avatar
Jak se ti líbí článek?
1 hlasů
C# , C++ a assembler
Miniatura
Všechny články v sekci
Assembler
Aktivity (2)

 

 

Komentáře

Avatar
Robert Michalovič:1. března 6:40

Dobrý den

Přiznám se, že toto je oblast o které bych se rád více dozvěděl. Takže pokud můžete, napište spoustu dílů . Nicméně trochu se ve vašem popisu ztrácím. Pro začátek mám pár dotazů.

  1. Takže seriál článků bude s IDE Easy Code Visual Assembler ?
  2. A jaký tedy assembler bude použit v seriálu? NASM,MASM, nebo JWasm apod..
  3. Dané IDE daný assembler(kom­pilátor/linker) má v sobě nebo si jej budu muset stáhnout zvlášť ?
  4. Uděláte vzorový příklad typu "Hallo World" ? pro konzoly a i pro GUI ?
  5. Máte v plánu v nějaké díle objasnit podrobněji rozdíly mezi assemblery ( GoASM,HLA,JWas­m,PoASM,RosAS­M,Sol_ASM,Yas­m, MASM,NASM,FAS­M,TASM,GAS,QAS­M,WASM)? V čem se mezi sebou vůbec liší?
  6. Existuje vůbec nějaká specifikace standardu pro Assembler ? (něco podobného jako je ISO/IEC 9899:1999 pro jazyk C )
  7. U vyšších programovacích jazyků na internetu existuje API(seznam dostupných objektů a metod), pro assembler pro daný processor ( např .pro PC intel, amd) by měl pravděpodobně seznam instrukčních sad + instrukcí s jejich popisem. Kde se to dá nalézt?

Snad vás seznam dotazů nevyděsil.

 
Odpovědět  +1 1. března 6:40
Avatar
zpavlu
Redaktor
Avatar
Odpovídá na Robert Michalovič
zpavlu:1. března 11:36
  • Budu používat Easy Code 2. jako důvod, že pracuje také jak na X86, tak i na X64 a dokáže pracovat i s instrukcemi AVX.
  • Co se týká druhého bodu NASM, MASM a podobně pracují dobře na X86, jsou zastaralé, pokud bude pracovat někdo jen s X86 možno používat Easy Code 1 nobo Easy Code Masm linker ML32.
  • Kompilátor a linker je možno použít ASM, FASM,GOASM, JWASM, USM, MASM32, MASM64, POASM, POASM64, SOLASM. Příkladů bude dost. Pro windows 10 nejlépe pracova JWASM.
  • To nevím, myslím, že to bude Intel.
  • Co se týká API je to bída, dá se použít na příklad uvedený zde, budu se tímto dosti podrobně zabývat.
  • Původně jsem chtěl psát pouze o X64, bohužel je to dosti složitá tématika i když se snažím být co nejstručnější je to obrovský balík co musím psát, dílů je dost.
Odpovědět 1. března 11:36
PZ
Avatar
zpavlu
Redaktor
Avatar
Odpovídá na Robert Michalovič
zpavlu:1. března 12:11

příklad "Hallo World"

.Const

.Data?
        inbuf           DB 100 Dup (?)

.Data
        Msg0            DB      000AH, 0DH, 0DH, 0

hInst           HINSTANCE       NULL


.Code

start:
        Invoke GetModuleHandle, NULL
        Mov hInst, Eax
        ;=====================
        ; Write your code here
        ;=====================
        Invoke StdOut, Addr Msg0
        Invoke StdOut, TextStr("Hallo World", 000AH, 0DH)
        Invoke StdIn, Addr inbuf, LengthOf inbuf
        Invoke ExitProcess, 0
End start
Odpovědět 1. března 12:11
PZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.