X86 jazyk symbolických instrukcí
| Tabulka s obsahem |
| 1 x86 PC shromážděná konzultace 2 základní informace 3 shromáždění v reálném režimu 4 chráněný režim |
Toto je průvodce, ne kompletní vědecký popis jak x86 procesor pracuje.
Tento text je určen pro ty kdo chtít získat nahlédnutí do programovacího skutečného jazyka symbolických instrukcí. Protože x86 procesory jsou tak obyčejné, většina z vás by měla být schopná sestavit většinu z kódu, který vy najdete v tomto průvodci u vašeho vlastního počítače.
Tento průvodce používá standard Intel syntax, ne u a T; syntax ve kterém většina linuxových shromážděných programů je psán. Všichni kód v tomto průvodci je určen pro obyčejné PC počítače!
Jestliže vy chcete sestavit kód, který vy najdete v tady vy budete muset stáhnout volné netwide assembler (NASM). Stáhnout to od této internetové stránky:
Čtěte o hexadecimálních číslech pro větší pochopení tohoto průvodce.
Tam jsou hlavně dva různé režimy ve kterém x86 procesor může pracovat: reálný režim a chráněný režim. Protože potřeby zpětné kompatibility, procesor vždy začne v reálném režimu. Téměř všechny moderní operační systémy pracují v chráněném režimu. AMD64 procesory přidají další režim, dlouhý režim.
Tento průvodce bude začínat krátkým úvodem ke shromáždění reálného režimu a pak pokračovat s větší chráněnou režimovou sekcí. Shromáždění v reálném režimu
Tam je několik 16-ti bitového procesoru registry to být obyčejně používán průměrným aplikačním programátorem. Každý registr je specializovaný pro jednu věc a operace, které se zabývají tou věcí jsou často menší jestliže pravý registr je používán (menší kód běží rychleji). Tady být nejvíce použité registry v reálném režimu:
data registrují sekyru, akumulátor BX, základ registrovat CX, pult registrovat DX, registr datVšechny čtyři datové registry mají 8-kousl verze. Jsou tam dva 8-kousek registruje “vnitřek” každý 16-ti bitový registr. ZH pro vysoce 8 kousků, a ZL pro minimum 8 kousků, kde Z je první dopis v 16-ti bitovém registru. Příklad: AH je 8-kousl registr, který obsahuje stejné kousky jak vysoce 8 kousků v sekyře.adresa registruje Sie, zdroj registrovat Di, cíl registrovat SP, ukazatel zásobníku registrovat BP, základ hromady registr ukazatele
CL je registr, který obsahuje minimum 8 kousků CX.
AH, Al, BH, BL, CH, CL, DH a DL.Kolektivně data a registry adresy jsou nazýváni obecnými registry.
segmentové registry (ne díl 8 generála se registruje) CS, segment kódu registrovat DS, segment dat registrovat ES, zvláštní část registrovat FS, další zvláštní segmentový registr (ne splnil dříve 80386) GS, ještě jeden zvláštní segmentový registr (ne splnil dříve 80386) SS, zásobníkový segmentový registrIP registr směřuje k kde procesor současně vykoná kód (tj. kde v programu procesor “je”.) IP registr nemůže být zpřístupňován programátorem přímo.jiné registry (ne díl 8 generála se registruje) IP, instrukční ukazatelový registr ochabne, příznakový registr
Registr příznaků obsahuje aktuální stav procesoru. Každý kousek v tomto registru je nazýván příznakem. Každý příznak může být jeden 1 nebo 0, soubor nebo ne soubor. Některé ty vlajky že registr příznaků obsahuje je vysílat, přetékat, nulový a jeden krok. Příznaky jsou často zvyklé na kontrolu prováděcí tok programu. “jestliže = B pak = C” a jako vyžaduje použití příznaků-registr.
Mnemotechnické pomůcky používané v reálném režimu x86-shromáždění
To jsou:
aaa, aad, aam, aas, adc, sčítat, a, hovor, cbw, clc, cld, cli, cmc, cmp, cmpsb, cmpsw, cwd, daa, das, dec, div, únik, hlt, idiv, imul, v, inc, int, do, iret, ja, jae, jb, jbe, jc, jcxz, je, jg, jge, jl, jle, jmp, jna, jnae, jnb, jnbe, jnc, jne, jng, jnge, jnl, jnle, jno, jnp, jns, jnz, jo, jp, jpe, jpo, js, jz, lahf, lds, lea, les, zámek, lodsb, lodsw, smyčka, loope, loopne, loopnz, loopz, mov, movsb, movsw, mul, neg, nop, ne, nebo, ven, pop, popf, tlak, tlak, puchf, rcl, rcr, obchodní cestující, repe, repne, repnz, repz, ret, rol, ror, sahf, sal, sar, sbb, scasb, scasw, shl, shr, stc, std, sti, stosb, stosw, náhradník, test, vyčkávání, xchg, xlat, xor
(kopírovaný od IA-32)
Vy budete nikdy používat většinu z těchto kódů. Kliknout na je číst více o nich.
Toto je docela jednoduché, ale ještě hodně nenáviděl obyčejnými programátory. To používá dva registry k důvodu k jedné adrese: jeden segmentový registr a jeden vyrovnal registr. Nějaké obecné užití se registruje (vidět nahoře) mohl být používán jak vyrovnaný.
Segmentový registr je posunul 4 zbylé kousky a pak se přidal k vyrovnanému registru. Rovnice vypadá jako toto: segment * 0x10 + vyrovnaný.
Například, jestliže DS obsahuje hexadecimální číslo 0xDEAD a DX obsahuje číslo 0xCAFE oni by spolu ukázali na adresu paměti 0xDEAD * 0x10 + 0xCAFE = 0xEB5CE jeden rychlý způsob, jak dělat toto bez hexadecimální kalkulačka by byla jen přidat nulu k hexadecimálnímu číslu v registru části a pak přidat obsah vyrovnaného registru k tomu číslu. Nahoře by 0xDEAD0 + 0xCAFE, který jde docela snadno vypočítat v hlavě: -)
Obvykle, dva registry (segment - a vyrovnaný-registr) být psán jako toto ukazovat, že oni spolu ukážou na nějakou adresu paměti: segment-registr: vyrovnaný-registr. Například: DS: DX, CS: IP, SS: SP, DS: Si a ES: Di.
Tam jsou některé speciální kombinace segmentových registrů a generál vyjadřuje to ukázat na zajímavé věci:
CS: IP ukáže na adresu kde procesor zaběhne pro jeho příští bajt kódu. SS: SP směřuje k umístění poslední položky tlačené na hromadě. DS: Si je často zvyklý na důvod k datům, která mají být kopírována k ES: Di
PC pamětové rozložení
0-3FF IVT (stůl vektoru přerušení) 400-5FF BDA (Biosová data oblast) 600-9FFFF obyčejná aplikace RAMTo znamená, že my jsme 640kB RAM aplikace..
Všechno nahoře 0xFFFFF je nazýván “vysokou pamětovou oblastí”.
Přerušení je co to zní jako. Tam jsou dva druhy přerušení, software - a hardware-přerušení. Typické softwarové přerušení je (v reálném režimu) přerušení 0x21 (ISR to se ovládá toto přerušení dostane číslo funkce a všechny parametry od programu a pak to vykoná vybraný DOS-fungovat) a int3 (zarážka, často použitý zadat nějaký druh softwaru-debugger). Typické hardwarové přerušení bylo by, když nějaký vnější obvod rozhodne to to potřebovat pozornost od procesoru, jako když systémové hodiny tikají, to odjistí 0x01 přerušení.
U samého začátku lží paměti vektor přerušení předložit (IVT). IVT obsahuje ukazatele na všechny přerušovací servisní rutiny (ISR je).
Ukazatele k různý ISR je zapojen k přerušením být uložen v tomto formátu:
[vyrovnaný _ 0] [segment _ 0] [vyrovnaný _ 1] [segment _ 1] [......] [vyrovnaný _ 255] [segment _ 255] (každé celé číslo (to je: vyrovnaný nebo segment-ukazatele) je 16 kousků široký)Je jich tam 256 různá přerušení, každý s jeho vlastním ukazatelem.
[ORG 0x100] [kousky 16] installISR jmp; * * * * * * * * * * * * * * * * * * * * * * * ISRstart: cli; vyřadit přerušení sekyra tlaku; ukládat všechny registry tak to žádné upozornění tlačí se ds; naše přítomnost. di tlaku mov sekyru, 0xb800; směřovat k textu-video-mov paměti ds, sekyra xor di, di loop1: al mov, [ds: di]; kontrola jeden dopis cmp al, “t”; bylo to “t”? hledání jne; jestliže ne, hledání toho... al mov, [ds: di + 2]; kontrola další dopis cmp al, “h”; bylo to “h”? hledání jne; jestliže ne, hledání toho... al mov, [ds: di + 4]; kontrola cmp posledního písmena al, “e”; jestliže jeho “e”? hledání jne; jestliže ne, hledání toho...; jestliže my jsme tady, my jsme objevili “#rquoteSe shromáždit s “nasm název souboru - o filename.com”. (vidět NASM); nahradit “#rquote s “= O)” al mov, “=” mov [ds: di], al; nahradit “t” s “=” al mov, “O” mov [ds: di + 2], al; nahradit “h” s “o” al mov,”)” mov [ds: di + 4], al; a konečně nahradit “e” s”)” jmp loop1; je tam některý více “#rquote? konec: di popa; vrátit všem registrům ds popa; a žádný všimne si naší přítomnosti!;) popová sekyra sti; a reenable iret přerušení; a návrat ke kterémukoliv misc. aktivita; počítač dělal.. hledat: cmp di, 0x1f40; my jsme hledali všechny dopisy? jae konec; ano: přestat hledat! přidat di, 2; ne: vybrat příští dopis a vrátit jmp loop1; k objevit-více - ““- bodá-procedura ISRend: ISRlen EQU ISRend-ISRstart; * * * * * * * * * * * * * * * * * * * * * * * installISR: xor zruší, mov sekyry es, sekyra; es = 0 di mov, 0x70; 0:00 70 (INT 0x1C vyrovnají) mov sekyra, ISRstart; dostat náš začátek-IP mov [es: di], sekyra; psát to IVT přerušovacímu ukazateli pro 0x1C mov di, 0x72; 0:00 72 (INT 0x1C segment) mov sekyra, cs; sehnat našemu kódu mov segmentu [es: di], sekyra; psát to IVT přerušovacímu segmentu pro 0x1C mov sekyru, 0x3100; výběrový DOS-fungovat “TSR _ instalovat”, errorcode 0. dx mov, ds; když program začne, DS = PSP int 0x21; dělat DOS rezervovat kus kódu a vystupovat zpět k shellu.; tady, počítač bude pokračovat pracovat jako jestliže nic se stalo..; ale snažit se psát “#rquote kdekoli na obrazovce = O)... to nepracuje.; * * * * * * * * * * * * * * * * * * * * * * *
Chráněný režim je režim ve kterém nejmodernější operační systémy provozují jejich kód. Když počítač zavede, to nejprve zadá reálný režim; operační systém je zodpovědný za přepínání do chráněného režimu.
80286 procesoru přece mělo 16-ti bitový chráněný režim. To je historického zájmu jen. My budeme se soustředit na 32 bitový chráněný režim, objevil na 80386 procesorech a všichni jeho nástupcové.
Tam jsou nové registry v chráněném režimu:
Všechny registry obecného užití (sekyra, BX, CX, DX, Si, Di, SP a BP) být rozšířil se do úhrnu 32 kousků. Ukazovat, že vy míníte 32 bitový registr místo toho minima 16-ti bitová část, sčítat E před jménem registru..
EAX, EBX, ECX, EDX, ESI, Edi, ESP a EBPSegmentové registry zůstanou 16 kousky široký a nezmění jména.
CS, DS, ES, FS, GS a SSSegmentové registry nepracují jako oni oddělali reálný režim. Místo toho, oni jsou zvyklí na bod ven selector v tabulce směřoval k GDTR - nebo LDTR-registr.
Příznaky - a IP-registry jsou také rozšířeny k 32 kouskům.
EIP, EFLAGSTam jsou také nové registry. Oni jsou užiteční jen k programátorům systému.
CR0, CR2, CR3, CR4, GDTR, LDTR, IDTR, TR..Oni jsou používáni operačním systémem a moci ne být zpřístupňován obyčejnými uživatelskými programy.
Tam být také některé jiné registry, jako registry testu, ladit registry, MMX, MSR, XMM a jiní.
Jak přejít na chráněný režim:
* načíst GDTR s ukazatelem na GDT-stůl. * načíst IDTR s ukazatelem na IDT Nebo dissable přerušení. * dal PE-kousek v CR0-registr. * dělat daleký skok ke 32 bitovému kódu. * inicializovat TR s selector platný TSS. * nepovinný: načíst LDTR s ukazatelem na LDT-stůl.
SNAFU (systém normální, všichni F * cked nahoru) je operační systém zapsané x86-shromáždění. To docela jasně ukáže se jak operační systém pracuje na velmi základní úrovni. SNAFU je vydáván jako Veřejná doména.
Menuet je také operační systém zapsané čisté x86-shromáždění. To je větší než SNAFU a téměř opustil fázi vývoje. Menuet OS je distribuován pod GNU veřejnou licencí. http://www.menuetos.org