x86 асемблерски језик је фамилија уназад-компатибилних асемблерских језика, који дају одређени ниво компатибилности све до Интел 8008. x86 асемблерски језици се користе за прављење објектног кода за процесоре из класе x86. Као и сви асемблерски језици, користи кратку мнемотехнику за репрезентовање основних инструкција које ЦПЈ може да може да разуме и прати. Компајлери понекад праве асемблерски код при преводу асемблерских језика у машински језик. Асемблерски језик се сматра програмским језиком, и он је машински специфичан и језик ниског нивоа. Овај језик се користи за мале уграђене системе у реалном времену, или језгра оперативних система.
Историја Интел 8088 и 8086 су били први процесори који су имали x86 скуп инструкција. Ови 16-битни процесори су били еволуција претходне генерације 8-битних процесора од којих су наследили многе карактеристике и инструкције, који су проширени за 16-битну еру. 8088 и 8086 су користили 20-битну адресну магистралу и 16-битне унутрашње регистре, али 8086 је имао 16-битну магистралу за податке, а 8088 8-битни. x86 асемблерски језик подржава разне верзије које су пратиле ове, од Интелових 80188, 80186, 80286, 80386,80486, Pentium, Pentium Pro, и тако даље, као и АМД и Сајриксове 5x86 и K6 процесоре и НЕЦ В20. Термин x86 односи се на ЦПД који може да ради на оригиналном асемблерском језику.
Модерни x86 инструцкијски скуп је надскуп 8086 скупа инструкција и серија екстензија овом скупу инструкција које је почело са Интел 8080 процесором. Скоро потпуна бинарна компатибилност уназад постоји између Интел 8086 чипа и свих чипова до тренутне генерације x86 процесора. У пракси је нормално да се користе инструкције које ће радити на било чему после Интел 80386 или Пентијума, мада су у задњим годинама разни оперативни системи почели да захтевају модерније процесоре или бар да подржавају новије екстензије за инструкцијски скуп.
Мнемотехника и операциони кодови Свака x86 монтажна инструкција је представљена мнемотехником која комбинована са једним или више операнада, може да се претвори у један или више операционих кодова (опкода). НОП команда се преводи у 0x90, а ХЛТ инструкција се преводи у 0xF4.
Синстакса x86 асемблерски језик има две главне бранше синтакси: Интел синтакса и АТиТ синтакса. Интел синтакса је домнантна у ДОС-у и Microsoft Windows свету, а АТиТ је доминантна у Јуникс свету, пошто је створена у АТиТ Беловим лабораторији. Овде је преглед главних разлика између Интел и АТиТ синтакси:
АТиТ Интел редослед параметара Извор пре одредишта
eax := 5 је mov $5, %eax Одредиште пре извора
eax := 5 је mov eax, 5 Величина параметра На мнемотехнику се ставља суфикс са писмом које индијује величину операнада ("q" за qword, "l" за long (dword), "w" за word, и "b" за бајт)
addl $4, %esp Изведено из имена регистра који се користи (rax, eax, ax, al имплицирају q,l,w,b тим редом)
add esp, 4 Сигили тренутне вредности Са префиксом "$", и регистри морају имати префикс "%" Асемблер аутоматски детектује тип симбола, да ли су регистри, константе, или нешто друго. Ефективне адресе Генерална синтакса DISP(BASE,INDEX,SCALE)
Пример:
movl mem_location(%ebx,%ecx,4), %eax Користе промењиве, и морају да буду у угластим заградама; додатно, величинске речи као byte, word, или dword морају бити коришћени. Пример: mov eax, dword [ebx + ecx*4 + mem_location]
Многи x86 асембелри користе Интел синтаксу, укључујући МАСМ, ТАСМ, НАСМ, ФАСМ, и ЈАСМ. ГАС је подржавао обе синтаксе под .интел_синтакс директивом.
Регистри x86 процесори имају колекцију регистара која је дозвољена за складиштење бинарних података. Заједно се подаци и адресни регистри зову генерални регистри. Сваки регистар има специјалну примену. AX множење-дељење, вађење и чување стринга CX бројач за операције над стрингом DX порт адреса за IN и OUT BX регистар индекса за MOVE SP показју на врх стека BP показује на базу стека SI покзује на извор у стрим операцијама DI показује на дестинацију у стрим операцијама Заједно са генералним регистрима, ту су обично и: ИП инструкциони показивач Заставе Сегментни регистри (CS, DS, ES, FS, GS, SS) који одређују где 64к сегмент почиње (нема FS и GS у 80286 и ранијим) Додатни екстензиони регистри (MMX, 3DNow!, SSE, итд.) (само Пентијум и каснији). ИП регистар показује на меморијски офсет следеће инструкције у кодном сегменту (показује на први бајт инструкције). Програмер не може приступити ИП регистру директно. x86 регистри се могу користити применом MOV инструкција. На пример: mov ax, 1234h mov bx, ax копира вредност 1234h (4660d) у регистар AX и онда копира вредност AX регистра у BX регистар (Интелова синтакса). Сегмнетнтно адресирање x86 архитектура у реалном и виртуелном 8086 режиму користи процес који се зове сегментација за адресирање меморије, а не равни меморијски модел који се користи у разним другим окружењима. Сегментација се састоји из компоновања меморијске адресе из два дела, сегмента и офсета. Сегмент показује на почетак групе од 64 kB адреса и офсет одређује колико је отакле удаљена жељена адреса. У сегментном адресирању, два регустра су потребна за комплетирање меморијске адресе: један да држи сегмент, а други да држи офсет. Да би се ово превело на равни меморијски модел, сегментна вредност је померена за 4 бита улево (еквавилентно множењу са 16) и онда додато на офсет да се направи цела адреса, што дозвољава ломљење 64к баријере кроз паметан избор адреса, иако то чини програмирање комплекснијим.
У реалном (заштићеном) режиму, ако DS садржи хексадецималну вредност 0xDEAD и DX садржи број 0xCAFE они би заједно показивали на адресу 0xDEAD * 0x10 + 0xCAFE = 0xEB5CE. Стога, ЦПЈ може адресирати до 1.048.576 бајтова (1 MB) у реалном режиму. Мешајући сегментну и офсет вредност налазимо 20-битну адресу.
Оригинални IBM ПЦ је забрањивао програме веће од 640 kB али проширена меморијска спецификација је коришћена за спровођење банке прекидачке шеме која се није користила када су каснији оперативни системи као што је Windows, користили веће адресне опсеге новијих процесора и спровели своје шеме виртуелне меморије.
Заштићени режим је започео са Интелом 80286. Неколико недостатака, као што је немогућност приступу БИОС-у и немогућност за враћањем на реални режим без ресетовања процесора су онемогућили широко коришћење. 80286 је такође био ограничен на адресну меморију у 16-битним сегментима, што значи да се може адресирати само 64 kB меморије одједном. За приступ проширеној функционалности 80286 процесор би поставио процесор у заштићени режим, што би омогућило 24-битно адресирање и 16 MB меморије.
У заштићеном режиму, сегментни селектор се може раставити на три дела: 13-битни индекс, индикатор табле који одређује да ли је улаз у GDT или LDT и двобитни Requested Privilege Level.
Када се говори о адреси са сегментом, и офсетирању нотације сегмента, офсет се користи, па се у горњем примеру равна адреса 0xEB5CE може написати као 0xDEAD:0xCAFE или као сегмент и офсет регистрованог пара; DS:DX.
Постоје специјалне комбинације сегментних регистара и генералних регистара које показују на битне адресе: CS:IP (CS је Code Segment, IP је Instruction Pointer) показује на адресу са које ће процесор узети следећи кодни бајт. SS:SP (SS је Stack Segment, SP је Stack Pointer) показује на адресу врха стека, односно на последњи стављен бајт. DS:SI (DS је Data Segment, SI је Source Index) је често коришћен за показивање на стринг податке који се требају копирати на ES:DI. ES:DI (ES је Extra Segment, DI је Destination Index) је често коришћен за показивање на одредиште за копирање стринга, као што је наведено горе. Интел 80386 има три оперативна режима: реални, заштићени и виртуелни режим. Заштићени режим, који је први пут био у 80286 је проширен за допуштање да 80386 адресира до 4 GB меморије, потпуно нови 8086 режим (VM86) је омогућио покретање једног или више реално-режимних програма у заштићеном окружењу које је емулирало реални режим, иако неку програми нису били компатибилни (типично због трикова у вези са адресирањем меморије или коришћењем неспецифираних опкодова).
Проширење заштићеног режима 32-битног равног меморијског модела 80386-ице је можда најбитнија промена у фамилији x86 процесора све док АМД није избацио x86-64 у 2003, пошто је помогло велико примање Windows-а 3.1 (који се ослањао на заштићени режим) пошто је Windows сада могао да покреће више апликација одједном, укључујући ДОС алпикцаије, коришћењем виртуелне меморије и простог мултитаскинга. Режими извршавања x86 процесори подржавају пет режима операција за x86 код, Реални режим, Заштићени режим, Дуги режим, Виртуелни 86 режим, и Режим за системски менаџмент, у ком су неке инструкције доступне а неке нису. 16-битни подскуп инструкција је доступан у реалном режиму (сви x86 процесори), 16-битни заштићени режим (80286 па надаље), V86 режим (80386 па надаље) и SMM (Интел i386SL, i486 и каснији). У 32-битном заштићеном режиму (Интел 80386 па надаље), 32-битне инструкције (укључукући каснија проширења) су такође доступни; у дугом режиму (АМД Оптерон па надаље), 64-битне инструкције, и више регистара су такође доступни. Инструкциони скуп је у сваком режима али мморијско адресирање и величина речи варирају, што захтева другачије програмерске стратегије.
Режими у којима се x86 код може извршити су: Реални режим (16-битни) Заштићени режим (16-битни и 32-битни) Дуги режим (64-битни) Виртуелни 8086 режим (16-битни) Режим за менаџмент система (16-битни)
Прекидачки режими Процесор улази у реални режим одмах након паљења, тако да оперативни систем или неки други програм морају експлицитно да га промене на други режим ако жели да ради у било чему осим у реалном режиму. Прекидачки режими су омогућени модификацијом одређених битова процесорских контролних регистра иако је нека припрема неопходна у највећем броју случајева, и неко чишћење после мењања.
Типови инструкција Генерално, функције модерног x86 скупа инструкција су: Компактно кодирање Промењива дужина и сврставање су независни (кодирани као мали ендиан, као и сви подаци у x86 архитектури) Угланом једноадресне или двоадресне инструкције, односно први опреранд је и дестинација. Меморијски операнди и као извор и као дестинација су подржани (често коришћени за читање и писање стек елемената адресираних помоћу малих тренутних офсета). И генерално и имплицитно коришћење регистара. Иако су свих седам генералних регистара у 32-битном режиму, и свих 15 генералних регистара у 64-битном режим се могу користити као алумулатори или за адресирање, већина њих је имплицитно коришћена за специјалне инструкције. Погођени регистри онда морају да буду сачувани. Прави кондиционе флегове имплицитно кроз већину АЛУ инструкција. Подржава разне адресионе режиме укључујући тренутне, офсет, и скалирани индекс але не ПЦ-релативни, осим за џампове (уведеним као побољшање у x86-64 архитектури). Садржи покретни зарез за стек регистара. Садржи специјалну подршку за атомски читај-модификуј-пиши инстукције xchg, cmpxchg/cmpxchg8b, xadd, и инструкције целог броја које комбинују са lock префиксом). СИМД инструкције (инструкције које извршавају паралелне истовремене појединачне инструкције на много операнада кодирани у суседним ћелијама ширих регистара).
Инструкције за стек x86 архитектура има хадрверску подршку за извршавање стек механизма. Инструкције попут push, pop, call и ret се користе са стеком да алоцирају простор за локалне податке и да чувају и враћају call-return тачке. ret инструкцијаје веома корисна за имплементирање просторно ефикасних и брзих конвенција позивања где је позивани одговоран за враћање стек простора.
Када се поставља стек фрејм да чува локалне податке или рекурзивну процедуру постоји неколико избора. Инструкција на високом нивоу enter узима procedure-nesting-depth аргумент као и local size аргумент, и може да буде бржа од експлицитнијих манипулација регистрима. Да ли је бржа или не зависи од x86 имплементације, као и од конвенције позивања и кода потребном да ради на више процесора.